SQL Server 2016 改变表值函数——改变安全策略

Posted

技术标签:

【中文标题】SQL Server 2016 改变表值函数——改变安全策略【英文标题】:SQL Sever 2016 Alter Table Valued Function -- Alter Security Policy 【发布时间】:2017-08-17 10:20:45 【问题描述】:

我有一个被安全策略引用的表值函数。 我想ALTER这个函数,但我不能:

消息 3729,级别 16,状态 3,过程访问谓词,第 1 行 无法更改“rls.accessPredicate”,因为它被对象“EventSecurityPolicy”引用

嗯,但是 GUI 中的安全策略在哪里?我检查了架构、表和函数。我会假设它会在政策之下

好吧,我总是可以用 T-SQL 做到这一点

select * 
from sys.security_policies

也许我可以关掉它

Alter security policy rls.EventSecurityPolicy
with (state = OFF);

不一样的错误:

消息 3729,级别 16,状态 3,过程访问谓词,第 1 行 无法更改“rls.accessPredicate”,因为它被对象“EventSecurityPolicy”引用

好的,我们删除它

delete from sys.objects
where schema_id = schema_id('rls') and object_id='1253579504'

消息 259,第 16 级,状态 1,第 2 行 不允许对系统目录进行临时更新。

How do you get past this sort of error: "Ad hoc updates to system catalogs are not allowed."?

好的,我将更改程序集..

select * from sys.assemblies

好吧,我不知道从这里去哪里......

一定有更简单的方法!我只是想改变一个功能!

【问题讨论】:

试试这个ALTER SECURITY POLICY yourpolicy DROP filter/block PREDICATE ON table 非常感谢...作为注释,我必须包含块谓词的更新后...否则它说谓词不存在。添加为答案,我将标记为正确 您可以将其发布为答案,包括您所拥有的、您正在尝试的以及您所做的,它可能会在未来对其他人有所帮助 【参考方案1】:

解决方案 --

删除谓词:

ALTER SECURITY POLICY rls.EventSecurityPolicy DROP filter PREDICATE ON 
dbo.Dim_event
ALTER SECURITY POLICY rls.EventSecurityPolicy DROP BLOCK PREDICATE ON 
dbo.Dim_event AFTER UPDATE

然后修改函数:

【讨论】:

以上是关于SQL Server 2016 改变表值函数——改变安全策略的主要内容,如果未能解决你的问题,请参考以下文章

如何检索 sql server 内联表值函数的返回值的元数据?

为啥我在此 SQL Server 内联表值函数上收到 11555 错误?

SQL Server 中标量、表值和聚合函数之间的区别?

sql server表值函数和视图如何一起使用

SQL Server:表值函数与存储过程

SQL Server:表值函数不适用于子查询