ALTER SECURITY POLICY (Transact-SQL)
适用于: sql Server 2016 (13.x) 及更高版本Azure SQL 数据库 Azure SQL 托管实例 Microsoft Fabric Microsoft Fabric Warehouse 中的 SQL 分析终结点
更改安全策略。
语法
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 | arguments }
用作安全谓词函数的参数的列名和表达式。 目标表上的任意列都能用作谓词函数的参数。 可以使用包含文字、内置的表达式和使用算术运算符的表达式。
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 } )
使安全策略能够或禁止其对目标表强制执行其安全谓词。 如果未指定,则将启用正在创建的安全性策略。
NOT FOR REPLICATION
指示当复制代理修改目标对象时不应执行安全策略。 有关详细信息,请参阅控制同步期间触发器和约束的行为(复制 Transact-SQL 编程)。
table_schema_name.table_name
是应用的安全谓词的目标表。 多个禁用的安全策略能以单个表为目标,但是在任何给定时间只能启用一个。
备注
ALTER SECURITY POLICY 语句位于事务范围内。 如果对事务进行回滚,也将对该语句进行回滚。
将谓词函数用于内存优化表时,安全策略中必须包含 SCHEMABINDING
并使用 WITH NATIVE_COMPILATION
编译提示。 不能使用 ALTER
语句更改 SCHEMABINDING
参数,因为该参数应用于所有谓词。 若要更改架构绑定,必须先删除安全策略,然后再重新创建。
在执行相应 DML 操作后计算阻止谓词。 因此,READ UNCOMMITTED 查询可能会看到要回滚的临时值。
权限
需要 ALTER ANY SECURITY POLICY
权限。
另外,每个添加的谓词都需要以下权限:
- 对用作谓词的函数具有
SELECT
和REFERENCES
权限。 - 对绑定到策略的目标表具有
REFERENCES
权限。 - 对目标表中用作参数的每个列具有
REFERENCES
权限。
示例
下面的示例演示 ALTER SECURITY POLICY
语法的用法。 有关完整安全策略方案的示例,请参阅行级安全性。
A. 向策略添加其他谓词
以下语法更改安全策略,同时添加一个筛选器谓词到 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;