ALTER SECURITY POLICY (Transact-SQL)

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

Ändert eine Sicherheitsrichtlinie.

Transact-SQL-Syntaxkonventionen

Syntax

ALTER SECURITY POLICY schema_name.security_policy_name   
    (  
        { ADD { FILTER | BLOCK } PREDICATE tvf_schema_name.security_predicate_function_name   
           ( { column_name | arguments } [ , ...n ] ) ON table_schema_name.table_name   
           [ <block_dml_operation> ]  }   
        | { ALTER { FILTER | BLOCK } PREDICATE tvf_schema_name.new_security_predicate_function_name   
             ( { column_name | arguments } [ , ...n ] ) ON table_schema_name.table_name   
           [ <block_dml_operation> ] }  
        | { DROP { FILTER | BLOCK } PREDICATE ON table_schema_name.table_name }   
        | [ <additional_add_alter_drop_predicate_statements> [ , ...n ] ]  
    )    [ WITH ( STATE = { 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 Sie als Prädikat verwenden und bei Abfragen an eine Zieltabelle erzwingen. Für einen bestimmten DML-Vorgang für eine bestimmte Tabelle können Sie höchstens ein Sicherheitsprädikat definieren. Erstellen Sie die Inline-Tabellenwertfunktion mit der SCHEMABINDING-Option.

{ column_name | arguments }

Der Spaltenname oder Ausdruck, der als Parameter für die Sicherheitsprädikatfunktion verwendet wird. Alle Spalten in der Zieltabelle können als Argumente für die Prädikatfunktion verwendet werden. Ausdrücke, die Literale, integrierte Funktionen und Ausdrücke, die arithmetische Operatoren verwenden, umfassen, können verwendet werden.

table_schema_name.table_name

Die Zieltabelle für das Sicherheitsprädikat. 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 spezifische DML-Vorgang für das angewendete BLOCK-Prädikat. AFTER gibt an, dass das Prädikat für die Zeilenwerte ausgewertet wird, nachdem der DML-Vorgang (INSERT oder UPDATE) durchgeführt wurde. BEFORE gibt an, dass das Prädikat für die Zeilenwerte ausgewertet wird, bevor der DML-Vorgang (UPDATE oder DELETE) durchgeführt wurde. Wenn kein Vorgang angegeben ist, gilt das Prädikat für alle Vorgänge.

Sie können mit ALTER den Vorgang für ein angewendetes BLOCK-Prädikat nicht verändern, da dieser Vorgang zur eindeutigen Identifizierung des Prädikats verwendet wird. Stattdessen müssen Sie das Prädikat löschen und für den neuen Vorgang ein neues erstellen.

WITH ( 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.

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 für das angewendete Sicherheitsprädikat. Mehrere deaktivierte Sicherheitsrichtlinien können auf eine einzelne Tabelle abzielen, aber zu jedem Zeitpunkt kann nur eine aktiviert werden.

Bemerkungen

Die ALTER SECURITY POLICY-Anweisung liegt im Bereich einer Transaktion. Wird ein Rollback für die Transaktion ausgeführt, so wird auch für die Anweisung ein Rollback durchgeführt.

Wenn Sie Prädikatfunktionen mit speicheroptimierten Tabellen verwenden, müssen die Sicherheitsrichtlinien SCHEMABINDING umfassen und den Kompilierungshinweis WITH NATIVE_COMPILATION verwenden. Das SCHEMABINDING-Argument kann nicht mit der ALTER-Anweisung geändert werden, da es auf alle Prädikate angewendet wird. Zum Ändern der Schemabindung müssen Sie die Sicherheitsrichtlinie löschen und neu erstellen.

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

Berechtigungen

Erfordert die ALTER ANY SECURITY POLICY-Berechtigung.

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.

Beispiele

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

A. Hinzufügen eines zusätzlichen Prädikats zu einer Richtlinie

Die folgende Syntax ändert eine Sicherheitsrichtlinie, indem ein Filterprädikat zur mytable-Tabelle hinzugefügt wird.

ALTER SECURITY POLICY pol1   
    ADD FILTER PREDICATE schema_preds.SecPredicate(column1)   
    ON myschema.mytable;  

B. Aktivieren einer vorhandenen Richtlinie

Im folgenden Beispiel wird die ALTER-Syntax verwendet, um eine Sicherheitsrichtlinie zu aktivieren.

ALTER SECURITY POLICY pol1 WITH ( STATE = ON );  

C. Hinzufügen und Löschen mehrerer Prädikate

Die folgende Syntax ändert eine Sicherheitsrichtlinie, indem Filterprädikate für die Tabellen mytable1 und mytable3 hinzugefügt werden und das Filterprädikat von der mytable2-Tabelle entfernt wird.

ALTER SECURITY POLICY pol1  
ADD FILTER PREDICATE schema_preds.SecPredicate1(column1)   
    ON myschema.mytable1,  
DROP FILTER PREDICATE   
    ON myschema.mytable2,  
ADD FILTER PREDICATE schema_preds.SecPredicate2(column2, 1)   
    ON myschema.mytable3;  

D. Ändern des Prädikats zu einer Tabelle

Die folgende Syntax ändert das vorhandene Filterprädikat für die myschema.mytable-Tabelle in die SecPredicate2-Funktion.

ALTER SECURITY POLICY pol1  
    ALTER FILTER PREDICATE schema_preds.SecPredicate2(column1)  
        ON myschema.mytable;  

E. Ändern eines BLOCK-Prädikats

Im folgenden Beispiel wird die BLOCK-Prädikatfunktion für einen Tabellenvorgang geändert.

ALTER SECURITY POLICY rls.SecPol  
    ALTER BLOCK PREDICATE rls.tenantAccessPredicate_v2(TenantId) 
    ON dbo.Sales AFTER INSERT;