3.5 Execute As
存储过程在安全方面也发挥着重要的作用。你可以授予用户对存储过程的EXECUTE权限,而不授予他们直接访问基对象(underlying object)的权限,这样,你就可以对资源访问进行更为严格的控制。当然,有些例外情况也要求调用者拥有直接权限(direct permission)。要避免调用者拥有直接权限,需要满足下列的所有条件:
n 存储过程和基对象属于同一个架构。
n 操作是静态的(不使用动态SQL)。
n 操作语句是DML(SELECT、INSERT、UPDATE或DELETE)语句,或者执行另一个存储过程。
如果有任何一项条件不满足,调用者都必须拥有访问基对象的直接权限。否则,存储过程中的语句将因为违反安全(security violation)而失败。
这是SQL Server2000中的行为,无法更改。在SQL Server2005中也是这样,只不过现在你可以把存储过程的安全上下文(security context)设置为其他用户的上下文,就像其他用户在运行存储过程一样。创建存储过程时,你可以指定包含下列选项之一的EXECUTE AS子句:
n CALLER (默认值) 调用者的安全上下文。
n SELF 创建或修改该存储过程用户的安全上下文。
n OWNER 数据库所有者的安全上下文。
n ‘user_name’指定用户名称的安全上下文。
前面提到过,如果调用者不必拥有对基对象的直接权限,需要满足一些规则和条件。使用EXECUTE AS子句时,这些规则和条件依然有效,只不过它们应用于有效的用户,不是调用用户(当然,除非你指定CALLER)。
此外,拥有模拟权限的用户可以提交一个独立的EXECUTE AS <选项>命令以模拟另一个实体(登录或用户)。执行后,就好像当前会话的安全上下文被更改为所模拟实体的安全上下文。