Dela via


SKAPA SÄKERHETSPRINCIP (Transact-SQL)

Applies to: SQL Server 2016 (13.x) och senare versioner Azure SQL DatabaseAzure SQL Managed InstanceSQL-analysslutpunkten i Microsoft FabricWarehouse i databasen Microsoft FabricSQL i Microsoft Fabric

Skapar en säkerhetsprincip för row-level security i SQL Database Engine.

Säkerhet på radnivå i Fabric Data Warehouse fungerar på samma sätt som andra SQL-Database Engine produkter. Mer information och exempel på säkerhet på radnivå i Fabric Data Warehouse eller SQL-analysslutpunkten finns i Säkerhet på Fabric datalager.

Transact-SQL syntaxkonventioner

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

Namnet på säkerhetsprincipen. Namn på säkerhetsprinciper måste följa reglerna för identifierare och vara unika i databasen och dess schema.

schema_name

Namnet på det schema som säkerhetsprincipen tillhör. schema_name krävs på grund av schemabindning.

[ FILTER | BLOCKERA ]

Typen av säkerhetspredikat för funktionen som ska bindas till måltabellen.

  • FILTER predikat filtrerar tyst de rader som är tillgängliga för läsåtgärder.
  • BLOCK predikat blockerar uttryckligen skrivåtgärder som bryter mot predikatfunktionen.

tvf_schema_name.security_predikat_funktionsnamn_

Den infogade tabellvärdefunktion som ska användas som predikat och som tillämpas vid frågor mot en måltabell. Högst ett säkerhetspredikat kan definieras för en viss DML-åtgärd mot en viss tabell. Funktionen infogat tabellvärde måste ha skapats med hjälp av SCHEMABINDING alternativet .

{ column_name | uttryck }

Ett kolumnnamn eller uttryck som används som en parameter för funktionen för säkerhetspredikat. Valfri kolumn i måltabellen kan användas. Ett uttryck kan bara innehålla konstanter, inbyggda skalärfunktioner, operatorer och kolumner från måltabellen. Ett kolumnnamn eller uttryck måste anges för varje parameter i funktionen.

table_schema_name.table_name

Måltabellen som säkerhetspredikatet ska tillämpas på. Flera inaktiverade säkerhetsprinciper kan rikta in sig på en enskild tabell för en viss DML-åtgärd, men endast en kan aktiveras vid en viss tidpunkt.

block_dml_operation

Den specifika DML-åtgärd som blockpredikatet ska tillämpas för. AFTER anger att predikatet ska utvärderas på värdena för raderna efter att DML-åtgärden utfördes (INSERT eller UPDATE). BEFORE anger att predikatet ska utvärderas på värdena för raderna innan DML-åtgärden utförs (UPDATE eller DELETE). Om ingen åtgärd anges gäller predikatet för alla åtgärder.

[ TILLSTÅND = { PÅ | FEL } ]

Aktiverar eller inaktiverar säkerhetsprincipen från att framtvinga dess säkerhetspredikat mot måltabellerna. Om inte anges är den säkerhetsprincip som skapas aktiverad.

[ SCHEMABINDING = { ON | FEL } ]

Anger om alla predikatfunktioner i principen måste skapas med alternativet SCHEMABINDING . Som standard är ON den här inställningen och alla funktioner måste skapas med SCHEMABINDING.

INTE FÖR REPLIKERING

Anger att säkerhetsprincipen inte ska köras när en replikeringsagent ändrar målobjektet. Mer information finns i Styr beteendet för utlösare och begränsningar under synkronisering (replikering Transact-SQL programmering).

[ table_schema_name. ] table_name

Måltabellen som säkerhetspredikatet ska tillämpas på. Flera inaktiverade säkerhetsprinciper kan riktas mot en enskild tabell, men endast en kan aktiveras vid en viss tidpunkt.

Remarks

När du använder predikatfunktioner med minnesoptimerade tabeller måste du inkludera SCHEMABINDING och använda kompileringstipset WITH NATIVE_COMPILATION .

Blockpredikat utvärderas efter att motsvarande DML-åtgärd har körts. Därför finns det risk för att en READ UNCOMMITTED fråga kan se tillfälliga värden som kommer att återställas.

Permissions

Kräver behörighet och ALTER ANY SECURITY POLICYALTER behörighet för schemat.

Dessutom krävs följande behörigheter för varje predikat som läggs till:

  • SELECT och REFERENCES behörigheter för funktionen som används som predikat.

  • REFERENCES behörighet på måltabellen som är bunden till principen.

  • REFERENCES behörighet för varje kolumn från måltabellen som används som argument.

Examples

I följande exempel visas hur syntaxen CREATE SECURITY POLICY används. Ett exempel på ett fullständigt säkerhetsprincipscenario finns i Säkerhet på radnivå.

A. Skapa en säkerhetsprincip

Följande syntax skapar en säkerhetsprincip med ett filterpredikat för dbo.Customer tabellen och lämnar säkerhetsprincipen inaktiverad.

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

B. Skapa en princip som påverkar flera tabeller

Följande syntax skapar en säkerhetsprincip med tre filterpredikat i tre olika tabeller och aktiverar säkerhetsprincipen.

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. Skapa en princip med flera typer av säkerhetspredikat

Lägga till både ett filterpredikat och ett blockpredikat i dbo.Sales tabellen.

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;