Compartir a través de


EXECUTE AS (Transact-SQL)

Establece el contexto de ejecución de una sesión.

De forma predeterminada, una sesión empieza cuando un usuario inicia la sesión y termina cuando el usuario la cierra. Todas las operaciones durante una sesión están sujetas a comprobaciones de permisos de ese usuario. Cuando se ejecuta una instrucción EXECUTE AS, el contexto de ejecución de la sesión se cambia al nombre de usuario o inicio de sesión especificado. Después de cambiar el contexto, los permisos se comprueban con los testigos de seguridad del usuario y el inicio de sesión de esa cuenta en vez de los de la persona que llama a la instrucción EXECUTE AS. Básicamente, la cuenta de inicio de sesión o usuario se suplanta durante la ejecución del módulo o la sesión, o el cambio de contexto se revierte de forma explícita. Para obtener más información sobre el contexto de ejecución, vea Descripción del contexto de ejecución. Para obtener más información sobre el cambio de contexto, vea Descripción del cambio de contexto.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

{ EXEC | EXECUTE } AS <context_specification>
[;]

<context_specification>::=
{ LOGIN | USER } = 'name'
    [ WITH { NO REVERT | COOKIE INTO @varbinary_variable } ] 
| CALLER

Argumentos

  • LOGIN
    Especifica que el contexto de ejecución que se va a suplantar es un inicio de sesión. El ámbito de la suplantación se produce en el nivel de servidor.

  • USER
    Especifica que el contexto de ejecución que se va a suplantar es un usuario de la base de datos actual. El ámbito de la suplantación se restringe a la base de datos actual. Un cambio de contexto a un usuario de base de datos no hereda los permisos en el nivel de servidor de ese usuario.

    Nota importanteImportante

    Mientras el cambio de contexto al usuario de base de datos esté activo, cualquier intento de acceso a recursos fuera de la base de datos provocará que la instrucción genere errores. Esto incluye instrucciones USE database, consultas distribuidas y consultas que hacen referencia a otra base de datos que utiliza identificadores de tres o cuatro partes. Para extender el ámbito del cambio de contexto fuera de la base de datos actual, vea Extender la suplantación de la base de datos mediante EXECUTE AS.

  • 'name'
    Es un inicio de sesión o usuario válido. name debe ser miembro de la función fija de servidor sysadmin o existir como entidad de seguridad en sys.database_principals o sys.server_principals, respectivamente.

    name se puede especificar como una variable local.

    name debe ser una cuenta singleton y no puede ser un grupo, función, certificado, clave o cuenta integrada, como NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService o NT AUTHORITY\LocalSystem.

    Para obtener más información, vea Especificar un nombre de inicio de sesión o usuario más adelante en este tema.

  • NO REVERT
    Especifica que el cambio de contexto no se puede volver al contexto anterior.

    Para obtener más información acerca de cómo volver al contexto anterior, vea REVERT (Transact-SQL).

  • COOKIE INTO **@**varbinary_variable
    Especifica que el contexto de ejecución sólo se puede volver al contexto anterior si la llamada a la instrucción REVERT WITH COOKIE contiene el valor de **@**varbinary_variable correcto. Database Engine (Motor de base de datos) pasa la cookie a **@**varbinary_variable.

    **@**varbinary_variable es varbinary(100).

  • CALLER
    Cuando se utiliza dentro de un módulo, especifica que las instrucciones dentro del módulo se ejecutan en el contexto del llamador del módulo

    Cuando se utiliza fuera de un módulo, la instrucción no tiene ninguna acción.

Notas

El cambio en el contexto de ejecución continúa efectivo hasta que sucede algo de lo siguiente:

  • Se ejecuta otra instrucción EXECUTE AS.

  • Se ejecuta una instrucción REVERT.

  • Se elimina la sesión.

Puede crear una pila de contextos de ejecución si llama a la instrucción EXECUTE AS varias veces en diversas entidades de seguridad. Cuando se llama, la instrucción REVERT cambia el contexto al inicio de sesión o el usuario del siguiente nivel en la pila de contextos. Para obtener una demostración de este comportamiento, vea el Ejemplo A.

Especificar un nombre de inicio de sesión o usuario

El nombre de inicio de sesión o usuario especificado en EXECUTE AS <context_specification> debe existir como una entidad de seguridad en sys.database_principals o sys.server_principals respectivamente, o la instrucción EXECUTE AS generará errores. Además, se deben conceder permisos IMPERSONATE en la entidad de seguridad. A menos que el llamador sea el propietario de la base de datos, o sea un miembro de la función fija de servidor sysadmin, la entidad de seguridad debe existir aun cuando el usuario tenga acceso a la base de datos o instancia de SQL Server mediante la pertenencia a un grupo de Windows. Por ejemplo, supongamos las siguientes condiciones:

  • El grupo CompanyDomain\SQLUsers tiene acceso a la base de datos Sales.

  • CompanyDomain\SqlUser1 es un miembro de SQLUsers y, por tanto, tiene acceso implícito a la base de datos Sales.

Aunque CompanyDomain\SqlUser1 tiene acceso a la base de datos a través de la pertenencia el grupo SQLUsers, la instrucción EXECUTE AS USER = 'CompanyDomain\SqlUser1' generará errores porque CompanyDomain\SqlUser1 no existe como una entidad de seguridad en la base de datos.

