Dans SQL Server, vous pouvez chiffrer une procédure stockée au moment où vous la créez, ou vous pouvez la modifier ultérieurement pour inclure le chiffrement.
Pour créer une procédure stockée avec T-SQL, vous utilisez le CREATE PROCEDURE
syntaxe. Pour le chiffrer, vous ajoutez le WITH ENCRYPTION
arguments.
Vous pouvez également utiliser le même argument pour chiffrer une procédure existante lors de l'utilisation de ALTER PROCEDURE
.
Lorsque vous cryptez une procédure stockée de cette manière, le texte de la procédure est converti dans un format obscurci. Sa définition n'est pas directement visible dans les vues du catalogue. Par conséquent, la définition de la procédure 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 - Créer une procédure stockée chiffrée
Voici un exemple de création d'une procédure stockée chiffrée.
CREATE PROCEDURE dbo.usp_GetCatsByName @catname varchar(70) WITH ENCRYPTION AS 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.
Exemple 2 - Afficher le résultat
Après avoir créé cette procédure, maintenant quand j'utilise le sp_helptext
procédure stockée pour voir la définition de la procédure Je reçois un message m'indiquant qu'elle est chiffrée.
EXEC sp_helptext 'usp_GetCatsByName';
Résultat :
The text for object 'usp_GetCatsByName' is encrypted.
Et si j'utilise le sys.sql_modules
vue du catalogue système, j'obtiens NULL.
SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('dbo.usp_GetCatsByName');
Résultat :
+--------------+ | definition | |--------------| | NULL | +--------------+
J'obtiens un résultat similaire, quelle que soit la méthode T-SQL que j'utilise pour essayer d'obtenir la définition de la procédure.
Et voici le message d'erreur que j'obtiens dans Azure Data Studio lorsque j'essaie de scripter la procédure :
No script was returned when scripting as Create on object StoredProcedure
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 3 – Ajouter un chiffrement à une procédure stockée existante
Si vous souhaitez chiffrer une procédure stockée existante, utilisez ALTER PROCEDURE
avec la même définition. En d'autres termes, je peux prendre le premier exemple et remplacer CREATE
avec ALTER
.
ALTER PROCEDURE dbo.usp_GetCatsByName @catname varchar(70) WITH ENCRYPTION AS SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @catname; GO
Cela suppose évidemment que le reste de la définition de la procédure est exactement la même que celle 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 procédure 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 4 - Supprimer le chiffrement d'une procédure stockée
Nous pouvons supprimer le chiffrement en exécutant la ALTER PROCEDURE
déclaration sans l'option de cryptage.
ALTER PROCEDURE dbo.usp_GetCatsByName @catname varchar(70) AS SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @catname;
Notez que ce n'est pas la même chose que de déchiffrer la procédure stockée. Ici, nous modifions simplement la procédure existante à la nouvelle définition. Il suppose donc que vous avez déjà une copie de la procédure existante quelque part dans votre contrôle de code source.
Exemple 5 – Procédures stockées compilées en mode natif
Le chiffrement n'est pas pris en charge sur les procédures stockées compilées en mode natif.
Voici ce qui se passe lorsque j'essaie de chiffrer une procédure stockée compilée en mode natif :
ALTER PROCEDURE [dbo].[usp_GetCowsByName] @cowname varchar(70) WITH SCHEMABINDING, NATIVE_COMPILATION, ENCRYPTION AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english' ) SELECT CowId, CowName, Phone FROM dbo.Cows WHERE CowName = @cowname END;
Résultat :
Msg 10794, Level 16, State 17, Procedure usp_GetCowsByName, Line 3 The option 'ENCRYPTION' is not supported with natively compiled modules.
Cet exemple de procédure est tiré de mon article, Comment créer une procédure stockée liée au schéma dans SQL Server, qui explique également que vous ne pouvez pas non plus lier au schéma une procédure stockée si ce n'est pas une procédure compilée en mode natif.
Remarques importantes
Voici quelques éléments à connaître sur le chiffrement des procédures stockées 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 de la procédure stockée (non chiffrée).
- 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 procédure dans le cadre de la réplication SQL Server.
- Les procédures CLR ne peuvent pas être chiffrées.
- Les procédures compilées en mode natif ne peuvent pas être chiffrées.