适用于:SQL Server 2016 (13.x) 及以后版本
Azure SQL 数据库
Azure SQL Managed Instance
SQL 分析端点 Microsoft Fabric
中的仓库 Microsoft Fabric
中的 SQL 数据库 Microsoft Fabric 中的
更改安全策略。
语法
ALTER SECURITY POLICY schema_name.security_policy_name
[
{ ADD { FILTER | BLOCK } PREDICATE tvf_schema_name.security_predicate_function_name
( { column_name | arguments } [ , ...n ] ) ON table_schema_name.table_name
[ <block_dml_operation> ] }
| { ALTER { FILTER | BLOCK } PREDICATE tvf_schema_name.new_security_predicate_function_name
( { column_name | arguments } [ , ...n ] ) ON table_schema_name.table_name
[ <block_dml_operation> ] }
| { DROP { FILTER | BLOCK } PREDICATE ON table_schema_name.table_name }
| [ <additional_add_alter_drop_predicate_statements> [ , ...n ] ]
] [ WITH ( STATE = { 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 | 论证 }
用作安全谓词函数的参数的列名和表达式。 目标表上的任意列都能用作谓词函数的参数。 可以使用包含文字、内置的表达式和使用算术运算符的表达式。
table_schema_name.table_name
安全谓词的目标表。 对于特定 DML 操作,多个禁用的安全策略能以单个表为目标,但是在任何给定时间只能启用一个。
<block_dml_operation>
应用的 block 谓词的特定 DML 操作。
AFTER 指定将针对 DML 操作(INSERT 或 UPDATE)执行后的行值计算谓词。
BEFORE 指定将针对 DML 操作(UPDATE 或 DELETE)执行前的行值计算谓词。 如果不指定任何操作,则谓词将应用到所有操作。
你无法对应用的 block 谓词的操作执行 ALTER,因为该操作用于唯一标识该谓词。 相反,必须删除该谓词,并为新操作添加一个新的谓词。
WITH ( STATE = { ON |OFF }
使安全策略能够或禁止其对目标表强制执行其安全谓词。 如果未指定,则将启用正在创建的安全性策略。
不是为了复制
指示当复制代理修改目标对象时不应执行安全策略。 有关详细信息,请参阅控制同步期间触发器和约束的行为(复制 Transact-SQL 编程)。
table_schema_name.table_name
应用的安全谓词的目标表。 多个禁用的安全策略能以单个表为目标,但是在任何给定时间只能启用一个。
备注
ALTER SECURITY POLICY 语句位于事务范围内。 如果对事务进行回滚,也将对该语句进行回滚。
将谓词函数用于内存优化表时,安全策略中必须包含 SCHEMABINDING 并使用 WITH NATIVE_COMPILATION 编译提示。 不能使用 SCHEMABINDING 语句更改 ALTER 参数,因为该参数应用于所有谓词。 若要更改架构绑定,必须先删除安全策略,然后再重新创建。
在执行相应 DML 操作后计算阻止谓词。 因此,READ UNCOMMITTED 查询可能会看到将回滚的暂时性值。
权限
需要 ALTER ANY SECURITY POLICY 权限。
另外,每个添加的谓词都需要以下权限:
- 对用作谓词的函数具有
SELECT和REFERENCES权限。 - 对绑定到策略的目标表具有
REFERENCES权限。 - 对目标表中用作参数的每个列具有
REFERENCES权限。
示例
下面的示例演示 ALTER SECURITY POLICY 语法的用法。 有关完整安全策略方案的示例,请参阅行级安全性。
答: 向策略添加其他谓词
以下语法更改安全策略,同时添加一个筛选器谓词到 mytable 表。
ALTER SECURITY POLICY pol1
ADD FILTER PREDICATE schema_preds.SecPredicate(column1)
ON myschema.mytable;
B. 启用一个现有策略
以下示例使用了 ALTER 语法来启用安全策略。
ALTER SECURITY POLICY pol1 WITH ( STATE = ON );
°C 添加和删除多个谓词
以下语法更改安全策略,同时添加筛选器谓词到 mytable1 和 mytable3 表,并删除 mytable2 表上的筛选器谓词。
ALTER SECURITY POLICY pol1
ADD FILTER PREDICATE schema_preds.SecPredicate1(column1)
ON myschema.mytable1,
DROP FILTER PREDICATE
ON myschema.mytable2,
ADD FILTER PREDICATE schema_preds.SecPredicate2(column2, 1)
ON myschema.mytable3;
D. 更改表中谓词
下面的语法可将 myschema.mytable 表中的现有筛选器谓词更改为 SecPredicate2 函数。
ALTER SECURITY POLICY pol1
ALTER FILTER PREDICATE schema_preds.SecPredicate2(column1)
ON myschema.mytable;
E. 更改 block 谓词
更改 block 谓词函数以便对表进行操作。
ALTER SECURITY POLICY rls.SecPol
ALTER BLOCK PREDICATE rls.tenantAccessPredicate_v2(TenantId)
ON dbo.Sales AFTER INSERT;