EXECUTE AS (Transact-SQL)

Legt den Ausführungskontext einer Sitzung fest.

Standardmäßig beginnt eine Sitzung, wenn sich ein Benutzer anmeldet, und sie endet mit dem Abmelden. Alle Vorgänge während einer Sitzung hängen von Berechtigungsüberprüfungen für diesen Benutzer ab. Bei Ausführung einer EXECUTE AS-Anweisung wird der Ausführungskontext der Sitzung zum angegebenen Anmeldenamen oder Benutzernamen gewechselt. 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. 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. Weitere Informationen zum Ausführungskontext finden Sie unter Grundlegendes zum Ausführungskontext. Weitere Informationen zum Kontextwechsel finden Sie unter Grundlegendes zum Wechseln des Kontexts.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

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

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

Argumente

  • LOGIN
    Gibt an, dass es sich bei dem Ausführungskontext, dessen Identität übernommen werden soll, um einen Anmeldenamen handelt. Der Bereich des Identitätswechsels liegt auf Serverebene.

  • USER
    Gibt an, dass es sich bei dem Kontext, dessen Identität übernommen werden soll, um einen Benutzer in der aktuellen Datenbank handelt. Der Identitätswechselbereich ist auf die aktuelle Datenbank beschränkt. Bei einem Kontextwechsel zu einem Datenbankbenutzer werden die Berechtigungen auf Serverebene dieses Benutzers nicht geerbt.

    Wichtiger HinweisWichtig

    Für die Dauer des Kontextwechsels zum Datenbankbenutzer schlägt die Anweisung bei jedem Versuch, auf Ressourcen außerhalb der Datenbank zuzugreifen, fehl. Dies schließt USE database-Anweisungen, verteilte Abfragen und Abfragen, die auf eine andere Datenbank mit drei- oder vierteiligen Bezeichnern verweisen, ein. Informationen zum Erweitern des Bereichs für den Kontextwechsel außerhalb der aktuellen Datenbank finden Sie unter Erweitern des Identitätswechsels bei Datenbanken durch Verwenden von EXECUTE AS.

  • 'name'
    Ein gültiger Benutzer oder Anmeldename. name muss ein Mitglied der festen Serverrolle sysadmin oder als Prinzipal in sys.database_principals bzw. sys.server_principals vorhanden sein.

    name kann als lokale Variable angegeben werden.

    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.

    Weitere Informationen finden Sie unter Angeben eines Benutzer- oder Anmeldenamens weiter unten in diesem Thema.

  • NO REVERT
    Gibt an, dass der Kontextwechsel nicht auf den vorherigen Kontext zurückgesetzt werden kann.

    Weitere Informationen zum Zurücksetzen auf den vorherigen Kontext finden Sie unter REVERT (Transact-SQL).

  • COOKIE 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. Das Database Engine (Datenbankmodul) übergibt das Cookie an @varbinary_variable.

    @ varbinary_variable ist varbinary(100).

  • CALLER
    Bei Verwendung innerhalb eines Moduls gibt dieser Wert an, dass die Anweisungen innerhalb des Moduls im Kontext des Modulaufrufers ausgeführt werden.

    Bei Verwendung außerhalb eines Moduls weist die Anweisung keine Aktion auf.

Hinweise

Die Änderung des Ausführungskontexts bleibt wirksam, bis eine der folgenden Bedingungen auftritt:

  • Eine andere EXECUTE AS-Anweisung wird ausgeführt.

  • Eine REVERT-Anweisung wird ausgeführt.

  • Die Sitzung wird gelöscht.

Sie können einen Ausführungskontextstapel erstellen, indem Sie die EXECUTE AS-Anweisung mehrmals für mehrere Prinzipale aufrufen. Bei Aufruf wechselt die REVERT-Anweisung den Kontext zu dem Anmelde- oder Benutzernamen in der nächsten Ebene des Kontextstapels. Eine Demonstration dieses Verhaltens finden Sie unter Beispiel A.

Angeben eines Benutzer- oder Anmeldenamens

