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 analisi SQL in Microsoft Fabric Warehouse nel database SQL di Microsoft Fabric in Microsoft Fabric
Crea un criterio di sicurezza per la sicurezza a livello di riga.
Convenzioni relative alla 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;