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

GILT FÜR: jaSQL Server (ab 2008) jaAzure SQL-DatenbankjaAzure SQL Data Warehouse neinParallel Data WarehouseAPPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Legt den Ausführungskontext einer Sitzung fest.Sets the execution context of a session.

Standardmäßig beginnt eine Sitzung, wenn sich ein Benutzer anmeldet, und sie endet mit dem Abmelden.By default, a session starts when a user logs in and ends when the user logs off. Alle Vorgänge während einer Sitzung hängen von Berechtigungsüberprüfungen für diesen Benutzer ab.All operations during a session are subject to permission checks against that user. Bei Ausführung einer EXECUTE AS-Anweisung wird der Ausführungskontext der Sitzung zum angegebenen Anmeldenamen oder Benutzernamen gewechselt.When an EXECUTE AS statement is run, the execution context of the session is switched to the specified login or user name. Nach dem Kontextwechsel werden Berechtigungen anhand der Sicherheitstoken des Anmeldenamens und Benutzers für dieses Konto überprüft, anstatt für die Person, die die EXECUTE AS-Anweisung aufgerufen hat.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. Im Wesentlichen wird die Identität des Benutzer- oder Anmeldekontos für die Dauer der Sitzung oder der Modulausführung übernommen, oder der Kontextwechsel wird explizit zurückgesetzt.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.

Themenlinksymbol Transact-SQL-SyntaxkonventionenTopic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

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

ArgumenteArguments

AnmeldungLOGIN
Gilt für: SQL Server 2008SQL Server 2008 bis SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Gibt an, dass es sich bei dem Ausführungskontext, dessen Identität übernommen werden soll, um einen Anmeldenamen handelt.Specifies the execution context to be impersonated is a login. Der Bereich des Identitätswechsels liegt auf Serverebene.The scope of impersonation is at the server level.

Hinweis

Diese Option ist in einer enthaltenen Datenbank oder in SQL-Datenbank nicht verfügbar.This option is not available in a contained database or in SQL Database.

BenutzerUSER
Gibt an, dass der Kontext, der als Identität angenommen werden soll, ein Benutzer in der aktuellen Datenbank ist.Specifies the context to be impersonated is a user in the current database. Der Identitätswechselbereich ist auf die aktuelle Datenbank beschränkt.The scope of impersonation is restricted to the current database. Bei einem Kontextwechsel zu einem Datenbankbenutzer werden die Berechtigungen auf Serverebene dieses Benutzers nicht geerbt.A context switch to a database user does not inherit the server-level permissions of that user.

Wichtig

Für die Dauer des Kontextwechsels zum Datenbankbenutzer schlägt die Anweisung bei jedem Versuch, auf Ressourcen außerhalb der Datenbank zuzugreifen, fehl.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. Dies schließt USE-Datenbankanweisungen, verteilte Abfragen und Abfragen ein, die auf eine andere Datenbank mit drei- oder vierteiligen Bezeichnern verweisen.This includes USE database statements, distributed queries, and queries that reference another database that uses three- or four-part identifiers.

' name '' name '
Ein gültiger Benutzer- oder Anmeldename.Is a valid user or login name. name muss ein Mitglied der festen Serverrolle sysadmin sein oder als Prinzipal in sys.database_principals bzw. sys.server_principals vorhanden sein.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 kann als lokale Variable angegeben werden.name can be specified as a local variable.

name muss ein einzelnes Konto und kann keine Gruppe, Rolle, kein Zertifikat, Schlüssel oder integriertes Konto sein, wie z.B. NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService oder 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.

Weitere Informationen finden Sie unter Angeben eines Benutzer- oder Anmeldenamens weiter unten in diesem Thema.For more information, see Specifying a User or Login Name later in this topic.

