2011-04-07 60 views
1

我有这个存储过程,用两个内部联接(其中一个表在另一个数据库)执行选择查询。现在,我不得不将这个查询写为动态原因,首先我必须找到选择查询应该运行哪个数据库。无论如何,这些表都没有权限,只是授予数据库角色“personel”(包括所有人)的存储过程权限。在存储过程中运行的动态查询的权限问题

但是现在,有个人角色的人运行这个存储过程,他们得到错误“SELECT权限在对象'tbl_table',数据库'Db',模式'dbo'上被拒绝。在架构中没有区别,还有其他使用正常运行的同一个表的proc。

可以使用动态查询(exec(Use DB; select ...))是这个原因吗?就像因为它是动态的,我应该给这些表的权限呢?

谢谢

回答

1

简短的回答是肯定的。

编译存储过程时,将检查创建存储过程的用户/登录的权限。当其他人执行它时,他们读取这些表的能力不再相关(在大多数情况下),而只是他们执行SP的能力。

但是,执行动态代码时,必须在那里检查有关表的权限。这意味着执行用户的权限正在被检查。

+0

感谢您的回答。猜猜我应该决定给予表的权限还是将动态查询改为正常的。 – futile 2011-04-07 12:27:40

1

是的,这可能是原因。阅读this以获得解释和可能的解决方案。

+0

感谢您的答案和链接。 – futile 2011-04-07 12:28:31