Si el usuario está huérfano (el inicio de sesión asociado ya no existe) y no se creó con WITHOUT LOGIN, se producirá un error EXECUTE AS para el usuario.

Práctica recomendada

Especifique un inicio de sesión o usuario que tenga al menos los privilegios requeridos para realizar las operaciones en la sesión. Por ejemplo, no especifique un nombre de inicio de sesión con permisos en el nivel de servidor, si sólo se necesitan permisos en el nivel de base de datos; o no especifique una cuenta de propietario de base de datos a menos que se requieran esos permisos.

Usar WITH NO REVERT

Cuando la instrucción EXECUTE AS incluye la cláusula opcional WITH NO REVERT, el contexto de ejecución de una sesión no se puede restablecer utilizando REVERT o ejecución otra instrucción EXECUTE AS. El contexto establecido por la instrucción permanece efectivo hasta que elimina la sesión.

Cuando se especifica la cláusula WITH NO REVERT COOKIE = @varbinary\_variable, SQL Server Database Engine (Motor de base de datos de SQL Server) pasa el valor de la cookie a @varbinary\_variable. El contexto de ejecución establecido por esa instrucción sólo se puede revertir al contexto anterior si la llamada a la instrucción REVERT WITH COOKIE = @varbinary\_variable contiene el mismo valor de @varbinary\_variable .

Esta opción es útil en un entorno donde se utiliza la agrupación de conexiones. La agrupación de conexiones es el mantenimiento de un grupo de base de datos que reutilizan las aplicaciones en un servidor de aplicaciones. Puesto que el valor pasado a @varbinary\_variable sólo lo conoce el llamador de la instrucción EXECUTE AS, el llamador puede garantizar que el contexto de ejecución que establece no puede cambiarlo nadie.

Determinar el inicio de sesión original

Use la función ORIGINAL_LOGIN para devolver el nombre de inicio de sesión que se ha conectado a la instancia de SQL Server. Puede utilizar esta función para devolver la identidad del inicio de sesión original en sesión donde existen varios cambios de contexto explícito o implícito.

Permisos

Para especificar EXECUTE AS en un inicio de sesión, el llamador debe tener permisos IMPERSONATE en el nombre de inicio de sesión especificado. Para especificar EXECUTE AS en un usuario de base de datos, el llamador debe tener permisos IMPERSONATE en el nombre de usuario especificado. Cuando se especifica EXECUTE AS CALLER, no se requieren permisos IMPERSONATE.

Ejemplos

A. Usar EXECUTE AS y REVERT para cambiar el contexto

En el siguiente ejemplo se crea una pila de contextos de ejecución que utilizan varias entidades de seguridad. La instrucción REVERT se utiliza a continuación para restablecer el contexto de ejecución al anterior autor de la llamada. La instrucción REVERT se ejecuta varias veces subiendo la pila hasta que el contexto de ejecución se establezca en el autor de la llamada original.

USE AdventureWorks;
GO
--Create two temporary principals
CREATE LOGIN login1 WITH PASSWORD = 'J345#$)thb';
CREATE LOGIN login2 WITH PASSWORD = 'Uor80$23b';
GO
CREATE USER user1 FOR LOGIN login1;
CREATE USER user2 FOR LOGIN login2;
GO
--Give IMPERSONATE permissions on user2 to user1
--so that user1 can successfully set the execution context to user2.
GRANT IMPERSONATE ON USER:: user2 TO user1;
GO
--Display current execution context.
SELECT SUSER_NAME(), USER_NAME();
-- Set the execution context to login1. 
EXECUTE AS LOGIN = 'login1';
--Verify the execution context is now login1.
SELECT SUSER_NAME(), USER_NAME();
--Login1 sets the execution context to login2.
EXECUTE AS USER = 'user2';
--Display current execution context.
SELECT SUSER_NAME(), USER_NAME();
-- The execution context stack now has three principals: the originating caller, login1 and login2.
--The following REVERT statements will reset the execution context to the previous context.
REVERT;
--Display current execution context.
SELECT SUSER_NAME(), USER_NAME();
REVERT;
--Display current execution context.
SELECT SUSER_NAME(), USER_NAME();

--Remove temporary principals.
DROP LOGIN login1;
DROP LOGIN login2;
DROP USER user1;
DROP USER user2;
GO

En el siguiente ejemplo se establece el contexto de ejecución de una sesión a un usuario determinado y especifica la cláusula WITH NO REVERT COOKIE = @varbinary\_variable. La instrucción REVERT debe especificar el valor pasado a la variable @cookie en la instrucción EXECUTE AS para volver correctamente el contexto al llamador. Para ejecutar este ejemplo, deben existir el inicio de sesión login1 y el usuario user1 creados en el ejemplo A.

DECLARE @cookie varbinary(100);
EXECUTE AS USER = 'user1' WITH COOKIE INTO @cookie;
-- Store the cookie in a safe location in your application.
-- Verify the context switch.
SELECT SUSER_NAME(), USER_NAME();
--Display the cookie value.
SELECT @cookie;
GO
-- Use the cookie in the REVERT statement.
DECLARE @cookie varbinary(100);
-- Set the cookie value to the one from the SELECT @cookie statement.
SET @cookie = <value from the SELECT @cookie statement>;
REVERT WITH COOKIE = @cookie;
-- Verify the context switch reverted.
SELECT SUSER_NAME(), USER_NAME();
GO