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

So verschlüsseln Sie eine Ansicht in SQL Server

In SQL Server können Sie eine Ansicht verschlüsseln, wenn Sie sie zum ersten Mal erstellen, oder Sie können sie später ändern, um die Verschlüsselung einzubeziehen.

Um eine Ansicht mit T-SQL zu erstellen, verwenden Sie den CREATE VIEW Syntax. Um es zu verschlüsseln, fügen Sie den WITH ENCRYPTION hinzu Argument.

Sie können dasselbe Argument auch verwenden, um eine vorhandene Ansicht zu verschlüsseln, wenn Sie ALTER VIEW verwenden .

Der Text der verschlüsselten Ansicht ist in keiner Katalogansicht direkt sichtbar. Daher kann die Definition der Ansicht nicht von Benutzern angezeigt werden, die keinen Zugriff auf Systemtabellen oder Datenbankdateien haben.

Verwenden von WITH ENCRYPTION verhindert auch, dass die Ansicht als Teil der SQL Server-Replikation veröffentlicht wird.

Beispiel 1 – Erstellen Sie eine verschlüsselte Ansicht

Hier ist ein Beispiel für das Erstellen einer verschlüsselten Ansicht.

CREATE VIEW dbo.v_Cats
WITH ENCRYPTION
AS
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats;
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 Ansicht 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('dbo.v_Cats');

Ergebnis:

+--------------+
| definition   |
|--------------|
| NULL         |
+--------------+

Dasselbe Ergebnis erhalte ich mit den (veralteten) sys.syscomments Katalogansicht.

SELECT text
FROM sys.syscomments
WHERE id = OBJECT_ID('v_Cats');

Ergebnis:

+--------+
| text   |
|--------|
| NULL   |
+--------+

Ich erhalte ein ähnliches Ergebnis, unabhängig davon, mit welcher T-SQL-Methode ich versuche, die Definition der Ansicht abzurufen.

Und hier ist die Fehlermeldung, die ich in Azure Data Studio erhalte, wenn ich versuche, die Ansicht zu skripten:

No script was returned when scripting as Create on object View

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 – Verschlüsselung zu einer bestehenden Ansicht hinzufügen

Wenn Sie eine vorhandene Ansicht verschlüsseln möchten, verwenden Sie ALTER VIEW mit der gleichen Definition. Mit anderen Worten, ich kann das erste Beispiel nehmen und CREATE ersetzen mit ALTER .

ALTER VIEW dbo.v_Cats
WITH ENCRYPTION
AS
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats;
GO

Dies setzt offensichtlich voraus, dass der Rest der Definition der Ansicht genau mit der vorhandenen Ansicht übereinstimmt.

Der einfachste Weg, um sicherzustellen, dass Sie dieselbe Definition verwenden, besteht darin, Ihr GUI-Tool zu verwenden, um die vorhandene Ansicht 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 3 – Hinzufügen mehrerer Attribute

Die Verschlüsselung ist nur eines von mehreren Attributen, die Sie in die Definition Ihrer Ansicht aufnehmen können. Wenn Sie mehrere Attribute angeben müssen, trennen Sie sie durch ein Komma.

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.

ALTER VIEW dbo.v_Cats
WITH ENCRYPTION, SCHEMABINDING
AS
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats;
GO