CREATE SECURITY POLICY (Transact-SQL)

适用于:SQL Server 2016 (13.x) 及更高版本Azure SQL 数据库Azure SQL 托管实例Microsoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库

行级别安全性创建安全策略。

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

要应用 block 谓词的特定 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 编译提示。

在执行相应 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;