EXECUTE AS (Transact-SQL)

platí pro:SQL ServerAzure SQL Databaseazure SQL Managed Instanceazure Synapse Analytics

Nastaví kontext spuštění relace.

Ve výchozím nastavení se relace spustí, když se uživatel přihlásí a ukončí, když se uživatel odhlásí. Všechny operace během relace podléhají kontrolám oprávnění pro daného uživatele. Když je EXECUTE AS příkaz vykonán, kontext provádění relace se přepne na zadané přihlašovací jméno nebo uživatelské jméno. Po přepnutí kontextu jsou oprávnění kontrolována podle přihlašovacího a uživatelského bezpečnostního tokenu pro daný účet, místo podle osoby, která příkaz EXECUTE AS volá. Uživatel nebo přihlašovací účet je v podstatě zosobněný po dobu trvání provádění relace nebo modulu nebo se kontextový přepínač explicitně vrátí.

Transact-SQL konvence syntaxe

Syntax

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

Argumenty

LOGIN
Applies to: SQL Server 2008 (10.0.x) a novější.

Určuje kontext spuštění, který se má zosobnět, je přihlášení. Rozsah zosobnění je na úrovni serveru.

Poznámka

Tato možnost není dostupná v obsažené databázi, Azure SQL Database nebo Azure Synapse Analytics.

USER
Určuje kontext, který má být zosobněný, je uživatel v aktuální databázi. Rozsah zosobnění je omezen na aktuální databázi. Kontextový přepínač na uživatele databáze nedědí oprávnění na úrovni serveru daného uživatele.

Důležitý

Když je kontextový přepínač na uživatele databáze aktivní, všechny pokusy o přístup k prostředkům mimo databázi způsobí selhání příkazu. To zahrnuje příkazy databáze USE, distribuované dotazy a dotazy odkazované na jinou databázi, která používá identifikátory tří nebo čtyř částí.

'jméno' Je platným uživatelem nebo přihlašovacím jménem. název musí být členem pevné role správce systému správce systému nebo musí existovat jako objekt zabezpečení v sys.database_principals nebo sys.server_principals.

název lze zadat jako místní proměnnou.

název musí být jeden účet a nemůže to být skupina, role, certifikát, klíč nebo předdefinovaný účet, například NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService nebo NT AUTHORITY\LocalSystem.

Další informace najdete v tématu Zadání uživatele nebo přihlašovacího jména dále v tomto tématu.

NE REVERT
Určuje, že se kontextový přepínač nedá vrátit zpět k předchozímu kontextu. Možnost NO REVERT lze použít pouze na ad hoc úrovni.

Pro více informací o návratu k předchozímu kontextu viz REVERT (Transact-SQL).

COOKIE DO @varbinary_variable
Specifikuje kontext vykonání lze vrátit zpět do předchozího kontextu pouze tehdy, pokud příkaz CALLING REVERT WITH COOKIE obsahuje správnou hodnotu @varbinary_variable . Database Engine předá soubor cookie @varbinary_variable. Možnost COOKIE INTO lze použít pouze na úrovni adhoc.

@varbinary_variable je varbinary(8000).

Poznámka

Parametr OUTPUT souboru cookie je aktuálně zdokumentovaný jako varbinary(8000) což je správná maximální délka. Aktuální implementace však vrátí varbinary(100). Aplikace by si měly rezervovat varbinary(8000), aby aplikace fungovala správně, pokud se velikost vrácení souboru cookie v budoucí verzi zvýší.

VOLAJÍCÍ
Při použití uvnitř modulu určuje příkazy uvnitř modulu se spouští v kontextu volajícího modulu. Při použití mimo modul příkaz nemá žádnou akci.

Poznámka

Tato možnost není v Azure Synapse Analytics dostupná.

Poznámky

Změna v kontextu provádění zůstane platná, dokud nedojde k některé z následujících situací:

  • Další EXECUTE AS příkaz je spuštěn.

  • REVERT Vydává se prohlášení.

  • Relace se zahodí.

  • Uložená procedura nebo trigger, kde byl příkaz proveden, se ukončí.

Můžete vytvořit zásobník kontextu vykonávání tak, že příkaz vyvoláte EXECUTE AS vícekrát napříč více principy. Při volání REVERT příkaz přepne kontext na přihlášení nebo uživatele na další úrovni v kontextovém zásobníku. Ukázku tohoto chování najdete v příkladu.

Zadání uživatele nebo přihlašovacího jména

Uživatelské nebo přihlašovací jméno uvedené v context_specification EXECUTE AS<> musí existovat jako principal v sys.database_principals nebo sys.server_principals, jinak příkaz EXECUTE AS selže. Kromě toho musí být u objektu zabezpečení udělena oprávnění IMPERSONATE. Pokud není volající vlastníkem databáze nebo je členem sysadmin pevné role serveru, musí objekt zabezpečení existovat, i když uživatel přistupuje k databázi nebo instanci SQL Server prostřednictvím členství ve skupině Windows. Předpokládejme například následující podmínky:

  • skupina CompanyDomain\SQLUsers má přístup k databázi Sales.

  • CompanyDomain\SqlUser1 je členem SQLUsers, a proto má implicitní přístup k databázi Sales.

