GRANT EXECUTE对存储过程是否允许您访问其中的所有对象?

时间:2014-09-30 09:28:51

标签: sql tsql sql-server-2008-r2

我有一个程序从另一个数据库的表中选择数据,并使用sp_send_dbmail。似乎在过程内的跨数据库调用中拒绝执行权限。

有人可以确认我对这些跨数据库对象也需要单独的权限,或者有没有办法授予执行权限,以便它可以访问该proc下的任何内容?

这是用于授予执行权限的SQL语句:

GRANT EXECUTE ON OBJECT::uspAppStoredProcedure TO AppRole;

这是我得到的错误:

  

对象'sp_send_dbmail'上的EXECUTE权限被拒绝,   数据库'msdb',架构'dbo'。

我尝试从另一个数据库中选择数据时遇到了类似的错误。

1 个答案:

答案 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

这将允许您创建一个存储过程,允许特定用户执行它,同时避免必须直接向用户授予对底层对象的权限。