EXECUTE AS (Transact-SQL)EXECUTE AS (Transact-SQL)

S’APPLIQUE À : ouiSQL Server ouiAzure SQL Database nonAzure SQL Data Warehouse nonParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Définit le contexte d'exécution d'une session.Sets the execution context of a session.

Par défaut, une session commence lorsqu'un utilisateur se connecte et se termine lorsqu'il se déconnecte.By default, a session starts when a user logs in and ends when the user logs off. Au cours d'une session, toutes les opérations sont soumises à des vérifications d'autorisations pour cet utilisateur.All operations during a session are subject to permission checks against that user. Quand une instruction EXECUTE AS est exécutée, le contexte d’exécution de la session change vers le nom de connexion ou d’utilisateur spécifié.When an EXECUTE AS statement is run, the execution context of the session is switched to the specified login or user name. Suite au changement de contexte, les autorisations sont vérifiées par rapport aux jetons de sécurité de connexion et d’utilisateur relatifs à ce compte au lieu de la personne qui appelle l’instruction EXECUTE AS.After the context switch, permissions are checked against the login and user security tokens for that account instead of the person calling the EXECUTE AS statement. L'identité du compte d'utilisateur ou de connexion est naturellement empruntée pour toute la durée de la session ou de l'exécution du module, ou le changement de contexte est explicitement annulé.In essence, the user or login account is impersonated for the duration of the session or module execution, or the context switch is explicitly reverted.

Icône de lien de rubrique Conventions de la syntaxe Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SyntaxeSyntax

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

ArgumentsArguments

ConnexionLOGIN
S'applique à: SQL Server 2008SQL Server 2008 jusqu'à SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Spécifie que le contexte d'exécution dont l'identité est empruntée est une connexion.Specifies the execution context to be impersonated is a login. L'étendue de l'emprunt d'identité est au niveau du serveur.The scope of impersonation is at the server level.

Notes

Cette option n’est pas disponible dans une base de données autonome, ni dans SQL Database.This option is not available in a contained database or in SQL Database.

UtilisateurUSER
Spécifie que le contexte dont l'identité doit être empruntée est un utilisateur de la base de données active.Specifies the context to be impersonated is a user in the current database. L'étendue de l'emprunt d'identité est limitée à la base de données active.The scope of impersonation is restricted to the current database. Le changement de contexte vers un utilisateur de base de données n'hérite pas des autorisations de cet utilisateur au niveau serveur.A context switch to a database user does not inherit the server-level permissions of that user.

Important

Tant que le changement de contexte en faveur d'un utilisateur de base de données est en vigueur, toute tentative d'accès à des ressources situées en dehors de la base de données causera l'échec de l'instruction.While the context switch to the database user is active, any attempt to access resources outside of the database will cause the statement to fail. Cela inclut les instructions USE database, les requêtes distribuées et les requêtes qui référencent une autre base de données utilisant des identificateurs en trois ou quatre parties.This includes USE database statements, distributed queries, and queries that reference another database that uses three- or four-part identifiers.

' name '' name '
Nom d'utilisateur ou de connexion valide.Is a valid user or login name. name doit être membre du rôle serveur fixe sysadmin, ou exister comme principal respectivement dans sys.database_principals ou sys.server_principals.name must be a member of the sysadmin fixed server role, or exist as a principal in sys.database_principals or sys.server_principals, respectively.

name peut être spécifié sous forme de variable locale.name can be specified as a local variable.

name doit être un compte singleton. Ce ne peut pas être un groupe, un rôle, un certificat, une clé ni un compte intégré, tel que NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService ou NT AUTHORITY\LocalSystem.name must be a singleton account, and cannot be a group, role, certificate, key, or built-in account, such as NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService, or NT AUTHORITY\LocalSystem.

Pour plus d’informations, consultez Spécification d’un nom d’utilisateur ou d’un ID de connexion, plus loin dans cette rubrique.For more information, see Specifying a User or Login Name later in this topic.

NO REVERTNO REVERT
Spécifie qu'il n'est pas possible de restaurer le changement de contexte pour revenir au contexte précédent.Specifies that the context switch cannot be reverted back to the previous context. L’option NO REVERT peut uniquement être utilisée au niveau adhoc.The NO REVERT option can only be used at the adhoc level.

