2010-02-03 35 views
5

我正在使用Sql Server 2008并且有一个内部使用sp_executesql的proc。通过ASP.NET执行过程时,我不断收到以下错误:在proc中使用sp_executesql时出现“select permission denied”错误

在对象'MyTable',数据库'MyDatabase',模式'dbo'上拒绝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 
Results: 
MyTable public dbo SELECT GRANT 
MyTable guest dbo SELECT GRANT 
MyTable myuser dbo SELECT GRANT 
MyTable NT AUTHORITY\NETWORK SERVICE dbo SELECT GRANT 

正如你所看到的,我在想授予在基础表上选择了矫枉过正。我甚至重写了我的proc,以便它只在动态sql中引用MyTable。我甚至授予所有上述用户对执行程序的“执行”权限......没有运气。

上面的“myuser”是web.config中连接字符串中的用户名。

我在这里错过了什么吗?

谢谢! Dave

+1

存储过程是否定义了“WITH EXECUTE AS”? – Aaronaught 2010-02-04 00:18:39

+0

是的......用“我的用户”,来电者,自己,老板试了一下。还有其他我错过了吗?有趣的是,当我使用MyUser时,它会在管理工作室查询窗口中引发同样的错误(但如果没有它,则不会) – Dave 2010-02-04 00:38:11

回答

4

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

1)首先,我注意到我的dbo用户没有与它关联的登录名。您可以通过在dbo用户的Security/Users文件夹中右键单击dbo用户并单击Properties来查看。在灰色区域,您应该使用用户名(dbo)和登录名(sa)。我认为这通常发生在你恢复你的数据库或其他东西时(不确定)。无论如何,如果你看不到登录名,只是这个问题的数据库运行脚本:

sp_changedbowner的“山”

这只是使DBO数据库的所有者(或类似的东西)。我发现这个的原因是因为我尝试通过这个GUI界面保存一些权限,例如“db_datareader”,“db_datawriter”,但是抛出一个错误,说明需要登录名。我认为dbo应该有db_owner检查(我的),我认为这胜过所有其他人。

2)为了让我的proc工作,我必须在proc结尾添加“with execute as owner”。我之前尝试过,但认为它没有工作,因为我的第一个问题#1。 Procs通常运行在proc的所有者之下,但不包含proc中的动态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

+1

您应该将答案标记为正确答案。 – 2010-02-10 18:39:03

0

什么帮助我的是:

在SQL Management Studio中,右键单击存储过程并选择“属性”,然后在“权限”页面上授予权限对相关用户的误解。相关的用户取决于你的SQL连接字符串:如果你使用的是Windows身份验证,那么它是Windows用户(如果这样配置,它可能是ASPNET);否则它是您在连接字符串中指定的SQL用户。您需要授予的权限是执行权限。

相关问题