CREATE SECURITY POLICY (Transact-SQL)
適用於: sql Server 2016 (13.x) 和更新版本 Azure SQL 資料庫 Azure SQL 受控執行個體 Microsoft Fabric SQL 資料庫中的 Microsoft Fabric SQL Database Microsoft Fabric SQL 資料庫中的 SQL 分析 Microsoft端點
建立數據 列層級安全性的安全策略。
語法
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;