分享方式:


CREATE SECURITY POLICY (Transact-SQL)

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

建立數據 列層級安全性的安全策略。

Transact-SQL 語法慣例

語法

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

引數

security_policy_name

安全性原則的名稱。 安全性原則名稱必須符合識別碼的規則,並且在資料庫內及對於它的結構描述都必須是唯一的。

schema_name

這是安全性原則所屬的結構描述名稱。 因為結構描述繫結,schema_name 是必要的。

[ FILTER | BLOCK ]

繫結至目標資料表之函式的安全性述詞類型。 FILTER 述詞會以無訊息方式篩選可用來讀取作業的數據列。 BLOCK 述詞會明確封鎖違反述詞函式的寫入作業。

tvf_schema_name.security_predicate_function_name

這是內嵌資料表值函數,可做為述詞使用,並會在查詢目標資料表時強制執行。 針對每個特定資料表的每項特定 DML 作業,最多只能定義一個安全性述詞。 內嵌數據表值函式必須使用 選項建立 SCHEMABINDING

{ column_name | expression }

做為安全性述詞函數參數的資料行名稱或運算式。 可以使用目標資料表上的任何資料行。 運算式只可包含目標資料表的常數、內建純量函數、運算子和資料行中。 必須針對函式的各個參數指定資料行名稱或運算式。

table_schema_name.table_name

這是套用安全性述詞的目標資料表。 您可以將多個已停用的安全性原則目標設為特定 DML 作業的單一資料表,但無論何時都只能啟用一個安全性原則。

block_dml_operation

將套用區塊述詞的特定 DML 作業。 AFTER 指定在執行 DML 作業 (INSERTUPDATE) 之後,將會根據數據列的值評估述詞。 BEFORE 指定在執行 DML 作業之前,會在資料列的值上評估述詞(UPDATEDELETE。 如果沒有指定作業,則會將述詞套用至所有作業。

[ STATE = { ON | OFF } ]

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

[ SCHEMABINDING = { ON | OFF } ]

指出是否必須使用 選項建立 SCHEMABINDING 原則中的所有述詞函式。 根據預設,此設定為 ON ,而且所有函式都必須使用 SCHEMABINDING來建立。

NOT FOR REPLICATION

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

[ table_schema_name。 ] table_name

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

備註

搭配記憶體優化數據表使用述詞函式時,您必須包含 SCHEMABINDING 並使用 WITH NATIVE_COMPILATION 編譯提示。

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

權限

需要結構描述的 ALTER ANY SECURITY POLICY 權限和 ALTER 權限。

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

  • 正做為述詞使用之函數的 SELECT 和 REFERENCES 權限。

  • 正繫結至原則之目標資料表的 REFERENCES 權限。

  • 目標資料表中做為引數使用之每個資料行的 REFERENCES 權限。

範例

下列範例示範如何使用 CREATE SECURITY POLICY 語法。 如需完整安全策略案例的範例,請參閱 數據列層級安全性

A. 建立安全性原則

下列語法會建立具有數據表篩選述詞 dbo.Customer 的安全策略,並將安全策略停用。

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

B. 建立影響多個數據表的原則

下列語法使用三個篩選器述詞建立三種資料表的安全性原則,並啟用安全性原則。

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. 建立具有多種安全性述詞類型的原則

將篩選述詞和區塊述詞新增至 dbo.Sales 數據表。

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;