CREATE SECURITY POLICY (Transact-SQL)
适用于: sql Server 2016 (13.x) 及更高版本Azure SQL 数据库 Azure SQL 托管实例 Microsoft Fabric Microsoft Fabric Warehouse 中的 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 操作(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
编译提示。
在执行相应 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;