CREATE SECURITY POLICY (Transact-SQL)
適用於: sql Server 2016 (13.x) 和更新版本 Azure SQL 資料庫 Azure SQL 受控執行個體 Microsoft Fabric 倉儲中Microsoft Fabric 中的 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 作業 (INSERT
或 UPDATE
) 之後,將會根據數據列的值評估述詞。 BEFORE
指定在執行 DML 作業之前,會在資料列的值上評估述詞(UPDATE
或 DELETE
。 如果沒有指定作業,則會將述詞套用至所有作業。
[ 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;