Der in EXECUTE AS <context_specification> angegebene Benutzer- oder Anmeldename muss als Prinzipal entsprechend in sys.database_principals bzw. sys.server_principals vorhanden sein. Andernfalls schlägt die EXECUTE AS-Anweisung fehl. Darüber hinaus müssen dem Prinzipal IMPERSONATE-Berechtigungen erteilt werden. Falls der Aufrufer nicht der Datenbankbesitzer oder ein Mitglied der festen Serverrolle sysadmin ist, muss der Prinzipal sogar dann vorhanden sein, wenn der Benutzer als Windows-Gruppenmitglied auf die Datenbank oder Instanz von SQL Server zugreift. Stellen Sie sich z. B. folgende Bedingungen vor:

  • Die CompanyDomain\SQLUsers-Gruppe hat Zugriff auf die Sales-Datenbank.

  • CompanyDomain\SqlUser1 ist Mitglied von SQLUsers und besitzt daher implizit Zugriff auf die Sales-Datenbank.

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.

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.

Bewährte Methode

Geben Sie einen Anmelde- oder Benutzernamen an, der die geringsten Privilegien besitzt, die zum Ausführen der Vorgänge in der Sitzung erforderlich sind. 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.

VorsichtshinweisVorsicht

Die EXECUTE AS-Anweisung kann erfolgreich sein, wenn Database Engine (Datenbankmodul) den Namen auflösen kann. Wenn ein Domänenbenutzer vorhanden ist, kann Windows den Benutzer für Database Engine (Datenbankmodul) möglicherweise auflösen, obwohl der Windows-Benutzer keinen Zugriff auf SQL Server hat. Dies kann zu einer Bedingung führen, in der eine Anmeldung ohne Zugriff auf SQL Server anscheinend nicht angemeldet ist, obwohl die Anmeldung für den Identitätswechsel nur Berechtigungen besitzt, die public oder guest gewährt wurden.

Verwenden von 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. Der von der Anweisung festgelegte Kontext bleibt aktiv, bis die Sitzung gelöscht wird.

Wenn die WITH NO REVERT COOKIE = @varbinary_variable-Klausel angegeben ist, übergibt SQL Server Database Engine (Datenbankmodul) den Cookiewert an @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 denselben @varbinary_variable -Wert enthält.

Diese Option ist in einer Umgebung nützlich, in der Verbindungspools verwendet werden. Mithilfe von Verbindungspools wird eine Gruppe von Datenbankverbindungen verwaltet, die von Anwendungen auf einem Anwendungsserver wiederverwendet werden können. 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.

Bestimmen des ursprünglichen Anmeldenamens

Verwenden Sie die ORIGINAL_LOGIN-Funktion, um den Anmeldenamen zurückzugeben, der die Verbindung mit der SQL Server-Instanz hergestellt hat. 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.

Berechtigungen

Zur Angabe von EXECUTE AS in einem Anmeldenamen muss der Aufrufer die IMPERSONATE-Berechtigungen für den angegebenen Anmeldenamen besitzen. Zur Angabe von EXECUTE AS für einen Datenbankbenutzer muss der Aufrufer die IMPERSONATE-Berechtigungen für den angegebenen Benutzernamen besitzen. Wenn EXECUTE AS CALLER angegeben ist, sind keine IMPERSONATE-Berechtigungen erforderlich.

Beispiele

A. Verwenden von EXECUTE AS und REVERT zum Wechseln des Kontexts

Im folgenden Beispiel wird ein Kontextausführungsstapel mit mehreren Prinzipalen erstellt. Mit der REVERT-Anweisung wird der Ausführungskontext anschließend auf den vorherigen Aufrufer zurückgesetzt. 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.

USE AdventureWorks2008R2;
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 REVERT WITH COOKIE = @varbinary_variabl-Klausel angegeben. In der REVERT-Anweisung muss der in der EXECUTE AS-Anweisung an die @cookie-Variable übergebene Wert angegeben sein, damit der Kontext erfolgreich auf den Aufrufer zurückgesetzt werden kann. Zur Ausführung dieses Beispiels müssen der login1-Anmeldename und der user1-Benutzer, die in Beispiel A erstellt wurden, vorhanden sein.

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