NO REVERTNO REVERT
Gibt an, dass der Kontextwechsel nicht auf den vorherigen Kontext zurückgesetzt werden kann.Specifies that the context switch cannot be reverted back to the previous context. Die NO REVERT-Option kann nur auf der Ad-hoc-Ebene verwendet werden.The NO REVERT option can only be used at the adhoc level.

Weitere Informationen zum Zurücksetzen auf den vorherigen Kontext finden Sie unter REVERT (Transact-SQL).For more information about reverting to the previous context, see REVERT (Transact-SQL).

COOKIE INTO @varbinary_variableCOOKIE INTO @varbinary_variable
Gibt an, dass der Ausführungskontext nur auf den vorherigen Kontext zurückgesetzt werden kann, wenn die aufrufende REVERT WITH COOKIE-Anweisung den richtigen @varbinary_variable-Wert enthält.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. Datenbank-EngineDatabase Engine übergibt das Cookie an @varbinary_variable.The Datenbank-EngineDatabase Engine passes the cookie to @varbinary_variable. Die COOKIE INTO-Option kann nur auf der Ad-hoc-Ebene verwendet werden.The COOKIE INTO option can only be used at the adhoc level.

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

Hinweis

Der OUTPUT-Cookieparameter ist zurzeit als varbinary(8000) dokumentiert, was der korrekten maximalen Länge entspricht.The cookie OUTPUT parameter for is currently documented as varbinary(8000) which is the correct maximum length. Die aktuelle Implementierung gibt jedoch varbinary(100) zurück.However the current implementation returns varbinary(100). Anwendungen müssen varbinary(8000) reservieren, damit die Anwendung weiterhin ordnungsgemäß ausgeführt wird, falls die Rückgabegröße des Cookies in einem zukünftigen Release erhöht wird.Applications should reserve varbinary(8000) so that the application continues to operate correctly if the cookie return size increases in a future release.

CALLERCALLER
Bei Verwendung innerhalb eines Moduls gibt dieser Wert an, dass die Anweisungen innerhalb des Moduls im Kontext des Modulaufrufers ausgeführt werden.When used inside a module, specifies the statements inside the module are executed in the context of the caller of the module.

Bei Verwendung außerhalb eines Moduls weist die Anweisung keine Aktion auf.When used outside a module, the statement has no action.

RemarksRemarks

Die Änderung des Ausführungskontexts bleibt wirksam, bis eine der folgenden Bedingungen auftritt:The change in execution context remains in effect until one of the following occurs:

  • Eine andere EXECUTE AS-Anweisung wird ausgeführt.Another EXECUTE AS statement is run.

  • Eine REVERT-Anweisung wird ausgeführt.A REVERT statement is run.

  • Die Sitzung wird gelöscht.The session is dropped.

  • Die gespeicherte Prozedur oder der Trigger, für die bzw. den der Befehl ausgeführt wurde, wird beendet.The stored procedure or trigger where the command was executed exits.

Sie können einen Ausführungskontextstapel erstellen, indem Sie die EXECUTE AS-Anweisung mehrmals für mehrere Prinzipale aufrufen.You can create an execution context stack by calling the EXECUTE AS statement multiple times across multiple principals. Bei Aufruf wechselt die REVERT-Anweisung den Kontext zu dem Anmelde- oder Benutzernamen in der nächsten Ebene des Kontextstapels.When called, the REVERT statement switches the context to the login or user in the next level up in the context stack. Eine Demonstration dieses Verhaltens finden Sie unter Beispiel A.For a demonstration of this behavior, see Example A.

Angeben eines Benutzer- oder AnmeldenamensSpecifying a User or Login Name

