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

So verschlüsseln Sie eine benutzerdefinierte Funktion in SQL Server

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.