我遇到了一个问题,其中在SQL Server 2005中授予对特定存储过程的EXECUTE权限不起作用。一些测试人员弄乱了权限- 并发现,如果他们还对存储过程授予了CONTROL权限-则运行正常。现在,他们确信授予CONTROL权限是必经之路。
我知道这不是真的-实际上,我认为真正的问题是用户对存储过程所依据的表没有选择/插入/更新/删除权限。问题是,我似乎无法在网上找到任何可以证明这一点的东西。
我对么?是否有人知道有关此的任何文档?
提前致谢。
更多信息以回应评论:存储过程正在执行多次删除。它首先删除将被删除的“主”记录孤立的所有记录,然后最后删除父记录。
同样,我们看到的错误表明用户没有足够的权限-或存储过程不存在。我们已经确认我们使用的是正确的用户,并且已向该用户授予EXECUTE权限。
如果存储过程是使用EXECUTE AS CALLER创建的(我相信这是默认设置),那么调用者除执行过程中的EXECUTE之外,还必须具有执行存储过程所必需的所有权限。
从用于EXECUTE AS的SQL Server文档中:
CALLER指定模块内部的语句在模块调用者的上下文中执行。执行模块的用户不仅必须对模块本身具有适当的权限,而且还必须对模块所引用的任何数据库对象都具有适当的权限。
请注意,由于SQL Server使用所有权链处理权限检查的方式,并非总是严格如此,而且我猜想在过程上授予CONTROL(将所有权状态授予被授予者)会导致这些权限检查成为绕过。
如果使用EXECUTE AS OWNER创建该过程,则除了该过程的EXECUTE之外,您无需授予任何权限。