如果存储过程是使用EXECUTE AS
CALLER创建的(我相信这是默认设置),那么调用者除执行过程中的EXECUTE之外,还必须具有执行存储过程所必需的所有权限。
从用于EXECUTE AS的SQL Server文档中:
CALLER指定模块内部的语句在模块调用者的上下文中执行。执行模块的用户不仅必须对模块本身具有适当的权限,而且还必须对模块所引用的任何数据库对象都具有适当的权限。
请注意,由于SQL
Server使用所有权链处理权限检查的方式,并非总是严格如此,而且我猜想在过程上授予CONTROL(将所有权状态授予被授予者)会导致这些权限检查成为绕过。
如果使用EXECUTE AS OWNER创建该过程,则除了该过程的EXECUTE之外,您无需授予任何权限。



