CREATE SECURITY POLICY (Transact-SQL)
Gilt für: SQL Server 2016 (13.x) und höhere Versionen Azure SQL-Datenbank Azure SQL verwaltete Instanz SQL Analytics-Endpunkt in Microsoft Fabric Warehouse in Microsoft Fabric Warehouse 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;