Beim Erstellen einer benutzerdefinierten Funktion in SQL Server haben Sie die Möglichkeit, diese zu verschlüsseln.
Um eine benutzerdefinierte Funktion mit T-SQL zu erstellen, verwenden Sie die CREATE FUNCTION
Syntax. Um es zu verschlüsseln, fügen Sie den WITH ENCRYPTION
hinzu Argument.
Sie können dasselbe Argument auch verwenden, um eine vorhandene Funktion zu verschlüsseln, wenn Sie ALTER FUNCTION
verwenden .
Wenn Sie eine benutzerdefinierte Funktion auf diese Weise verschlüsseln, wird der Text der Funktion in ein verschleiertes Format konvertiert. Die Definition der Funktion ist in keiner Katalogansicht direkt sichtbar. Daher kann die Definition der Funktion nicht von Benutzern angezeigt werden, die keinen Zugriff auf Systemtabellen oder Datenbankdateien haben.
Beispiel 1 – Inline-Tabellenwertfunktion mit Verschlüsselung
Hier ist ein Beispiel für die Erstellung einer verschlüsselten benutzerdefinierten Tabellenwertfunktion.
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
Der Teil zum Verschlüsseln ist WITH ENCRYPTION
. Ich könnte dieses Argument einfach entfernen, wenn ich es nicht verschlüsseln wollte.
Nachdem ich diese Funktion erstellt habe, verwende ich jetzt sys.sql_modules
Systemkatalogansicht, um seine Definition anzuzeigen, erhalte ich NULL.
SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
Ergebnis:
+--------------+ | definition | |--------------| | NULL | +--------------+
Und hier ist die Fehlermeldung, die ich in Azure Data Studio erhalte, wenn ich versuche, die Funktion zu skripten:
No script was returned when scripting as Create on object UserDefinedFunction
Und ich würde eine ähnliche Meldung erhalten, wenn ich versuchen würde, sie in SSMS, DBeaver oder einer anderen GUI-Datenbankverwaltungssoftware anzuzeigen.
Beispiel 2 – Tabellenwertfunktion mit mehreren Anweisungen und Verschlüsselung
Hier ist ein TVF mit mehreren Anweisungen, das dasselbe tut wie die vorherige Funktion. TVFs mit mehreren Anweisungen haben eine andere Syntax als Inline-TVFs. Bei TVFs mit mehreren Anweisungen setzen Sie die Verschlüsselungsoption, nachdem Sie die Rückgabevariable angegeben haben.
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
Beispiel 3 – Skalarfunktion mit Verschlüsselung
Und hier ist ein Beispiel für eine verschlüsselte Skalarfunktion:
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
Beispiel 4 – Verschlüsselung zu einer bestehenden Funktion hinzufügen
Wenn Sie eine vorhandene Funktion verschlüsseln möchten, verwenden Sie ALTER FUNCTION
mit der gleichen Definition. Mit anderen Worten, ich kann das erste Beispiel nehmen und CREATE
ersetzen mit 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
Dies setzt offensichtlich voraus, dass der Rest der Definition der Funktion genau mit der vorhandenen Funktion übereinstimmt.
Der einfachste Weg, um sicherzustellen, dass Sie dieselbe Definition verwenden, besteht darin, Ihr GUI-Tool zu verwenden, um die vorhandene Funktion 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 5 – Hinzufügen mehrerer Argumente
Sie können mehrere Argumente als durch Kommas getrennte Liste angeben. Wenn Sie beispielsweise die Verschlüsselung und verwenden möchten Wenn Sie eine Schemabindung angeben möchten, müssen Sie diese als kommagetrennte Liste hinzufügen.
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
Mit anderen Worten, Sie geben nur WITH
an einmal – keine Notwendigkeit, es für jedes Argument zu wiederholen.
Wichtige Hinweise
Hier sind einige Dinge, die Sie über die Verschlüsselung benutzerdefinierter Funktionen 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 (nicht verschlüsselte) Definition der Funktion 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 Funktion als Teil der SQL Server-Replikation veröffentlicht wird.
- CLR-Funktionen können nicht verschlüsselt werden.