我有这个存储过程,使用几个内部联接进行选择查询(其中一个表位于另一个数据库中)。现在,我必须将此查询编写为动态原因首先我必须找到选择查询应运行的db。无论如何,没有一个表对它们有权限,只是授予数据库角色“personel”(包括每个人)的存储过程的权限。
但是现在,具有personel角色的人运行此存储过程,他们收到错误“对象'tbl_table',数据库'Db',架构'dbo'上的SELECT权限被拒绝。”模式没有区别,并且还有其他使用同一个表正常运行的过程。
可以使用动态查询(exec(使用DB;选择...))吗?就像它是动态的一样,我也应该赋予表权限吗?
由于
答案 0 :(得分:1)
是的,这可能就是原因。阅读this以获得解释和可能的解决方案。
答案 1 :(得分:1)
简短的回答是肯定的。
编译存储过程时,将检查创建存储过程的用户/登录的权限。当其他人执行它时,他们阅读这些表的能力不再相关(在大多数情况下),而只是他们执行SP的能力。
但是,在执行动态代码时,必须在那里检查有关表的权限。这意味着正在检查正在执行的用户的权限。