我有一个程序从另一个数据库的表中选择数据,并使用sp_send_dbmail
。似乎在过程内的跨数据库调用中拒绝执行权限。
有人可以确认我对这些跨数据库对象也需要单独的权限,或者有没有办法授予执行权限,以便它可以访问该proc下的任何内容?
这是用于授予执行权限的SQL语句:
GRANT EXECUTE ON OBJECT::uspAppStoredProcedure TO AppRole;
这是我得到的错误:
对象'sp_send_dbmail'上的EXECUTE权限被拒绝, 数据库'msdb',架构'dbo'。
我尝试从另一个数据库中选择数据时遇到了类似的错误。
答案 0 :(得分:2)
此行为由cross db ownership chaining
option in SQL Server, which is disabled by default.
uspAppStoredProcedure
正在尝试在其所有权链之外执行存储过程,因此需要授予显式权限才能执行sp_send_dbmail
。
可以在所涉及的数据库上启用所有权链接,这将消除授予特定权限的需要,但这样做会带来安全风险......因此,根据需要授予显式访问权限可能会更好。
This article goes into additional details on cross database ownership chaining.
另一个可能的解决方案是在定义存储过程时使用EXECUTE AS子句,这样您就可以在不同用户的上下文中执行described in this article。
这将允许您创建一个存储过程,允许特定用户执行它,同时避免必须直接向用户授予对底层对象的权限。