Freigeben über


ERSTELLEN EINER SICHERHEITSRICHTLINIE (Transact-SQL)

Gilt für: SQL Server 2016 (13.x) und höhere Versionen Azure SQL-DatenbankAzure SQL Managed InstanceSQL Analytics Endpoint in Microsoft FabricWarehouse in Microsoft FabricSQL-Datenbank in Microsoft Fabric

Erstellt eine Sicherheitsrichtlinie für die Sicherheit auf row-Level in der SQL-Datenbank-Engine.

Die Sicherheit auf Zeilenebene in Fabric Data Warehouse funktioniert ähnlich wie andere SQL-Datenbank-Engine-Produkte. Weitere Informationen und Beispiele für die Sicherheit auf Zeilenebene in Fabric Data Warehouse oder sql Analytics-Endpunkt finden Sie unter Row-Level-Sicherheit in Fabric Data Warehouse.

Transact-SQL Syntaxkonventionen

Syntax

CREATE SECURITY POLICY [schema_name. ] security_policy_name    
    { ADD [ FILTER | BLOCK ] } PREDICATE tvf_schema_name.security_predicate_function_name   
      ( { column_name | expression } [ , ...n] ) ON table_schema_name. table_name    
      [ <block_dml_operation> ] , [ , ...n] 
    [ WITH ( STATE = { ON | OFF }  [,] [ SCHEMABINDING = { ON | OFF } ] ) ]  
    [ NOT FOR REPLICATION ] 
[;]  
  
<block_dml_operation>  
    [ { AFTER { INSERT | UPDATE } }   
    | { BEFORE { UPDATE | DELETE } } ]  

Arguments

security_policy_name

Der Name der Sicherheitsrichtlinie. Sicherheitsrichtliniennamen müssen den Regeln für Bezeichner entsprechen und innerhalb der Datenbank und des zugehörigen Schemas eindeutig sein.

schema_name

Der Name des Schemas, zu dem die Sicherheitsrichtlinie gehört. schema_name ist aufgrund der Schemabindung erforderlich.

[ FILTER | BLOCK ]

Der Typ des Sicherheitsprädikats für die Funktion, die an die Zieltabelle gebunden werden soll.

  • FILTER-Prädikate filtern automatisch die Zeilen, die für Lesevorgänge zur Verfügung stehen.
  • BLOCK-Prädikate blockieren explizit Schreibvorgänge, die die Prädikatfunktion verletzen.

tvf_schema_name.security_predicate_function_name

Die Inlinetabellenwertfunktion, die als Prädikat verwendet wird und für Abfragen für eine Zieltabelle erzwungen wird. Für einen bestimmten DML-Vorgang für eine bestimmte Tabelle kann höchstens ein Sicherheitsprädikat definiert werden. Die Inline-Tabellenwertfunktion muss mit der SCHEMABINDING-Option erstellt worden sein.

{ column_name | Ausdruck }

Ein Spaltenname oder Ausdruck, der als Parameter für die Sicherheitsprädikatfunktion verwendet wird. Jede Spalte in der Zieltabelle kann verwendet werden. Ein Ausdruck kann nur Konstanten enthalten, die in skalaren Funktionen, Operatoren und Spalten aus der Zieltabelle integriert sind. Ein Spaltenname oder Ausdruck muss für jeden Parameter der Funktion angegeben werden.

table_schema_name.table_name

Die Zieltabelle, auf die das Sicherheits-Prädikat angewendet wird. Mehrere deaktivierte Sicherheitsrichtlinien können sich auf eine einzelne Tabelle für einen DML-Vorgang beziehen. Es kann allerdings immer nur eine Sicherheitsrichtlinie aktiv sein.

block_dml_operation

Der DML-Vorgang, auf den das BLOCK-Prädikat angewendet werden soll. AFTER legt fest, dass das Prädikat für die Zeilenwerte ausgewertet werden soll, nachdem der DML-Vorgang (INSERT oder UPDATE) durchgeführt wurde. BEFORE legt fest, dass das Prädikat für die Zeilenwerte ausgewertet werden soll, bevor der DML-Vorgang (UPDATE oder DELETE) durchgeführt wird. Wenn kein Vorgang angegeben ist, gilt das Prädikat für alle Vorgänge.

[ ZUSTAND = { ON | FALSCH } ]

