使用“执行sp_Executesql”时的权限

时间:2010-09-28 19:54:39

标签: sql sql-server permissions dynamic-sql sp-executesql

我有一个数据库,其中所有访问都由存储过程控制。 DBA希望避免为用户提供对基础表的直接读/写访问权限,这是我能理解的。因此,所有数据的更新和选择都是通过存储过程完成的。基本上,他创建了一个角色,该角色对数据库中的所有存储过程具有EXECUTE权限,并为用户提供该角色。

问题是其中一个存储过程动态构建SQl查询并通过“Execute sp_Executesql”执行它。在不详细说明的情况下,查询是动态构建的,因为它会根据许多用户输入参数而显着变化。有问题的存储过程只是一个SELECT sql语句,但我发现只是给存储过程EXECUTE权限是不够的。存储过程中引用的使用“执行sp_Executesql”的基础表需要被赋予“datareader”访问权限,否则存储过程将失败。

有关如何纠正此问题的任何想法?我真的想将对表的访问限制为仅存储过程,但我需要找到一种方法来解决使用“Execute sp_Executesq”l的存储过程。谢谢。

2 个答案:

答案 0 :(得分:13)

在包装程序中,您可以使用EXECUTE AS OWNEREXECUTE AS SomeuserWithNoLogin

这将更改存储过程持续时间的登录上下文,其中包括sp_executesql。

  • 如果您使用OWNER,它将起作用,因为您已经在使用所有权链接。
  • 如果您的DBA(好人!)不希望您以dbo身份运行,那么请设置一个具有完全读取但没有权限的用户。 EXECUTE AS <user>要求参赛作品为sys.database_principals

像这样:

CREATE USER SomeuserWithNoLogin WITH WITHOUT LOGIN
EXEC sp_addrolemember 'db_datareader', 'SomeuserWithNoLogin'

有关详细信息,请参阅EXECUTE AS Clause on MSDNCREATE PROCEDURE

答案 1 :(得分:-3)

真正的问题是sp_Executesql位于master数据库中,不一定是你工作的数据库。你的DBA必须给调用过程赋予执行sp_Executesql权限。任何有权调用该过程的人都可以运行sp_Executesql。