为 SQL 数据库引擎 中的 row 级安全性创建安全策略。
Fabric Data Warehouse中的行级别安全性与其他 SQL 数据库引擎 产品类似。 有关Fabric Data Warehouse或 SQL 分析终结点中行级别安全性的详细信息和示例,请参阅Fabric数据仓库中的
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 操作(INSERT 或 UPDATE)执行后的行值计算谓词。
BEFORE 指定将针对 DML 操作(UPDATE 或 DELETE)执行前的行值计算谓词。 如果不指定任何操作,则谓词将应用到所有操作。
[ 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 权限。
另外,每个添加的谓词都需要以下权限:
对用作谓词的函数具有
SELECT和REFERENCES权限。对绑定到策略的目标表具有
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;