EXECUTE AS 与 SETUSER

在 SQL Server 中,可以使用 EXECUTE AS 语句来显式设置在其中执行字符串、命令或模块的上下文。EXECUTE AS 将替换 SETUSER 语句。有关上下文切换的详细信息,请参阅了解上下文切换

比较上下文切换功能

与 SETUSER 语句相比,EXECUTE AS 具有以下优点:

  • sadbo 之外的服务器主体或数据库主体可以调用 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 语句且不指定用户名。