Der in EXECUTE AS <context_specification> angegebene Benutzer- oder Anmeldename muss als Prinzipal entsprechend in sys.database_principals oder sys.server_principals vorhanden sein. Andernfalls schlägt die EXECUTE AS-Anweisung fehl.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. Zudem müssen für den Prinzipal IMPERSONATE-Berechtigungen erteilt worden sein.Additionally, IMPERSONATE permissions must be granted on the principal. Falls der Aufrufer nicht der Datenbankbesitzer oder ein Mitglied der festen Serverrolle sysadmin ist, muss der Prinzipal auch dann vorhanden sein, wenn der Benutzer als Windows-Gruppenmitglied auf die Datenbank oder Instanz von SQL ServerSQL Server zugreift.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. Stellen Sie sich z. B. folgende Bedingungen vor:For example, assume the following conditions:

  • Die CompanyDomain\SQLUsers-Gruppe verfügt über Zugriff auf die Sales-Datenbank.CompanyDomain\SQLUsers group has access to the Sales database.

  • CompanyDomain\SqlUser1 ist ein Element von SQLUsers und hat deshalb impliziten Zugriff auf die Sales-Datenbank.CompanyDomain\SqlUser1 is a member of SQLUsers and, therefore, has implicit access to the Sales database.

Obwohl CompanyDomain\SqlUser1 über die Mitgliedschaft in der SQLUsers-Gruppe Zugriff auf die Datenbank besitzt, schlägt die EXECUTE AS USER = 'CompanyDomain\SqlUser1'-Anweisung fehl, da CompanyDomain\SqlUser1 nicht als Prinzipal in der Datenbank vorhanden ist.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.

Wenn der Benutzer verwaist ist (der zugeordnete Anmeldename ist nicht mehr vorhanden), und der Benutzer nicht mit WITHOUT LOGIN erstellt wurde, erzeugt EXECUTE AS einen Fehler für den Benutzer.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.

Bewährte MethodenBest Practice

Geben Sie einen Anmelde- oder Benutzernamen an, der die geringsten Privilegien besitzt, die zum Ausführen der Vorgänge in der Sitzung erforderlich sind.Specify a login or user that has the least privileges required to perform the operations in the session. Geben Sie z. B. keinen Anmeldenamen mit Berechtigungen auf Serverebene an, wenn nur Berechtigungen auf Datenbankebene erforderlich sind. Oder geben Sie nur dann ein Datenbankbesitzerkonto an, wenn diese Berechtigungen tatsächlich erforderlich sind.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.

Achtung

Die EXECUTE AS-Anweisung kann erfolgreich sein, wenn Datenbank-EngineDatabase Engine den Namen auflösen kann.The EXECUTE AS statement can succeed as long as the Datenbank-EngineDatabase Engine can resolve the name. Wenn ein Domänenbenutzer vorhanden ist, kann Windows den Benutzer für Datenbank-EngineDatabase Engine möglicherweise auflösen, obwohl der Windows-Benutzer keinen Zugriff auf SQL ServerSQL Server hat.If a domain user exists, Windows might be able to resolve the user for the Datenbank-EngineDatabase Engine, even though the Windows user does not have access to SQL ServerSQL Server. Dies kann zu einer Bedingung führen, in der eine Anmeldung ohne Zugriff auf SQL ServerSQL Server anscheinend nicht angemeldet ist, obwohl die Anmeldung für den Identitätswechsel nur Berechtigungen besitzt, die public oder guest gewährt wurden.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.

Verwenden von WITH NO REVERTUsing WITH NO REVERT

Wenn die EXECUTE AS-Anweisung die optionale WITH NO REVERT-Klausel enthält, kann der Ausführungskontext einer Sitzung nicht mithilfe von REVERT oder durch Ausführen einer anderen EXECUTE AS-Anweisung zurückgesetzt werden.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. Der von der Anweisung festgelegte Kontext bleibt aktiv, bis die Sitzung gelöscht wird.The context set by the statement remains in affect until the session is dropped.

