执行 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_ACCESS
或 UNSAFE
的程序集需要一些额外的设置。但是,有两个与权限相关的问题需要注意:
从 SQLCLR 对象中提交的所有 T-SQL,就其本质而言,来自应用程序代码并在运行中提交(因此未预处理),动态 SQL。而 Dynamic SQL 打破了所有权链,否则允许执行存储过程来推断底层对象的权限。这很容易通过以下方式解决:
- 签署程序集/DLL
- 在包含程序集的数据库中创建非对称密钥 FROM 程序集
- 在包含来自非对称密钥的程序集的数据库中创建用户
- 授予新用户对触发器中访问的对象的适当权限
- Trigger执行时,会继承这个新User的权限
但是,这可能不是实际问题,因为您已将您的应用程序用户置于 db_owner
数据库角色中,该角色应该具有访问所有对象的权限数据库(假设没有明确的DENY
)。
既然你提到触发器正在查看锁定信息,假设它来自 sys.dm_tran_locks,那么应用程序登录需要服务器级别的 VIEW SERVER STATE
权限(因此应用程序登录而不是应用程序用户,这是数据库级别的)。我怀疑将用户置于 db_owner
数据库角色中会推断出此权限,因为该角色仅限于数据库。您还提到将登录添加到 sysadmin
服务器角色允许触发器工作,这似乎进一步证明这可能是真正的问题。
我继承了一个带有 CLR 触发器的应用程序,正在尝试将数据库迁移到另一台服务器。
我的应用程序用户在数据库上有 db_owner
,但在执行时出现错误。
这似乎与权限相关,因为当我将应用程序用户提升为 sysadmin
时,一切都会正确触发。
但这看起来超级可怕"fix"。
源服务器也有用户作为 sysadmin
所以我猜他们也无法解决这个问题。只是为了好玩,我在系统 table 上也给了用户 db_owner
,因为它似乎试图读取锁和其他 sys
table 项目。仍然没有运气。
需要授予用户什么权限才能执行 SAFE CLR
触发器?
此触发器似乎用于审核。它在某些数据发生更改并记录差异时触发,检查插入和删除的 tables 并查询哪些 tables 有锁以确定 activity 发生的位置。
从纯 SQLCLR 的角度来看,标记为 SAFE
的程序集不应需要任何特殊权限。标记为 EXTERNAL_ACCESS
或 UNSAFE
的程序集需要一些额外的设置。但是,有两个与权限相关的问题需要注意:
从 SQLCLR 对象中提交的所有 T-SQL,就其本质而言,来自应用程序代码并在运行中提交(因此未预处理),动态 SQL。而 Dynamic SQL 打破了所有权链,否则允许执行存储过程来推断底层对象的权限。这很容易通过以下方式解决:
- 签署程序集/DLL
- 在包含程序集的数据库中创建非对称密钥 FROM 程序集
- 在包含来自非对称密钥的程序集的数据库中创建用户
- 授予新用户对触发器中访问的对象的适当权限
- Trigger执行时,会继承这个新User的权限
但是,这可能不是实际问题,因为您已将您的应用程序用户置于
db_owner
数据库角色中,该角色应该具有访问所有对象的权限数据库(假设没有明确的DENY
)。既然你提到触发器正在查看锁定信息,假设它来自 sys.dm_tran_locks,那么应用程序登录需要服务器级别的
VIEW SERVER STATE
权限(因此应用程序登录而不是应用程序用户,这是数据库级别的)。我怀疑将用户置于db_owner
数据库角色中会推断出此权限,因为该角色仅限于数据库。您还提到将登录添加到sysadmin
服务器角色允许触发器工作,这似乎进一步证明这可能是真正的问题。