CREATE SECURITY POLICY (Transact-SQL)

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

Erstellt eine Sicherheitsrichtlinie für die Sicherheit auf Zeilenebene.

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 } } ]  

Argumente

security_policy_name

Der Name der Sicherheitsrichtlinie. Namen von Sicherheitsrichtlinien müssen den Regeln für Bezeichner entsprechen und innerhalb der Datenbank und für jedes Schema 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 wird. 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 Inline-Tabellenwertfunktion, die als Prädikat verwendet wird und bei 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 | expression }

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

table_schema_name.table_name

Die Zieltabelle, auf die das Sicherheitsprä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.

[ STATE = { ON | OFF } ]

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 | OFF } ]

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.

NOT FOR REPLICATION

Gibt an, dass die Sicherheitsrichtlinie nicht ausgeführt werden soll, wenn ein Replikations-Agent das Zielobjekt ändert. Weitere Informationen finden Sie unter Steuern des Verhaltens von Triggern und Einschränkungen während der Synchronisierung (Replikationsprogrammierung mit Transact-SQL).

[ table_schema_name. ] table_name

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

Hinweise

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, für die später ein Rollback ausgeführt wird.

Berechtigungen

Erfordert die ALTER ANY SECURITY POLICY-Berechtigung und die 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 Funktion, die als Prädikat verwendet wird.

  • 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.

Beispiele

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;