共用方式為


ALTER 安全策略 (Transact-SQL)

適用於:SQL Server 2016 (13.x) 及以後版本 Azure SQL 資料庫、Azure SQL Managed InstanceSQL 分析端點 Microsoft Fabric中的 Warehouse Microsoft Fabric 中的SQL 資料庫 Microsoft Fabric 中的 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 }

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

不適用於複寫

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