EXECUTE AS 与 SETUSER
在 SQL Server 中,可以使用 EXECUTE AS 语句来显式设置在其中执行字符串、命令或模块的上下文。EXECUTE AS 将替换 SETUSER 语句。有关上下文切换的详细信息,请参阅了解上下文切换。
比较上下文切换功能
与 SETUSER 语句相比,EXECUTE AS 具有以下优点:
除 sa 和 dbo 之外的服务器主体或数据库主体可以调用 EXECUTE AS。
调用 EXECUTE AS 语句的用户必须具有目标主体的 IMPERSONATE 权限。
SETUSER 只限制于 sysadmin 固定服务器角色的成员或 db_owner 固定数据库角色的成员。
在语句中显式定义模拟的作用域。
将指定的主体指定为 LOGIN(服务器级模拟),或者指定为 USER(数据库级模拟)。
SETUSER 语句中的模拟作用域是隐式的。如果 sysadmin 的成员调用该语句,将使用服务器级模拟。如果为 dbo 的帐户调用该语句,将使用数据库级模拟。
直到发生下列事件之一时,模拟才会失效:
删除会话。
上下文切换到另一个登录名或用户。
上下文恢复到以前的执行上下文。
对于 SETUSER,模拟将保持有效,直到出现下列情况之一为止:
发出另一个 SETUSER 语句。
当前数据库由为 dbo 的帐户或为 sysadmin 固定服务器角色成员的帐户使用 USE 语句更改。
可以通过对多个主体多次调用 EXECUTE AS 语句来创建执行上下文堆栈。在调用时,REVERT 语句将把上下文切换为上下文堆栈中上一级的登录帐户或用户。有关详细信息,请参阅 EXECUTE AS (Transact-SQL)。
SETUSER 不允许创建执行上下文堆栈。
恢复到以前的上下文
EXECUTE AS
使用 REVERT 语句可以返回到以前的上下文。REVERT 语句的调用方必须位于发生模拟的同一数据库中。
SETUSER
若要返回到以前的上下文,请使用 SETUSER 语句且不指定用户名。