EXECUTE AS и SETUSER: сравнение

В сервере SQL Server контекст, в котором выполняется строка, команда или модуль, можно установить явно инструкцией EXECUTE AS. Инструкция EXECUTE AS заменяет инструкцию SETUSER. Дополнительные сведения о переключении контекста см. в разделе Основные сведения о переключении контекста.

Сравнение возможностей переключения контекста

По сравнению с инструкцией SETUSER инструкция EXECUTE AS обладает следующими преимуществами:

  • Инструкцию EXECUTE AS могут вызывать не только sa и dbo, но и другие участники сервера или базы данных.

    Пользователь, который вызывает инструкцию EXECUTE AS, должен иметь разрешение IMPERSONATE для целевого участника.

    Инструкция SETUSER ограничена членами предопределенной роли сервера sysadmin или предопределенной роли базы данных db_owner.

  • Область олицетворения явно определяется в инструкции.

    Участник задается в форме имени входа при олицетворении на уровне сервера или в форме имени пользователя при олицетворении на уровне базы данных.

    Область олицетворения в инструкции SETUSER не является явной. Если инструкция вызывается членом sysadmin, применяется олицетворение на уровне сервера. Если инструкция вызывается учетной записью, принадлежащей dbo, применяется олицетворение на уровне базы данных.

  • Олицетворение действует до тех пор, пока не происходит одно из следующих событий:

    • Сеанс закрывается.

    • Контекст переключается на другое имя входа входа или пользователя.

    • Контекст выполнения восстанавливается в предыдущее состояние.

    При использовании инструкции SETUSER олицетворение действует до тех пор, пока не происходит одно из следующих событий:

    • Вызывается другая инструкция SETUSER.

    • С помощью инструкции USE учетной записью dbo или членом предопределенной роли сервера sysadmin выбирается другая база данных.

  • Стек контекстов выполнения можно создать вызовом нескольких инструкций EXECUTE AS для нескольких участников. При вызове инструкция REVERT переключает контекст на имя входа или имя пользователя следующего уровня стека. Дополнительные сведения см. в разделе EXECUTE AS (Transact-SQL).

    Инструкция SETUSER не поддерживает создание стека контекста выполнения.

Восстановление предыдущего контекста

Инструкция EXECUTE AS

Для восстановления предыдущего контекста используется инструкция REVERT. Объект, вызывающий инструкцию REVERT, должен находиться в базе данных, в которой произошло олицетворение.

Инструкция SETUSER

Для восстановления предыдущего контекста достаточно вызвать инструкцию SETUSER, не указывая имя пользователя.