2010-09-28 90 views
7

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

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

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

+0

您可能会得到更好的avdice serverfault。我的建议 - 与dba交谈并解释情况。与他们合作以获得正确的权限。 – 2010-09-28 19:58:16

回答

-3

真正的问题是,sp_Executesql在主数据库中,而不一定是您工作的数据库。您的DBA必须为调用过程执行sp_Executesql权限。任何有权调用该过程的人都可以运行sp_Executesql。

+1

-1 sp_Executesql已公开执行。 “需要加入公共角色。” http://msdn.microsoft.com/en-us/library/ms188001.aspx当您使用sp_executesql时,真正的问题是所有权链断裂请参阅http://stackoverflow.com/questions/3815411 – gbn 2010-09-28 20:13:18

+1

如果您已经硬化数据库锁定公共角色,那么@ MAW74656是正确的;例如,您创建了一个自定义角色来替换公共角色,并从公共角色中删除所有权限。是的,这违背了文档化的要求,但像AppDetective这样的数据库强化扫描系统(通过SQL Server STIG)将公共角色及其默认开放访问作为主要风险。 – Draghon 2016-01-05 17:33:43

+0

...此外,引用相同的MSDN文章,“运行时间编译的Transact-SQL语句可以使应用程序遭受恶意攻击。”这比“要求参与公共角色”声明更显着。 – Draghon 2016-01-08 20:10:34

12

在包装PROC可以使用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