【发布时间】:2011-04-18 10:36:44
【问题描述】:
我有一个 SQL Server 2008 数据库,其中对基础表的所有访问都是通过存储过程完成的。一些存储过程只是从表中选择记录,而其他存储过程则更新、插入和删除。
如果存储过程更新表,执行存储过程的用户是否也需要对受影响的表具有 UPDATE 权限,或者他们对存储过程具有 EXECUTE 权限这一事实是否足够?
基本上,我想知道授予用户对存储过程的 EXECUTE 权限是否足够,或者我是否需要授予他们对表的 SELECT、UPDATE、DELETE 和 INSERT 权限才能使存储过程正常工作。谢谢。
[EDIT] 在我的大多数存储过程中,确实看起来 EXECUTE 就足够了。但是,我确实发现在使用“Execute sp_Executesql”的存储过程中,EXECUTE 是不够的。所涉及的表需要具有在“sp_Executesql”中执行的操作的权限。
【问题讨论】:
-
恐怕在使用动态 SQL 查询时,您需要授予对底层对象的权限。我已经更新了答案以反映这一点。
-
@Noel - 你是对的。我发现我需要允许 datareader 访问用户的表。值得庆幸的是,这对我来说不是问题,因为所有用户都可以查看所有数据。
-
在另一个答案中,@RemusRusanu 链接到一个替代方案:1)创建证书; 2)创建与该证书关联的用户; 3) 授予用户适当的权利[对受保护的资源];和 4) 每次更改 sproc (stackoverflow.com/a/4081604/6894566, 链接到: sommarskog.se/grantperm.html#Certificates ) 时使用证书对 sproc 进行签名。签名将证书用户权限添加到当前用户令牌中,SQL Server 在调用系统过程和通过 EXEC() 或 sp_executesql 调用的动态 SQL 时保留该权限。所以存储过程成功了。
标签: sql-server stored-procedures permissions