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