在proc中使用sp_executesql时出现"select permission denied"错误(Sql Server 2008)

Dav*_*ave 5 asp.net permissions dynamic-sql sql-server-2008

我正在使用Sql Server 2008并且有一个在内部使用sp_executesql的proc.通过ASP.NET执行proc时,我一直收到以下错误:

对象'MyTable',数据库'MyDatabase',架构'dbo'上的SELECT权限被拒绝.

我已经对此做了大量研究,大多数人都指出我需要在动态查询读取的基础表上授予select权限.好吧,我已经完成了这个,它似乎仍然无法正常工作:

select object_name(major_id) as object,
 user_name(grantee_principal_id) as grantee,
 user_name(grantor_principal_id) as grantor,
 permission_name,
 state_desc
from sys.database_permissions
where major_id = object_id('User') and 
class = 1
Run Code Online (Sandbox Code Playgroud)
Results:
MyTable public  dbo SELECT  GRANT
MyTable guest   dbo SELECT  GRANT
MyTable myuser  dbo SELECT  GRANT
MyTable NT AUTHORITY\NETWORK SERVICE    dbo SELECT  GRANT

正如你所看到的,我试图在基础表上授予select,这已经过度了.我甚至重新编写了我的proc,以便它只在动态sql中引用MyTable.我甚至已经授予所有上述用户"proc"执行权限...没有运气.

上面的"myuser"是web.config中我的connectionstring中的用户名.

我在这里错过了什么吗?

谢谢!戴夫

Dav*_*ave 5

我想到了.将此发布给遇到此问题的其他任何人.

1)首先,我注意到我的dbo用户没有与之关联的登录名.您可以通过右键单击dbo用户的Security/Users文件夹中的dbo用户并单击Properties来查看.在灰色区域中,您应该是用户名(dbo)和登录名(sa).我认为这通常发生在您还原数据库或某些事情时(不确定).无论如何,如果您没有看到登录名,只需在数据库中运行该问题:

sp_changedbowner'sa'

这只是使dbo成为数据库的所有者(或类似的东西).我发现这个的原因是因为我尝试通过这个gui接口保存一些权限,例如"db_datareader","db_datawriter",但是抛出了一个错误,说明需要登录名.我认为dbo应该检查db_owner(我的确如此),我认为无论如何这都胜过其他所有人.

2)为了让我的proc工作,我必须在proc结束时添加"with execute as owner".我以前试过这个,但是因为我的第一个问题#1而认为它不起作用.Proc通常在proc的所有者下运行,但在procs中不是动态sql.它们在用户执行proc的上下文中运行.对我来说这很奇怪,因为我认为我需要在动态sql(我试过)中添加它,但它需要在proc本身(去图?)

3)运行此脚本也可能不会受到影响:

将'MyTable'上的选择授予'MyUser'

对于动态sql中使用的每个表.

希望这可以帮助...

这里有一些对同一问题的引用:

http://www.jimmcleod.net/blog/index.php/2007/05/15/sp_executesql-breaks-chain-of-ownership-in-sql-server-2000/

http://kbalertz.com/301299/Security-Context-Dynamic-Statements-Inside-Stored-Procedure.aspx

http://www.mssqltips.com/tipprint.asp?tip=1822