適用於:SQL Server 2016 (13.x) 及以後版本
Azure SQL 資料庫、
Azure SQL Managed Instance
SQL 分析端點 Microsoft Fabric
中的 Warehouse Microsoft Fabric
中的SQL 資料庫 Microsoft Fabric 中的 SQL 資料庫
改變安全性原則。
語法
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 } } ]
引數
security_policy_name
安全性原則的名稱。 安全性原則名稱必須滿足識別碼的規則,而且在資料庫內及對其結構描述而言都必須是唯一的。
schema_name
安全策略所屬之架構的名稱。 因為結構描述繫結,schema_name 是必要的。
[ FILTER |BLOCK ] **
繫結至目標資料表之函數的安全性述詞類型。
FILTER 述詞會以無訊息方式篩選可用來讀取作業的數據列。
BLOCK 述詞會明確封鎖違反述詞函式的寫入作業。
tvf_schema_name。security_predicate_function_name
您用來做為述詞的內嵌數據表值函式,並且會對目標數據表強制執行查詢。 您最多可以針對特定資料表的特定 DML 作業定義一個安全性述詞。 使用 SCHEMABINDING 選項建立內嵌數據表值函式。
{ column_name | 自變數 }
做為安全性述詞函數之參數的資料行名稱或運算式。 目標資料表上的任何資料行都可以做為述詞函數的引數。 可以使用包含常值的運算式、內建運算式及使用算術運算子的運算式。
table_schema_name.table_name
安全性述詞的目標數據表。 您可以將多個已停用的安全性原則目標設為特定 DML 作業的單一資料表,但無論何時都只能啟用一個安全性原則。
<block_dml_operation>
適用於已套用封鎖述詞的特定 DML 作業。
AFTER 指定執行 DML 作業之後,會在數據列值上評估述詞 (INSERT 或 UPDATE)。
BEFORE 指定執行 DML 作業之前,會在資料列值上評估述詞 (UPDATE 或 DELETE)。 如果沒有指定作業,則會將述詞套用至所有作業。
您無法改變 (ALTER) 已套用封鎖述詞的作業,因為該作業會用來唯一識別該述詞。 相反地,您必須卸除該述詞,並針對新的作業加入一個新的述詞。
WITH ( STATE = { ON |OFF }
啟用或停用強制對目標資料表執行其安全性述詞的安全性原則。 如果未指定,則會啟用正在建立的安全性原則。
不適用於複寫
表示當複寫代理程式修改目標物件時,不應執行安全性原則。 如需詳細資訊,請參閱在同步處理期間控制觸發程序和條件約束的行為 (複寫 Transact-SQL 程式設計)。
table_schema_name.table_name
所套用安全性述詞的目標數據表。 單一資料表可以有多個已停用的安全性原則,但無論何時都只能啟用一個安全性原則。
備註
ALTER SECURITY POLICY 陳述式位於交易的範圍內。 如果回復交易,也會回復此陳述式。
搭配記憶體優化數據表使用述詞函式時,安全策略必須包含 SCHEMABINDING 並使用 WITH NATIVE_COMPILATION 編譯提示。
SCHEMABINDING自變數無法隨著 ALTER 語句變更,因為它適用於所有述詞。 若要變更結構描述繫結,您必須卸除並重新建立安全性原則。
BLOCK 述詞會在執行對應的 DML 作業後加以評估。 因此,READ UNCOMMITTED 查詢可能會看到將復原的暫時性值。
權限
需要 ALTER ANY SECURITY POLICY 權限。
此外,每個加入的述詞還需要下列權限:
- 正做為述詞使用之函式的
SELECT和REFERENCES權限。 - 正繫結至原則之目標資料表的
REFERENCES權限。 - 目標資料表中做為引數使用之每個資料行的
REFERENCES權限。
範例
下列範例示範如何使用 ALTER SECURITY POLICY 語法。 如需完整安全策略案例的範例,請參閱 數據列層級安全性。
A。 將額外的述詞新增至原則
下列語法會改變安全性原則,在 mytable 資料表上加入篩選器述詞。
ALTER SECURITY POLICY pol1
ADD FILTER PREDICATE schema_preds.SecPredicate(column1)
ON myschema.mytable;
B. 啟用現有的原則
下列範例使用 ALTER 語法,來啟用安全性原則。
ALTER SECURITY POLICY pol1 WITH ( STATE = ON );
C. 新增和卸除多個述詞
下列語法會改變安全性原則,在 mytable1 和 mytable3 資料表上加入篩選器述詞,並移除 mytable2 資料表上的篩選器述詞。
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. 變更數據表上的述詞
下列語法會將數據表上 myschema.mytable 現有的篩選述詞變更為函 SecPredicate2 式。
ALTER SECURITY POLICY pol1
ALTER FILTER PREDICATE schema_preds.SecPredicate2(column1)
ON myschema.mytable;
E. 變更區塊述詞
變更資料表上作業的 BLOCK 述詞函數。
ALTER SECURITY POLICY rls.SecPol
ALTER BLOCK PREDICATE rls.tenantAccessPredicate_v2(TenantId)
ON dbo.Sales AFTER INSERT;