Aktiviert oder deaktiviert das Erzwingen der Sicherheitsprädikate der Sicherheitsrichtlinie für die Zieltabellen. Wenn nichts angegeben ist, wird die erstellte Sicherheitsrichtlinie aktiviert.

[ SCHEMABINDING = { ON | FALSCH } ]

Gibt an, ob alle Prädikatfunktionen in der Richtlinie über die SCHEMABINDING-Option erstellt werden sollen. Standardmäßig ist diese Einstellung ON und alle Funktionen müssen mit SCHEMABINDING erstellt werden.

NICHT FÜR REPLIKATION

Gibt an, dass die Sicherheitsrichtlinie nicht ausgeführt werden soll, wenn ein Replikations-Agent das Zielobjekt ändert. Weitere Informationen finden Sie unter Control the Behavior of Triggers and Constraints During Synchronization (Replication Transact-SQL Programming).

[ table_schema_name. ] table_name

Die Zieltabelle, auf die das Sicherheits-Prädikat angewendet wird. Mehrere deaktivierte Sicherheitsrichtlinien können auf eine einzelne Tabelle abzielen, aber zu jedem Zeitpunkt kann nur eine aktiviert werden.

Remarks

Wenn Sie Prädikatfunktionen mit speicheroptimierten Tabellen verwenden, müssen Sie SCHEMABINDING einfügen und den Kompilierungshinweis WITH NATIVE_COMPILATION verwenden.

BLOCK-Prädikate werden ausgewertet, nachdem der entsprechende DML-Vorgang ausgeführt wurde. Daher besteht die Gefahr, dass eine READ UNCOMMITTED Abfrage vorübergehende Werte sehen kann, die zurückgesetzt werden.

Permissions

Erfordert die ALTER ANY SECURITY POLICY Berechtigung und ALTER Berechtigung für das Schema.

Darüber hinaus sind die folgenden Berechtigungen für jedes hinzugefügte Prädikat erforderlich:

  • SELECT- und REFERENCES-Berechtigungen für die als Prädikat verwendete Funktion.

  • REFERENCES-Berechtigung für die Zieltabelle, die an die Richtlinie gebunden wird.

  • REFERENCES-Berechtigung für jede Spalte in der Zieltabelle, die als Argument verwendet wird.

Examples

Die folgenden Beispiele veranschaulichen die Verwendung der CREATE SECURITY POLICY-Syntax. Ein Beispiel eines vollständigen Szenarios für Sicherheitsrichtlinien finden Sie unter Sicherheit auf Zeilenebene.

A. Erstellen einer Sicherheitsrichtlinie

Die folgende Syntax erstellt eine Sicherheitsrichtlinie mit einem Filterprädikat für die dbo.Customer-Tabelle und lässt die Sicherheitsrichtlinie deaktiviert.

CREATE SECURITY POLICY [FederatedSecurityPolicy]   
ADD FILTER PREDICATE [rls].[fn_securitypredicate]([CustomerId])   
ON [dbo].[Customer];  

B. Erstellen einer Richtlinie mit Auswirkungen auf mehrere Tabellen

Die folgende Syntax erstellt eine Sicherheitsrichtlinie mit drei Filterprädikaten für drei verschiedenen Tabellen und aktiviert die Sicherheitsrichtlinie.

CREATE SECURITY POLICY [FederatedSecurityPolicy]   
ADD FILTER PREDICATE [rls].[fn_securitypredicate1]([CustomerId])   
    ON [dbo].[Customer],  
ADD FILTER PREDICATE [rls].[fn_securitypredicate1]([VendorId])   
    ON [dbo].[ Vendor],  
ADD FILTER PREDICATE [rls].[fn_securitypredicate2]([WingId])   
    ON [dbo].[Patient]  
WITH (STATE = ON);  

C. Erstellen einer Richtlinie mit mehreren Sicherheitsprädikattypen

Fügt der dbo.Sales-Tabelle sowohl ein Filterprädikat als auch ein Blockprädikat hinzu.

CREATE SECURITY POLICY rls.SecPol  
    ADD FILTER PREDICATE rls.tenantAccessPredicate(TenantId) ON dbo.Sales,  
    ADD BLOCK PREDICATE rls.tenantAccessPredicate(TenantId) ON dbo.Sales AFTER INSERT;