【问题标题】:The SELECT permission was denied on the object 'fn_dblog', database 'mssqlsystemresource', schema 'sys'对象“fn_dblog”、数据库“mssqlsystemresource”、模式“sys”的 SELECT 权限被拒绝
【发布时间】:2021-01-16 08:56:30
【问题描述】:

我创建了一个用户并授予他运行 sp 的权限。该 sp 还必须根据工作类型更新表。

但是当用户运行sp时,却报错:

The SELECT permission was denied on the object 'fn_dblog', database 'mssqlsystemresource', schema 'sys'.

有没有人能解决这个问题?

【问题讨论】:

  • fn_dblog 不是一个过程。这是一个系统表函数,需要一些额外的权限
  • 我说当用户想运行我写的sp时,她得到了这个错误!
  • 这是未记录的功能。显然,它需要您考虑的更多权限 - 如here 所述。更好的问题是为什么“用户”需要这样做。
  • 因为我在触发器中发现了这个函数

标签: sql sql-server


【解决方案1】:

使用fn_dblog系统表值函数所需的权限是sysadmin角色成员资格。

重要的是,此函数未记录在案,因此不应在应用程序代码中使用它,尤其是用于更新表。

编辑:

您的评论表明该函数已在触发器中使用。您可以创建一个证书和作为系统管理员角色成员的证书用户,如here 所述,然后使用该证书签署触发器。这将为触发器代码授予系统管理员权限,并允许非系统管理员用户使用该功能,但只能在触发器的上下文中使用。

我通常会在我的回答中包含一个示例 T-SQL 脚本,但我强烈建议您不要在应用程序代码中使用未记录的系统函数。

您有一个经典的XY problem,需要以不同的方式解决。问一个关于如何在不使用fn_dblog 的情况下提供所需功能的新问题。在问题中包含您现有的代码。

【讨论】:

  • 如何在不授予系统管理员权限的情况下在 SQL Server 中授予选择此功能?
  • @akbari,不要去那里。请参阅我的更新答案。
  • 我同意你的观点,使用这个功能是不正确的。但现在我必须走同样的路来改进未来的程序。我读了你发给我的链接。我制作了证书,我达到了步骤 4.4。 GRANT VIEW DEFINITION ON Playtable TO my_first_cert_user 在这个问题上,我应该怎么做而不是 VIEW DEFINITION 我放?
  • 感谢您抽出宝贵时间解决此问题
  • @akbari,不要为您的用例授予权限。创建证书并登录master,将证书登录添加到sysadmin角色,将证书复制到您的用户db,并签署触发器。执行此操作的脚本在本文的各个部分中,但您应该关注第 5 部分,服务器级权限。
猜你喜欢
  • 2010-12-01
  • 1970-01-01
  • 2013-01-10
  • 2018-04-17
  • 2011-03-27
  • 1970-01-01
  • 2010-11-14
  • 2010-09-25
  • 2014-02-06
相关资源
最近更新 更多