Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So verschlüsseln Sie eine gespeicherte Prozedur in SQL Server

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.