共用方式為


ALTER SECURITY POLICY (Transact-SQL)

適用於: SQL Server 2016 (13.x) 和更新版本 Azure SQL 資料庫 Azure SQL 受控執行個體 Microsoft Fabric 中Microsoft狀架構倉儲中的 SQL 分析端點

改變安全性原則。

Transact-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 作業之後,會在數據列值上評估述詞 (INSERTUPDATE)。 BEFORE 指定執行 DML 作業之前,會在資料列值上評估述詞 (UPDATEDELETE)。 如果沒有指定作業,則會將述詞套用至所有作業。

您無法改變 (ALTER) 已套用封鎖述詞的作業,因為該作業會用來唯一識別該述詞。 相反地,您必須卸除該述詞,並針對新的作業加入一個新的述詞。

WITH ( STATE = { ON | OFF } )

啟用或停用強制對目標資料表執行其安全性述詞的安全性原則。 如果未指定,則會啟用正在建立的安全性原則。

NOT FOR REPLICATION

表示當複寫代理程式修改目標物件時,不應執行安全性原則。 如需詳細資訊,請參閱在同步處理期間控制觸發程序和條件約束的行為 (複寫 Transact-SQL 程式設計)

table_schema_name.table_name

這是適用於已套用安全性述詞的目標資料表。 單一資料表可以有多個已停用的安全性原則,但無論何時都只能啟用一個安全性原則。

備註

ALTER SECURITY POLICY 陳述式位於交易的範圍內。 如果回復交易,也會回復此陳述式。

搭配記憶體優化數據表使用述詞函式時,安全策略必須包含 SCHEMABINDING 並使用 WITH NATIVE_COMPILATION 編譯提示。 SCHEMABINDING自變數無法隨著 ALTER 語句變更,因為它適用於所有述詞。 若要變更結構描述繫結,您必須卸除並重新建立安全性原則。

BLOCK 述詞會在執行對應的 DML 作業後加以評估。 因此,READ UNCOMMITTED 查詢可能會看到將回復的暫時性值。

權限

需要 ALTER ANY SECURITY POLICY 權限。

此外,每個加入的述詞還需要下列權限:

  • 正做為述詞使用之函式的 SELECTREFERENCES 權限。
  • 正繫結至原則之目標資料表的 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. 新增和卸除多個述詞

下列語法會改變安全性原則,在 mytable1mytable3 資料表上加入篩選器述詞,並移除 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;