在存储过程中选择权限?

xdu*_*ine 10 sql-server-2008 sql-server permissions dynamic-sql

我已授予用户执行使用动态 SQL 的存储过程的权限。但是当他试图执行它时,他得到了错误:

对象“[表名]”、数据库“[数据库名]”、架构“dbo”的 SELECT 权限被拒绝。

用户是否需要被授予存储过程使用的任何表的权限?那对我来说真的没有任何意义。

Wor*_*DBA 7

好的,根据上述评论和我的怀疑 - 似乎您正在尝试在存储过程中执行动态 SQL。

您需要记住的是,当您执行此操作时,它不会在存储过程的上下文中执行 - 它会在新会话中执行。因此,在存储过程中调用语句这一事实是有争议的,您需要对动态 SQL 正在使用的对象授予显式权限。

如果您不想这样做,我会重构您的存储过程以不使用动态 SQL。

以下来自 Microsoft 的链接应该可以帮助您解决问题:

PRB:存储过程中动态 SQL 语句的安全上下文(Wayback Machine 存档)

出现此行为的原因是动态执行查询(sp_executesql 或 EXECUTE)在与主存储过程不同的上下文中执行;它在执行存储过程的用户的安全上下文中执行,而不是在存储过程所有者的安全上下文中执行。

这也在(更新的)Microsoft Docs 文章中进行了讨论:

在 SQL Server 中编写安全的动态 SQL

在过程代码中执行动态创建的 SQL 语句会破坏所有权链,导致 SQL Server 根据动态 SQL 访问的对象检查调用者的权限。