我有一个数据库,其中所有访问都由存储过程控制。 DBA希望避免为用户提供对基础表的直接读/写访问权限,这是我能理解的。因此,所有数据的更新和选择都是通过存储过程完成的。基本上,他创建了一个角色,该角色对数据库中的所有存储过程具有EXECUTE权限,并为用户提供该角色。
问题是其中一个存储过程动态构建SQl查询并通过“Execute sp_Executesql”执行它。在不详细说明的情况下,查询是动态构建的,因为它会根据许多用户输入参数而显着变化。有问题的存储过程只是一个SELECT sql语句,但我发现只是给存储过程EXECUTE权限是不够的。存储过程中引用的使用“执行sp_Executesql”的基础表需要被赋予“datareader”访问权限,否则存储过程将失败。
有关如何纠正此问题的任何想法?我真的想将对表的访问限制为仅存储过程,但我需要找到一种方法来解决使用“Execute sp_Executesq”l的存储过程。谢谢。
答案 0 :(得分:13)
在包装程序中,您可以使用EXECUTE AS OWNER
或EXECUTE AS SomeuserWithNoLogin
这将更改存储过程持续时间的登录上下文,其中包括sp_executesql。
EXECUTE AS <user>
要求参赛作品为sys.database_principals
像这样:
CREATE USER SomeuserWithNoLogin WITH WITHOUT LOGIN
EXEC sp_addrolemember 'db_datareader', 'SomeuserWithNoLogin'
有关详细信息,请参阅EXECUTE AS Clause on MSDN和CREATE PROCEDURE
答案 1 :(得分:-3)
真正的问题是sp_Executesql位于master数据库中,不一定是你工作的数据库。你的DBA必须给调用过程赋予执行sp_Executesql权限。任何有权调用该过程的人都可以运行sp_Executesql。