In SQL Server puoi crittografare una stored procedure al momento della creazione oppure modificarla in un secondo momento per includere la crittografia.
Per creare una procedura memorizzata con T-SQL, si utilizza CREATE PROCEDURE
sintassi. Per crittografarlo, aggiungi il WITH ENCRYPTION
argomento.
Puoi anche usare lo stesso argomento per crittografare una procedura esistente quando usi ALTER PROCEDURE
.
Quando si crittografa una procedura memorizzata in questo modo, il testo della procedura viene convertito in un formato offuscato. La sua definizione non è direttamente visibile in nessuna vista del catalogo. Pertanto, la definizione della procedura non può essere visualizzata da utenti che non hanno accesso a tabelle di sistema o file di database.
Esempio 1:creazione di una stored procedure crittografata
Ecco un esempio di creazione di una stored procedure crittografata.
CREATE PROCEDURE dbo.usp_GetCatsByName @catname varchar(70) WITH ENCRYPTION AS SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @catname; GO
La parte per la crittografia è WITH ENCRYPTION
. Potrei semplicemente rimuovere quell'argomento se non volessi crittografarlo.
Esempio 2 – Visualizza il risultato
Dopo aver creato quella procedura, ora utilizzo il sp_helptext
stored procedure per visualizzare la definizione della procedura ricevo un messaggio che mi dice che è crittografata.
EXEC sp_helptext 'usp_GetCatsByName';
Risultato:
The text for object 'usp_GetCatsByName' is encrypted.
E se uso sys.sql_modules
visualizzazione del catalogo di sistema ottengo NULL.
SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('dbo.usp_GetCatsByName');
Risultato:
+--------------+ | definition | |--------------| | NULL | +--------------+
Ottengo un risultato simile, indipendentemente dal metodo T-SQL che utilizzo per cercare di ottenere la definizione della procedura.
Ed ecco il messaggio di errore che ricevo in Azure Data Studio quando provo a eseguire lo script della procedura:
No script was returned when scripting as Create on object StoredProcedure
E otterrei un messaggio simile se provassi a visualizzarlo in SSMS, DBeaver o qualsiasi altro software di gestione del database della GUI.
Esempio 3:aggiunta della crittografia a una stored procedure esistente
Se vuoi crittografare una stored procedure esistente, usa ALTER PROCEDURE
con la stessa definizione. In altre parole, posso prendere il primo esempio e sostituire CREATE
con ALTER
.
ALTER PROCEDURE dbo.usp_GetCatsByName @catname varchar(70) WITH ENCRYPTION AS SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @catname; GO
Questo ovviamente presuppone che il resto della definizione della procedura sia esattamente la stessa di quella esistente.
Il modo più semplice per assicurarsi di utilizzare la stessa definizione è utilizzare lo strumento GUI per eseguire lo script della procedura esistente utilizzando l'opzione "Script as Alter", se esiste. Altrimenti potresti usare "Script come Crea", quindi quando appare la definizione, cambia CREATE
con ALTER
.
Se hai solo un'interfaccia a riga di comando, puoi interrogare sys.sql_modules
view per ottenere la definizione esistente (come nell'esempio precedente). Puoi quindi copiare la definizione e sostituire CREATE
con ALTER
.
Dopo averlo fatto, puoi aggiungere WITH ENCRYPTION
ed eseguilo di nuovo.
Esempio 4:rimozione della crittografia da una stored procedure
Possiamo rimuovere la crittografia eseguendo ALTER PROCEDURE
istruzione senza l'opzione di crittografia.
ALTER PROCEDURE dbo.usp_GetCatsByName @catname varchar(70) AS SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @catname;
Si noti che questo non è lo stesso che decrittografare la procedura memorizzata. Qui stiamo semplicemente modificando la procedura esistente con la nuova definizione. Quindi presuppone che tu abbia già una copia della procedura esistente da qualche parte nel tuo controllo del codice sorgente.
Esempio 5:stored procedure compilate in modo nativo
La crittografia non è supportata nelle stored procedure compilate in modo nativo.
Ecco cosa succede quando provo a crittografare una stored procedure compilata in modo nativo:
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;
Risultato:
Msg 10794, Level 16, State 17, Procedure usp_GetCowsByName, Line 3 The option 'ENCRYPTION' is not supported with natively compiled modules.
Tale procedura di esempio è tratta dal mio articolo, Come creare una stored procedure associata a uno schema in SQL Server, in cui viene spiegato anche che non è possibile collegare allo schema una stored procedure se non è una procedura compilata in modo nativo.
Note importanti
Ecco alcune cose che dovresti sapere sulla crittografia delle stored procedure in SQL Server:
- Gli utenti privilegiati che possono accedere alle tabelle di sistema tramite la porta DAC o accedere direttamente ai file del database potranno comunque visualizzare la definizione della procedura memorizzata (non crittografata).
- Gli utenti che possono collegare un debugger al processo del server possono recuperare la procedura originale dalla memoria in fase di esecuzione.
- L'uso della crittografia impedisce la pubblicazione della procedura come parte della replica di SQL Server.
- Le procedure CLR non possono essere crittografate.
- Le procedure compilate in modo nativo non possono essere crittografate.