Přestože CompanyDomain\SqlUser1 má přístup k databázi prostřednictvím členství ve skupině SQLUsers, příkaz EXECUTE AS USER = 'CompanyDomain\SqlUser1' selže, protože CompanyDomain\SqlUser1 v databázi neexistuje jako objekt zabezpečení.

Pokud je uživatel osiřelý (příslušné přihlášení již neexistuje) a uživatel nebyl vytvořen s WITHOUT LOGIN, EXECUTE AS neuspěje to pro uživatele.

Osvědčených

Zadejte přihlášení nebo uživatele s nejnižšími oprávněními potřebnými k provádění operací v relaci. Například nezadávejte přihlašovací jméno s oprávněními na úrovni serveru, pokud jsou vyžadována pouze oprávnění na úrovni databáze; nebo nezadávejte účet vlastníka databáze, pokud tato oprávnění nejsou nutná.

Opatrnost

Příkaz EXECUTE AS může uspět, pokud Database Engine dokáže vyřešit jméno. Pokud existuje uživatel domény, Windows může být schopen přeložit uživatele pro Database Engine, i když Windows uživatel nemá přístup k SQL Server. To může vést k podmínce, kdy se přihlášení bez přístupu k SQL Server zdá být přihlášené, i když zosobněné přihlášení by mělo udělená pouze oprávnění veřejnosti nebo hostovi.

Bezpečnostní aspekty

Provádění v kontextu vlastnictví dbo, například pomocí příkazu EXECUTE AS USER = 'dbo', mění způsob, jakým jsou explicitní DENY oprávnění vyhodnocena. Když přepnete kontext provedení na doménový doménový kontext, omezení založená DENY na oprávněních, která se vztahují na původního volajícího principala, nejsou po dobu trvání impersonace vynucena. Výsledkem je, že princip, který může přepnout kontext vykonání na dbo, například členstvím v db_owner pevné databázové roli, může provádět akce, které by jinak byly blokovány explicitními DENY oprávněními aplikovanými na tento princip.

Toto chování je záměrné. Vezměte ho v úvahu, když udělíte oprávnění, která umožňují zosobnění vlastnictví. DENY Oprávnění nemohou sloužit jako kompenzační kontrola, která omezuje efektivní oprávnění principalů, kteří mohou vykonávat jako DBO.

Použití BEZ REVERT

Pokud EXECUTE AS příkaz obsahuje volitelnou klauzuli WITH NO REVERT , nelze kontext vykonávání relace resetovat pomocí REVERT nebo vykonáním jiného EXECUTE AS příkazu. Kontext nastavený příkazem zůstane v platnosti, dokud se relace nepřepustí.

Když je specifikována klauzule WITH NO REVERT COOKIE = @varbinary_variable, Databázový stroj systému SQL Server předá hodnotu cookie @varbinary_variable. Kontext vykonávání nastavený tímto příkazem lze vrátit do předchozího kontextu pouze tehdy, pokud příkaz volání REVERT WITH COOKIE = @varbinary_variable obsahuje stejnou hodnotu @varbinary_variable .

Tato možnost je užitečná v prostředí, ve kterém se používá sdružování připojení. Sdružování připojení je údržba skupiny databázových připojení pro opakované použití aplikacemi na aplikačním serveru. Protože hodnota předaná @varbinary_variable je známa pouze volajícímu příkazu EXECUTE AS , může volající zaručit, že kontext provádění, který nastaví, nemůže nikdo jiný změnit.

Určení původního přihlášení

Pomocí funkce ORIGINAL_LOGIN vrátíte název přihlášení připojeného k instanci SQL Server. Tuto funkci můžete použít k vrácení identity původního přihlášení v relacích, ve kterých existuje mnoho explicitních nebo implicitních kontextových přepínačů.

Dovolení

Pro specifikaci EXECUTE AS při přihlášení musí mít volající oprávnění IMPERSONATE na uvedené přihlašovací jméno a nesmí mu být odepřeno žádné povolení IMPERSONATE LOGIN . Pro určení EXECUTE AS uživatele databáze musí volající mít oprávnění IMPERSONATE na dané uživatelské jméno. Když EXECUTE AS je specifikován VOLAJÍCÍ, nejsou vyžadována oprávnění k předstírání .

Příklady

A. Použití EXECUTE AS a REVERT pro přepnutí kontextu

Následující příklad vytvoří zásobník spouštění kontextu pomocí více objektů zabezpečení. Příkaz REVERT se pak použije k resetování kontextu spuštění na předchozí volající. Příkaz REVERT se spustí několikrát a posune se do zásobníku, dokud kontext spuštění nenastavíte na původní volající.

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

Následující příklad nastaví kontext spuštění relace na zadaného uživatele a určuje WITH COOKIE INTO @varbinary_variable klauzule. Příkaz REVERT musí zadat hodnotu předanou proměnné @cookie v příkazu EXECUTE AS, aby se kontext úspěšně vrátil zpět volajícímu. Pokud chcete tento příklad spustit, musí existovat login1 přihlášení a user1 uživatel vytvořený v příkladu A.

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  

Viz také

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