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中的用户名.
我在这里错过了什么吗?
谢谢!戴夫
我想到了.将此发布给遇到此问题的其他任何人.
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://kbalertz.com/301299/Security-Context-Dynamic-Statements-Inside-Stored-Procedure.aspx
http://www.mssqltips.com/tipprint.asp?tip=1822
| 归档时间: |
|
| 查看次数: |
4557 次 |
| 最近记录: |