Sdílet prostřednictvím


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. Při spuštění příkazu EXECUTE AS se kontext spuštění relace přepne na zadané přihlašovací jméno nebo uživatelské jméno. Po přepnutí kontextu se oprávnění kontrolují vůči přihlašovacím tokenům a tokenům zabezpečení uživatele pro tento účet místo osoby, která volá příkaz EXECUTE AS. 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

PŘIHLÁŠENÍ DO SYSTÉMU
platí pro: 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.

UŽIVATEL
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.

BEZ VRÁCENÍ ZPĚT
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 úrovni adhoc.

Další informace o návratu k předchozímu kontextu najdete v tématuREVERT (Transact-SQL).

COOKIE INTO @varbinary_variable
Určuje kontext spuštění lze vrátit zpět k předchozímu kontextu, pokud volající příkaz REVERT WITH COOKIE obsahuje správnou @varbinary_variable hodnotu. Databázový stroj 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í ve službě 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í:

  • Spustí se další příkaz EXECUTE AS.

  • Spustí se příkaz REVERT.

  • Relace se zahodí.

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

Zásobník kontextu spuštění můžete vytvořit voláním příkazu EXECUTE AS vícekrát napříč více objekty zabezpečení. Při zavolání příkaz REVERT přepne kontext na přihlašovací jméno nebo uživatele v další úrovni nahoru 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živatel nebo přihlašovací jméno zadané v příkazu EXECUTE AS <context_specification> musí existovat jako objekt zabezpečení v sys.database_principals nebo sys.server_principalsnebo 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 role správce systému pevný server, musí objekt zabezpečení existovat, i když uživatel přistupuje k databázi nebo instanci SQL Serveru 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 osamocený (přidružené přihlášení již neexistuje) a uživatel nebyl vytvořen s BEZ PŘIHLÁŠENÍ, SPUSTIT JAKO pro uživatele selže.

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 být úspěšný, pokud databázový stroj dokáže přeložit název. Pokud existuje uživatel domény, systém Windows může být schopen přeložit uživatele pro databázový stroj, i když uživatel systému Windows nemá přístup k SQL Serveru. To může vést k podmínce, kdy se zdá, že přihlášení bez přístupu k SQL Serveru je přihlášené, i když zosobněné přihlášení by mělo udělená jenom oprávnění veřejnosti nebo hosta.

Použití FUNKCE WITH NO REVERT

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

Pokud je zadána klauzule WITH NO REVERT COOKIE = @varbinary_variable, databázový stroj SQL Serveru předá hodnotu cookie @varbinary_variable. Kontext spuštění nastavený tímto příkazem lze vrátit pouze k předchozímu kontextu, pokud volání REVERT WITH COOKIE = @varbinary_variable příkaz obsahuje stejnou @varbinary_variable hodnotu.

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. Vzhledem k tomu, že hodnota předaná @varbinary_variable je známa pouze volajícímu příkazu EXECUTE AS, volající může zaručit, že kontext spuštění, který naváže, nemůže změnit nikdo jiný.

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 Serveru. 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í

Chcete-li zadat SPUSTIT JAKO pro přihlášení, musí volající mít oprávnění ZOSOBNIT k zadanému přihlašovacímu jménu a nesmí být odepřeno Zosobnit žádné přihlašovací oprávnění. Chcete-li zadat SPUSTIT JAKO pro uživatele databáze, volající musí mít oprávnění ZOSOBNIT pro zadané uživatelské jméno. Pokud je zadán SPUSTIT JAKO VOLAJÍCÍ, oprávnění ZOSOBNIT se nevyžadují.

Příklady

A. Použití příkazu EXECUTE AS a REVERT k 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 (Transact-SQL)