Pour plus d’informations sur la restauration du contexte précédent, consultez REVERT (Transact-SQL).For more information about reverting to the previous context, see REVERT (Transact-SQL).

COOKIE INTO @ varbinary_variableCOOKIE INTO @varbinary_variable
Spécifie que le contexte d’exécution peut être restauré vers le contexte précédent uniquement si l’instruction REVERT WITH COOKIE appelante contient la valeur @ varbinary_variable correcte.Specifies the execution context can only be reverted back to the previous context if the calling REVERT WITH COOKIE statement contains the correct @varbinary_variable value. Moteur de base de donnéesDatabase Engine passe le cookie à @ varbinary_variable.The Moteur de base de donnéesDatabase Engine passes the cookie to @varbinary_variable. L’option COOKIE INTO peut uniquement être utilisée au niveau adhoc.The COOKIE INTO option can only be used at the adhoc level.

@ varbinary_variable est varbinary(8000) .@ varbinary_variable is varbinary(8000).

Notes

Le paramètre OUTPUT de cookie est actuellement documenté comme varbinary(8000) , ce qui correspond à la longueur maximale correcte.The cookie OUTPUT parameter for is currently documented as varbinary(8000) which is the correct maximum length. Cependant, l’implémentation actuelle retourne varbinary(100) .However the current implementation returns varbinary(100). Les applications doivent réserver varbinary(8000) pour continuer à fonctionner correctement si la taille de retour des cookies augmente dans une version ultérieure.Applications should reserve varbinary(8000) so that the application continues to operate correctly if the cookie return size increases in a future release.

CALLERCALLER
Dans un module, il spécifie que les instructions de ce module sont exécutées dans le contexte de l'appelant du module.When used inside a module, specifies the statements inside the module are executed in the context of the caller of the module.

En dehors d'un module, cette instruction n'a pas d'effet.When used outside a module, the statement has no action.

NotesRemarks

Le changement dans le contexte d'exécution reste en vigueur jusqu'à ce que se produise l'une des actions suivantes :The change in execution context remains in effect until one of the following occurs:

  • Une autre instruction EXECUTE AS s'exécute.Another EXECUTE AS statement is run.

  • Une instruction REVERT s'exécute.A REVERT statement is run.

  • Suppression de la session.The session is dropped.

  • La procédure stockée ou le déclencheur où la commande exécutée se termine.The stored procedure or trigger where the command was executed exits.

Vous pouvez créer une pile de contextes d'exécution en appelant l'instruction EXECUTE AS plusieurs fois sur plusieurs principaux.You can create an execution context stack by calling the EXECUTE AS statement multiple times across multiple principals. Lorsqu'elle est appelée, l'instruction REVERT bascule le contexte vers la connexion ou l'utilisateur du niveau supérieur dans la pile de contexte.When called, the REVERT statement switches the context to the login or user in the next level up in the context stack. Pour avoir une démonstration de ce comportement, consultez Exemple A.For a demonstration of this behavior, see Example A.

Spécification d’un nom d’utilisateur ou de connexionSpecifying a User or Login Name

Le nom d’utilisateur ou de connexion spécifié dans EXECUTE AS <context_specification> doit exister comme principal respectivement dans sys.database_principals ou sys.server_principals. Sinon, l’instruction EXECUTE AS échoue.The user or login name specified in EXECUTE AS <context_specification> must exist as a principal in sys.database_principals or sys.server_principals, respectively, or the EXECUTE AS statement fails. De plus, les autorisations IMPERSONATE doivent être accordées sur le principal.Additionally, IMPERSONATE permissions must be granted on the principal. Sauf si l’appelant est le propriétaire de la base de données, ou un membre du rôle serveur fixe sysadmin, le principal doit exister même quand l’utilisateur a accès à la base de données ou l’instance de SQL ServerSQL Server du fait de son appartenance à un groupe Windows.Unless the caller is the database owner, or is a member of the sysadmin fixed server role, the principal must exist even when the user is accessing the database or instance of SQL ServerSQL Server through a Windows group membership. Par exemple, supposons les conditions suivantes :For example, assume the following conditions:

  • Le groupe CompanyDomain\SQLUsers a accès à la base de données Sales.CompanyDomain\SQLUsers group has access to the Sales database.

  • CompanyDomain\SqlUser1 est membre de SQLUsers et bénéficie donc d’un accès implicite à la base de données Sales.CompanyDomain\SqlUser1 is a member of SQLUsers and, therefore, has implicit access to the Sales database.

