我有一个SQL Server 2008数据库,通过存储过程完成对基础表的所有访问。有些存储过程只是从表中选择记录,而另一些则是UPDATE,INSERT和DELETE。存储过程和权限 - 是否EXECUTE足够?
如果一个存储过程更新一个表,执行存储过程的用户是否也需要对受影响的表的UPDATE权限,或者是他们对该存储过程具有足够EXECUTE权限的事实?
基本上我想知道如果给存储过程的用户EXECUTE权限是否足够或者我需要给他们SELECT,UPDATE,DELETE和INSERT权限的表,以便存储过程的工作。谢谢。
[编辑]在我的大多数存储过程中,确实看起来EXECUTE已经足够。但是,我发现在执行“执行sp_Executesql”的存储过程中,EXECUTE不够用。涉及的表需要具有“sp_Executesql”中正在执行的操作的权限。
恐怕在使用动态SQL查询时,您需要授予底层对象的权限。我已经更新了答案以反映这一点。 – 2010-09-29 08:04:38
@Noel - 你是对的。我发现我需要允许数据读取器访问用户的表格。谢天谢地,这不是我的情况,因为所有用户都被允许查看所有数据。 – webworm 2010-10-05 14:38:25
在另一个答案中,@RemusRusanu链接到一个替代方案:1)创建一个证书; 2)创建与该证书关联的用户; 3)授予用户适当的权利[对受保护的资源];和4)用证书签名sproc,每次更改sproc(stackoverflow.com/a/4081604/6894566,链接到:sommarskog.se/grantperm.html#Certificates)。签名将证书用户权限添加到当前用户令牌,SQL Server在调用通过EXEC()或sp_executesql调用的系统过程和动态SQL时保留该权限。所以这个sproc成功了。 – iokevins 2017-08-08 21:11:40