通过


创建安全策略(Transact-SQL)

applies to: SQL Server 2016 (13.x) 及更高版本 < Microsoft Fabric中的c3>Azure SQL 数据库Azure SQL 托管实例SQL 分析终结点warehouse in Microsoft FabricSQL database in Microsoft Fabric

为 SQL 数据库引擎 中的 row 级安全性创建安全策略。

Fabric Data Warehouse中的行级别安全性与其他 SQL 数据库引擎 产品类似。 有关Fabric Data Warehouse或 SQL 分析终结点中行级别安全性的详细信息和示例,请参阅Fabric数据仓库中的 Row 级安全性。

Transact-SQL语法约定

Syntax

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

Arguments

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

要应用 block 谓词的特定 DML 操作。 AFTER 指定将针对 DML 操作(INSERTUPDATE)执行后的行值计算谓词。 BEFORE 指定将针对 DML 操作(UPDATEDELETE)执行前的行值计算谓词。 如果不指定任何操作,则谓词将应用到所有操作。

[ STATE = { ON |OFF } ]

使安全策略能够或禁止其对目标表强制执行其安全谓词。 如果未指定,则将启用正在创建的安全性策略。

[ SCHEMABINDING = { ON |OFF } ]

指示是否策略中的所有谓词函数都必须使用 SCHEMABINDING 选项创建。 默认情况下,此设置为 ON,并且所有函数必须使用 SCHEMABINDING 创建。

不是为了复制

指示当复制代理修改目标对象时不应执行安全策略。 有关详细信息,请参阅控制同步期间触发器和约束的行为(复制Transact-SQL编程)

[ table_schema_name。 ] table_name

要向其应用安全谓词的目标表。 多个禁用的安全策略能以单个表为目标,但是在任何给定时间只能启用一个。

Remarks

将谓词函数用于内存优化表时,必须包含 SCHEMABINDING 并使用 WITH NATIVE_COMPILATION 编译提示。

在执行相应 DML 操作后计算阻止谓词。 因此, READ UNCOMMITTED 查询可能会看到将回滚的暂时性值。

Permissions

需要对架构具有 ALTER ANY SECURITY POLICY 权限和 ALTER 权限。

另外,每个添加的谓词都需要以下权限:

  • 对用作谓词的函数具有SELECTREFERENCES权限。

  • 对绑定到策略的目标表具有REFERENCES权限。

  • 对目标表中用作参数的每个列具有REFERENCES权限。

Examples

下面的示例演示 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;