Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment chiffrer une fonction définie par l'utilisateur dans SQL Server

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.