CompanyDomain\SqlUser1 a accès à la base de données du fait de son appartenance au groupe SQLUsers, mais l’instruction EXECUTE AS USER = 'CompanyDomain\SqlUser1' échoue parce que CompanyDomain\SqlUser1 n’existe pas comme principal dans la base de données.Although CompanyDomain\SqlUser1 has access to the database through membership in the SQLUsers group, the statement EXECUTE AS USER = 'CompanyDomain\SqlUser1' fails because CompanyDomain\SqlUser1 does not exist as a principal in the database.

Si l’utilisateur est orphelin (la connexion associée n’existant plus) et qu’il n’a pas été créé avec la clause WITHOUT LOGIN, l’instruction EXECUTE AS échoue pour cet utilisateur.If the user is orphaned (the associated login no longer exists), and the user was not created with WITHOUT LOGIN, EXECUTE AS will fail for the user.

Bonne pratiqueBest Practice

Spécifiez une connexion ou un utilisateur bénéficiant du minimum de privilèges indispensable pour effectuer les opérations dans la session.Specify a login or user that has the least privileges required to perform the operations in the session. Par exemple, ne spécifiez pas de nom de connexion avec des autorisations de niveau serveur, si seules les autorisations de niveau base de données sont requises ; ne spécifiez pas non plus un compte de propriétaire de base de données à moins que ces autorisations ne soient nécessaires.For example, do not specify a login name with server-level permissions, if only database-level permissions are required; or do not specify a database owner account unless those permissions are required.

Attention

L'instruction EXECUTE AS peut réussir tant que le Moteur de base de donnéesDatabase Engine peut résoudre le nom.The EXECUTE AS statement can succeed as long as the Moteur de base de donnéesDatabase Engine can resolve the name. Si un utilisateur de domaine existe, Windows peut être en mesure de résoudre l'utilisateur pour le Moteur de base de donnéesDatabase Engine, même si l'utilisateur windows n'a pas accès à SQL ServerSQL Server.If a domain user exists, Windows might be able to resolve the user for the Moteur de base de donnéesDatabase Engine, even though the Windows user does not have access to SQL ServerSQL Server. Cela peut entraîner une condition selon laquelle une connexion sans accès à SQL ServerSQL Server semble être connectée, alors que la connexion avec emprunt d'identité dispose uniquement des autorisations accordées au public ou à l'invité.This can lead to a condition where a login with no access to SQL ServerSQL Server appears to be logged in, though the impersonated login would only have the permissions granted to public or guest.

Utilisation de WITH NO REVERTUsing WITH NO REVERT

Lorsque l'instruction EXECUTE AS comporte la clause WITH NO REVERT facultative, le contexte d'exécution d'une session ne peut pas être réinitialisé à l'aide de REVERT ou en exécutant une autre instruction EXECUTE AS.When the EXECUTE AS statement includes the optional WITH NO REVERT clause, the execution context of a session cannot be reset using REVERT or by executing another EXECUTE AS statement. Le contexte défini par l'instruction reste en vigueur jusqu'à ce que la session soit supprimée.The context set by the statement remains in affect until the session is dropped. Notez que si le groupement de connexions est activé, sp_reset_connection échoue et la connexion est supprimée.Note that if connection pooling is enabled, sp_reset_connection will fail and the connection will drop. Le message d’erreur dans le journal des événements est le suivant :The error message in the event log will be:

La connexion a été supprimée car le principal qui l'a ouverte a ensuite pris en compte un nouveau contexte de sécurité, puis a tenté de réinitialiser la connexion sous sa représentation de contexte de sécurité.The connection has been dropped because the principal that opened it subsequently assumed a new security context, and then tried to reset the connection under its impersonated security context. Ce scénario n'est pas pris en charge.This scenario is not supported. Consultez "Présentation de l'emprunt d'identité" dans la documentation en ligne.See "Impersonation Overview" in Books Online.

