执行 CLR 触发器的权限

Permissions to execute CLR Triggers

我继承了一个带有 CLR 触发器的应用程序,正在尝试将数据库迁移到另一台服务器。

我的应用程序用户在数据库上有 db_owner,但在执行时出现错误。

这似乎与权限相关,因为当我将应用程序用户提升为 sysadmin 时,一切都会正确触发。

但这看起来超级可怕"fix"。

源服务器也有用户作为 sysadmin 所以我猜他们也无法解决这个问题。只是为了好玩,我在系统 table 上也给了用户 db_owner,因为它似乎试图读取锁和其他 sys table 项目。仍然没有运气。

需要授予用户什么权限才能执行 SAFE CLR 触发器?

此触发器似乎用于审核。它在某些数据发生更改并记录差异时触发,检查插入和删除的 tables 并查询哪些 tables 有锁以确定 activity 发生的位置。

从纯 SQLCLR 的角度来看,标记为 SAFE 的程序集不应需要任何特殊权限。标记为 EXTERNAL_ACCESSUNSAFE 的程序集需要一些额外的设置。但是,有两个与权限相关的问题需要注意:

  1. 从 SQLCLR 对象中提交的所有 T-SQL,就其本质而言,来自应用程序代码并在运行中提交(因此未预处理),动态 SQL。而 Dynamic SQL 打破了所有权链,否则允许执行存储过程来推断底层对象的权限。这很容易通过以下方式解决:

    • 签署程序集/DLL
    • 在包含程序集的数据库中创建非对称密钥 FROM 程序集
    • 在包含来自非对称密钥的程序集的数据库中创建用户
    • 授予新用户对触发器中访问的对象的适当权限
    • Trigger执行时,会继承这个新User的权限

    但是,这可能不是实际问题,因为您已将您的应用程序用户置于 db_owner 数据库角色中,该角色应该具有访问所有对象的权限数据库(假设没有明确的DENY)。

  2. 既然你提到触发器正在查看锁定信息,假设它来自 sys.dm_tran_locks,那么应用程序登录需要服务器级别的 VIEW SERVER STATE 权限(因此应用程序登录而不是应用程序用户,这是数据库级别的)。我怀疑将用户置于 db_owner 数据库角色中会推断出此权限,因为该角色仅限于数据库。您还提到将登录添加到 sysadmin 服务器角色允许触发器工作,这似乎进一步证明这可能是真正的问题。