CREATE SECURITY POLICY (Transact-SQL)

Si applica a: SQL Server 2016 (13.x) e versioni successive database SQL di Azure Istanza gestita di SQL di Azure ENDPOINT di analisiSQL in Microsoft Fabric Warehouse in Microsoft Fabric

Crea un criterio di sicurezza per la sicurezza a livello di riga.

Convenzioni di sintassi Transact-SQL

Sintassi

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

Argomenti

security_policy_name

Nome del criterio di sicurezza. I nomi dei criteri sicurezza devono essere conformi alle regole per gli identificatori e devono essere univoci all'interno del database e rispetto al relativo schema.

schema_name

Nome dello schema a cui appartiene il criterio di sicurezza. schema_name è necessario per l'associazione allo schema.

[ FILTER | BLOCK ]

Tipo del predicato di sicurezza per la funzione da associare alla tabella di destinazione. FILTER predicati filtrano automaticamente le righe disponibili per le operazioni di lettura. BLOCK predicati bloccano in modo esplicito le operazioni di scrittura che violano la funzione predicato.

tvf_schema_name.security_predicate_function_name

Funzione con valori di tabella inline che verrà usata come predicato e che verrà applicata durante l'esecuzione di query su una tabella di destinazione. È possibile definire al massimo un predicato di sicurezza per una specifica operazione DML su una determinata tabella. La funzione valore tabella inline deve essere stata creata usando l'opzione SCHEMABINDING .

{ column_name | expression }

Espressione o nome di colonna usato come parametro per la funzione di predicato di sicurezza. Si può usare qualsiasi colonna nella tabella di destinazione. Un'espressione può includere solo costanti, funzioni scalari predefinite, operatori e colonne della tabella di destinazione. È necessario specificare un nome di colonna o un'espressione per ogni parametro della funzione.

table_schema_name.table_name

Tabella di destinazione a cui verrà applicato il predicato di sicurezza. A una singola tabella possono fare riferimento più criteri di sicurezza disabilitati per un'operazione DML specifica, ma è possibile abilitarne solo uno.

block_dml_operation

Operazione DML specifica per la quale verrà applicato il predicato di blocco. AFTER specifica che il predicato verrà valutato sui valori delle righe dopo l'esecuzione dell'operazione DML (INSERT o UPDATE). BEFORE specifica che il predicato verrà valutato sui valori delle righe prima dell'esecuzione dell'operazione DML (UPDATE o DELETE). Se non è specificata alcuna operazione, il predicato verrà applicato a tutte le operazioni.

[ STATE = { ON | OFF } ]

Abilita o disabilita il criterio di sicurezza per l'applicazione dei relativi predicati di sicurezza alle tabelle di destinazione. Se non specificato, il criterio di sicurezza creato è abilitato.

[ SCHEMABINDING = { ON | OFF } ]

Indica se tutte le funzioni di predicato nei criteri devono essere create con l'opzione SCHEMABINDING . Per impostazione predefinita, questa impostazione è ON e tutte le funzioni devono essere create con SCHEMABINDING.

NOT FOR REPLICATION

Indica che il criterio di sicurezza non deve essere eseguito quando un agente di replica modifica l'oggetto di destinazione. Per altre informazioni, vedere Controllare il comportamento di trigger e vincoli durante la sincronizzazione (programmazione Transact-SQL della replica).

[ table_schema_name. ] table_name

Tabella di destinazione a cui verrà applicato il predicato di sicurezza. A una singola tabella possono fare riferimento più criteri di sicurezza disabilitati, ma è possibile abilitarne solo uno.

Osservazioni:

Quando si usano funzioni di predicato con tabelle ottimizzate per la memoria, è necessario includere SCHEMABINDING e usare l'hint di WITH NATIVE_COMPILATION compilazione.

I predicati di blocco vengono valutati dopo l'esecuzione dell'operazione DML corrispondente. È pertanto possibile che una query READ UNCOMMITTED possa visualizzare i valori temporanei di cui verrà eseguito il rollback.

Autorizzazioni

Richiede l'autorizzazione ALTER ANY SECURITY POLICY e l'autorizzazione ALTER per lo schema.

Inoltre, per ogni predicato che viene aggiunto sono richieste le autorizzazioni seguenti:

  • Le autorizzazioniSELECT e REFERENCES per la funzione usata come predicato.

  • L'autorizzazioneREFERENCES per la tabella di destinazione associata ai criteri.

  • L'autorizzazioneREFERENCES per ogni colonna della tabella di destinazione usata come argomento.

Esempi

Negli esempi seguenti viene illustrato l'uso della CREATE SECURITY POLICY sintassi . Per un esempio di scenario completo dei criteri di sicurezza, vedere Sicurezza a livello di riga.

R. Creare criteri di sicurezza

La sintassi seguente crea un criterio di sicurezza con un predicato di filtro per la dbo.Customer tabella e lascia disabilitati i criteri di sicurezza.

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

B. Creare criteri che influiscono su più tabelle

La sintassi seguente crea un criterio di sicurezza con tre predicati del filtro per tre tabelle diverse e abilita il criterio di sicurezza.

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. Creare criteri con più tipi di predicati di sicurezza

Aggiunta di un predicato di filtro e di un predicato di blocco alla dbo.Sales tabella.

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;