In SQL Server können Sie eine gespeicherte Prozedur zu dem Zeitpunkt verschlüsseln, zu dem Sie sie erstellen, oder Sie können sie später ändern, um eine Verschlüsselung einzubeziehen.
Um eine gespeicherte Prozedur mit T-SQL zu erstellen, verwenden Sie die CREATE PROCEDURE
Syntax. Um es zu verschlüsseln, fügen Sie den WITH ENCRYPTION
hinzu Argument.
Sie können dasselbe Argument auch verwenden, um eine vorhandene Prozedur zu verschlüsseln, wenn Sie ALTER PROCEDURE
verwenden .
Wenn Sie eine gespeicherte Prozedur auf diese Weise verschlüsseln, wird der Text der Prozedur in ein verschleiertes Format konvertiert. Seine Definition ist in keiner Katalogansicht direkt sichtbar. Daher kann die Definition der Prozedur nicht von Benutzern angezeigt werden, die keinen Zugriff auf Systemtabellen oder Datenbankdateien haben.
Beispiel 1 – Erstellen Sie eine verschlüsselte gespeicherte Prozedur
Hier ist ein Beispiel für das Erstellen einer verschlüsselten gespeicherten Prozedur.
CREATE PROCEDURE dbo.usp_GetCatsByName @catname varchar(70) WITH ENCRYPTION AS SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @catname; GO
Der Teil zum Verschlüsseln ist WITH ENCRYPTION
. Ich könnte dieses Argument einfach entfernen, wenn ich es nicht verschlüsseln wollte.
Beispiel 2 – Ergebnis anzeigen
Nachdem ich diese Prozedur erstellt habe, verwende ich jetzt den sp_helptext
gespeicherten Prozedur, um die Definition der Prozedur anzuzeigen. Ich erhalte eine Meldung, die mir mitteilt, dass sie verschlüsselt ist.
EXEC sp_helptext 'usp_GetCatsByName';
Ergebnis:
The text for object 'usp_GetCatsByName' is encrypted.
Und wenn ich die sys.sql_modules
verwende Systemkatalogansicht erhalte ich NULL.
SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('dbo.usp_GetCatsByName');
Ergebnis:
+--------------+ | definition | |--------------| | NULL | +--------------+
Ich erhalte ein ähnliches Ergebnis, unabhängig davon, mit welcher T-SQL-Methode ich versuche, die Definition der Prozedur abzurufen.
Und hier ist die Fehlermeldung, die ich in Azure Data Studio erhalte, wenn ich versuche, die Prozedur zu skripten:
No script was returned when scripting as Create on object StoredProcedure
Und ich würde eine ähnliche Meldung erhalten, wenn ich versuchen würde, sie in SSMS, DBeaver oder einer anderen GUI-Datenbankverwaltungssoftware anzuzeigen.
Beispiel 3 – Verschlüsselung zu einer bestehenden gespeicherten Prozedur hinzufügen
Wenn Sie eine vorhandene gespeicherte Prozedur verschlüsseln möchten, verwenden Sie ALTER PROCEDURE
mit der gleichen Definition. Mit anderen Worten, ich kann das erste Beispiel nehmen und CREATE
ersetzen mit ALTER
.
ALTER PROCEDURE dbo.usp_GetCatsByName @catname varchar(70) WITH ENCRYPTION AS SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @catname; GO
Dies setzt natürlich voraus, dass der Rest der Definition der Prozedur genau mit der vorhandenen übereinstimmt.
Der einfachste Weg, um sicherzustellen, dass Sie dieselbe Definition verwenden, besteht darin, Ihr GUI-Tool zu verwenden, um die vorhandene Prozedur mit der Option „Script as Alter“ (falls vorhanden) zu skripten. Andernfalls könnten Sie „Script as Create“ verwenden und dann, wenn die Definition angezeigt wird, CREATE
ändern mit ALTER
.
Wenn Sie nur eine Befehlszeilenschnittstelle haben, können Sie die sys.sql_modules
abfragen view, um die vorhandene Definition abzurufen (wie im vorherigen Beispiel). Sie können dann die Definition kopieren und CREATE
ersetzen mit ALTER
.
Sobald Sie das getan haben, können Sie WITH ENCRYPTION
hinzufügen und führen Sie es erneut aus.
Beispiel 4 – Entfernen der Verschlüsselung aus einer gespeicherten Prozedur
Wir können die Verschlüsselung entfernen, indem wir ALTER PROCEDURE
ausführen Anweisung ohne die Verschlüsselungsoption.
ALTER PROCEDURE dbo.usp_GetCatsByName @catname varchar(70) AS SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @catname;
Beachten Sie, dass dies nicht dasselbe ist wie das Entschlüsseln der gespeicherten Prozedur. Hier ändern wir einfach das bestehende Verfahren auf die neue Definition. Es wird also davon ausgegangen, dass Sie bereits eine Kopie der vorhandenen Prozedur irgendwo in Ihrer Quellcodeverwaltung haben.
Beispiel 5 – Nativ kompilierte gespeicherte Prozeduren
Die Verschlüsselung wird für nativ kompilierte gespeicherte Prozeduren nicht unterstützt.
Folgendes passiert, wenn ich versuche, eine nativ kompilierte gespeicherte Prozedur zu verschlüsseln:
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;
Ergebnis:
Msg 10794, Level 16, State 17, Procedure usp_GetCowsByName, Line 3 The option 'ENCRYPTION' is not supported with natively compiled modules.
Diese Beispielprozedur stammt aus meinem Artikel How to Create a Schema Bound Stored Procedure in SQL Server, der auch erklärt, dass Sie eine gespeicherte Prozedur auch nicht schemagebunden können, wenn es sich nicht um eine nativ kompilierte Prozedur handelt.
Wichtige Hinweise
Hier sind einige Dinge, die Sie über das Verschlüsseln gespeicherter Prozeduren in SQL Server wissen sollten:
- Privilegierte Benutzer, die über den DAC-Port auf Systemtabellen zugreifen oder direkt auf Datenbankdateien zugreifen können, können weiterhin die Definition der gespeicherten Prozedur (nicht verschlüsselt) anzeigen.
- Benutzer, die einen Debugger an den Serverprozess anhängen können, können die ursprüngliche Prozedur zur Laufzeit aus dem Speicher abrufen.
- Die Verwendung von Verschlüsselung verhindert, dass die Prozedur als Teil der SQL Server-Replikation veröffentlicht wird.
- CLR-Prozeduren können nicht verschlüsselt werden.
- Nativ kompilierte Prozeduren können nicht verschlüsselt werden.