Wenn die WITH NO REVERT COOKIE = @varbinary_variable-Klausel angegeben wurde, übergibt SQL Server-Datenbank-EngineSQL Server Database Engine den Cookiewert an @varbinary_variable.When the WITH NO REVERT COOKIE = @varbinary_variable clause is specified, the SQL Server-Datenbank-EngineSQL Server Database Engine passes the cookie value to @varbinary_variable. Der von dieser Anweisung festgelegte Ausführungskontext kann nur auf einen vorherigen Kontext zurückgesetzt werden, wenn die aufrufende REVERT WITH COOKIE = @varbinary_variable-Anweisung den gleichen *@varbinary_variable*-Wert enthält.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.

Diese Option ist in einer Umgebung nützlich, in der Verbindungspools verwendet werden.This option is useful in an environment in which connection pooling is used. Mithilfe von Verbindungspools wird eine Gruppe von Datenbankverbindungen verwaltet, die von Anwendungen auf einem Anwendungsserver wiederverwendet werden können.Connection pooling is the maintenance of a group of database connections for reuse by applications on an application server. Da nur der Aufrufer der EXECUTE AS-Anweisung den an *@varbinary_variable* übergebenen Wert kennt, kann der Aufrufer sicherstellen, dass der eingerichtete Ausführungskontext von keinem anderen Benutzer geändert werden kann.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.

Bestimmen des ursprünglichen AnmeldenamensDetermining the Original Login

Verwenden Sie die ORIGINAL_LOGIN-Funktion, um den Anmeldenamen zurückzugeben, der die Verbindung mit der SQL ServerSQL Server-Instanz hergestellt hat.Use the ORIGINAL_LOGIN function to return the name of the login that connected to the instance of SQL ServerSQL Server. Mit dieser Funktion können Sie die Identität des ursprünglichen Anmeldenamens in Sitzungen zurückgeben, in denen zahlreiche explizite oder implizite Kontextwechsel vorkommen.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.

BerechtigungenPermissions

Um EXECUTE AS für einen Anmeldenamen anzugeben, muss der Aufrufer über die IMPERSONATE-Berechtigung für den angegebenen Anmeldenamen verfügen, und ihm darf die IMPERSONATE ANY LOGIN-Berechtigung nicht verweigert werden.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. Um EXECUTE AS für einen Datenbankbenutzer anzugeben, benötigt der Aufrufer IMPERSONATE-Berechtigungen für den angegebenen Benutzernamen.To specify EXECUTE AS on a database user, the caller must have IMPERSONATE permissions on the specified user name. Wenn EXECUTE AS CALLER angegeben ist, sind keine IMPERSONATE-Berechtigungen erforderlich.When EXECUTE AS CALLER is specified, IMPERSONATE permissions are not required.

BeispieleExamples

A.A. Verwenden von EXECUTE AS und REVERT zum Wechseln des KontextsUsing EXECUTE AS and REVERT to switch context

Im folgenden Beispiel wird ein Kontextausführungsstapel mit mehreren Prinzipalen erstellt.The following example creates a context execution stack using multiple principals. Mit der REVERT-Anweisung wird der Ausführungskontext anschließend auf den vorherigen Aufrufer zurückgesetzt.The REVERT statement is then used to reset the execution context to the previous caller. Die REVERT-Anweisung wird mehrmals ausgeführt und bewegt sich so durch den Stapel, bis der Ausführungskontext wieder auf den ursprünglichen Aufrufer festgelegt ist.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  

Im folgenden Beispiel wird der Ausführungskontext einer Sitzung auf einen angegebenen Benutzer festgelegt und die WITH NO REVERT COOKIE = @varbinary_variable-Klausel angegeben.The following example sets the execution context of a session to a specified user and specifies the WITH NO REVERT COOKIE = @varbinary_variable clause. In der REVERT-Anweisung muss der an die @cookie-Variable in der EXECUTE AS-Anweisung übergebene Wert angegeben sein, damit der Kontext erfolgreich auf den Aufrufer zurückgesetzt werden kann.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. Zur Ausführung dieses Beispiels müssen der login1-Anmeldename und der user1-Benutzer, die in Beispiel A erstellt wurden, vorhanden sein.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  

Weitere InformationenSee Also

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