Lors de la création d'une fonction définie par l'utilisateur dans SQL Server, vous avez la possibilité de la chiffrer.
Pour créer une fonction définie par l'utilisateur avec T-SQL, vous utilisez le CREATE FUNCTION
syntaxe. Pour le chiffrer, vous ajoutez le WITH ENCRYPTION
arguments.
Vous pouvez également utiliser le même argument pour chiffrer une fonction existante lors de l'utilisation de ALTER FUNCTION
.
Lorsque vous cryptez une fonction définie par l'utilisateur de cette manière, le texte de la fonction est converti dans un format obscurci. La définition de la fonction n'est directement visible dans aucune vue du catalogue. Par conséquent, la définition de la fonction ne peut pas être visualisée par les utilisateurs qui n'ont pas accès aux tables système ou aux fichiers de base de données.
Exemple 1 – Fonction de table en ligne avec chiffrement
Voici un exemple de création d'une fonction table chiffrée définie par l'utilisateur.
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE WITH ENCRYPTION AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
La partie pour le crypter est WITH ENCRYPTION
. Je pourrais simplement supprimer cet argument si je ne voulais pas le chiffrer.
Après avoir créé cette fonction, maintenant quand j'utilise le sys.sql_modules
vue du catalogue système pour voir sa définition, j'obtiens NULL.
SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
Résultat :
+--------------+ | definition | |--------------| | NULL | +--------------+
Et voici le message d'erreur que j'obtiens dans Azure Data Studio lorsque j'essaie de scripter la fonction :
No script was returned when scripting as Create on object UserDefinedFunction
Et j'obtiendrais un message similaire si j'essayais de l'afficher dans SSMS, DBeaver ou tout autre logiciel de gestion de base de données GUI.
Exemple 2 – Fonction table multi-instructions avec chiffrement
Voici une TVF multi-instructions qui fait la même chose que la fonction précédente. Les TVF multi-instructions ont une syntaxe différente des TVF en ligne. Sur les TVF multi-instructions, vous mettez l'option de chiffrement après avoir spécifié la variable de retour.
CREATE FUNCTION [dbo].[udf_CatsByName_MSTVF]( @CatName varchar(70) ) RETURNS @cats TABLE ( CatId int, CatName varchar(70), Phone varchar(10) ) WITH ENCRYPTION AS BEGIN INSERT INTO @cats SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName; RETURN; END; GO
Exemple 3 - Fonction scalaire avec chiffrement
Et voici un exemple de fonction scalaire chiffrée :
CREATE FUNCTION dbo.discountPrice( @price DECIMAL(12,2), @discount DECIMAL(12,2) ) RETURNS DECIMAL (12,2) WITH ENCRYPTION AS BEGIN RETURN @price * (1 - @discount); END; GO
Exemple 4 - Ajouter un chiffrement à une fonction existante
Si vous souhaitez chiffrer une fonction existante, utilisez ALTER FUNCTION
avec la même définition. En d'autres termes, je peux prendre le premier exemple et remplacer CREATE
avec ALTER
.
ALTER FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE WITH ENCRYPTION AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
Cela suppose évidemment que le reste de la définition de la fonction est exactement la même que la fonction existante.
Le moyen le plus simple de vous assurer que vous utilisez la même définition consiste à utiliser votre outil graphique pour créer un script de la fonction existante à l'aide de l'option "Script as Alter", si elle existe. Sinon, vous pouvez utiliser "Script as Create", puis lorsque la définition apparaît, modifiez CREATE
avec ALTER
.
Si vous n'avez qu'une interface de ligne de commande, vous pouvez interroger le sys.sql_modules
view pour obtenir la définition existante (comme dans l'exemple précédent). Vous pouvez ensuite copier la définition et remplacer CREATE
avec ALTER
.
Une fois que vous avez fait cela, vous pouvez ajouter WITH ENCRYPTION
et relancez-le.
Exemple 5 – Ajouter plusieurs arguments
Vous pouvez spécifier plusieurs arguments sous forme de liste séparée par des virgules. Par exemple, si vous souhaitez utiliser le chiffrement et vous souhaitez spécifier la liaison de schéma, vous devez alors les ajouter sous forme de liste séparée par des virgules.
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE WITH SCHEMABINDING, ENCRYPTION AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
En d'autres termes, vous ne spécifiez que WITH
une fois - pas besoin de le répéter pour chaque argument.
Remarques importantes
Voici quelques éléments à connaître sur le chiffrement des fonctions définies par l'utilisateur dans SQL Server :
- Les utilisateurs privilégiés qui peuvent accéder aux tables système via le port DAC ou accéder directement aux fichiers de la base de données pourront toujours afficher la définition (non chiffrée) de la fonction.
- Les utilisateurs qui peuvent attacher un débogueur au processus serveur peuvent récupérer la procédure d'origine de la mémoire lors de l'exécution.
- L'utilisation du chiffrement empêche la publication de la fonction dans le cadre de la réplication SQL Server.
- Les fonctions CLR ne peuvent pas être chiffrées.