Quand la clause WITH NO REVERT COOKIE = @varbinary_variable est spécifiée, Moteur de base de données SQL ServerSQL Server Database Engine passe la valeur de cookie à @varbinary_variable.When the WITH NO REVERT COOKIE = @varbinary_variable clause is specified, the Moteur de base de données SQL ServerSQL Server Database Engine passes the cookie value to @varbinary_variable. Le contexte d’exécution défini par cette instruction peut être restauré vers le contexte précédent uniquement si l’instruction REVERT WITH COOKIE = @varbinary_variable appelante contient la même valeur *@varbinary_variable* .The execution context set by that statement can only be reverted to the previous context if the calling REVERT WITH COOKIE = @varbinary_variable statement contains the same *@varbinary_variable* value.

Cette option est utile dans un environnement où le groupement de connexions est utilisé.This option is useful in an environment in which connection pooling is used. Le groupement de connexions est la maintenance d'un groupe de connexions de base de données à réutiliser par des applications sur un serveur d'applications.Connection pooling is the maintenance of a group of database connections for reuse by applications on an application server. Comme la valeur passée à *@varbinary_variable* n’est connue que de l’appelant de l’instruction EXECUTE AS, celui-ci peut garantir que le contexte d’exécution qu’il établit ne sera pas modifié par un autre utilisateur.Because the value passed to *@varbinary_variable* is known only to the caller of the EXECUTE AS statement, the caller can guarantee that the execution context they establish cannot be changed by anyone else.

Identification de la connexion originaleDetermining the Original Login

Utilisez la fonction ORIGINAL_LOGIN pour retourner le nom de la connexion utilisée pour se connecter à l’instance de SQL ServerSQL Server.Use the ORIGINAL_LOGIN function to return the name of the login that connected to the instance of SQL ServerSQL Server. Vous pouvez utiliser cette fonction pour renvoyer l'identité de la connexion d'origine dans les sessions où il y a un grand nombre de changements de contexte implicites ou explicites.You can use this function to return the identity of the original login in sessions in which there are many explicit or implicit context switches.

AutorisationsPermissions

Pour spécifier EXECUTE AS sur une connexion, l’appelant doit avoir l’autorisation IMPERSONATE sur le nom de connexion spécifié et l’autorisation IMPERSONATE ANY LOGIN ne doit pas lui être refusée.To specify EXECUTE AS on a login, the caller must have IMPERSONATE permission on the specified login name and must not be denied the IMPERSONATE ANY LOGIN permission. Pour spécifier EXECUTE AS sur un utilisateur de base de données, l’appelant doit avoir les autorisations IMPERSONATE sur le nom d’utilisateur spécifié.To specify EXECUTE AS on a database user, the caller must have IMPERSONATE permissions on the specified user name. Quand EXECUTE AS CALLER est spécifié, les autorisations IMPERSONATE ne sont pas nécessaires.When EXECUTE AS CALLER is specified, IMPERSONATE permissions are not required.

ExemplesExamples

A.A. Utilisation de EXECUTE AS et REVERT pour changer de contexteUsing EXECUTE AS and REVERT to switch context

L'exemple suivant crée une pile d'exécutions de contexte à l'aide de plusieurs principaux.The following example creates a context execution stack using multiple principals. L'instruction REVERT est ensuite utilisée pour réinitialiser le contexte d'exécution à l'appelant précédent.The REVERT statement is then used to reset the execution context to the previous caller. L'instruction REVERT est exécutée plusieurs fois en remontant la pile jusqu'à ce que le contexte d'exécution soit défini pour l'appelant d'origine.The REVERT statement is executed multiple times moving up the stack until the execution context is set to the original caller.

USE AdventureWorks2012;  
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  

L’exemple suivant définit le contexte d’exécution d’une session sur un utilisateur spécifié et précise la clause WITH NO REVERT COOKIE = @varbinary_variable.The following example sets the execution context of a session to a specified user and specifies the WITH NO REVERT COOKIE = @varbinary_variable clause. L'instruction REVERT doit spécifier la valeur passée à la variable @cookie dans l'instruction EXECUTE AS pour ramener le contexte à l'appelant.The REVERT statement must specify the value passed to the @cookie variable in the EXECUTE AS statement to successfully revert the context back to the caller. Pour exécuter cet exemple, la connexion login1 et l'utilisateur user1 créés dans l'exemple A doivent exister.To run this example, the login1 login and user1 user created in example A must exist.

DECLARE @cookie varbinary(8000);  
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(8000);  
-- 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  

Voir aussiSee Also

REVERT (Transact-SQL) REVERT (Transact-SQL)
Clause EXECUTE AS (Transact-SQL)EXECUTE AS Clause (Transact-SQL)