EXECUTE AS (Transact-SQL)

A következőre vonatkozik: SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics

Beállítja egy munkamenet végrehajtási környezetét.

Alapértelmezés szerint a munkamenet akkor indul el, amikor egy felhasználó bejelentkezik, és a felhasználó kijelentkezésekor ér véget. A munkamenetek során minden művelet engedély-ellenőrzés tárgyát képezi a felhasználóval szemben. Amikor egy EXECUTE AS utasítást futtatnak, a munkafolyamat végrehajtási kontextusa átvált a megadott bejelentkezésre vagy felhasználónévre. A kontextusváltás után a jogosultságokat a fiók bejelentkezési és felhasználói biztonsági tokenjeivel ellenőrzik, nem pedig a kijelentést hívó EXECUTE AS személy ellen. A felhasználói vagy bejelentkezési fiók lényegében a munkamenet vagy a modul végrehajtásának időtartamára van megszemélyesítve, vagy a környezeti kapcsoló explicit módon vissza lesz kapcsolva.

Transact-SQL szintaxis konvenciók

Szintaxis

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

Érvek

LOGIN
A: 2008-SQL Server (10.0.x) és újabb verziókra vonatkozik.

Megadja, hogy a megszemélyesítendő végrehajtási környezet egy bejelentkezés. A megszemélyesítés hatóköre a kiszolgáló szintjén van.

Jegyzet

Ez a beállítás nem érhető el egy tartalmazott adatbázisban, Azure SQL Database vagy Azure Synapse Analytics.

USER
Megadja, hogy a megszemélyesítendő környezet az aktuális adatbázis felhasználója-e. A megszemélyesítés hatóköre az aktuális adatbázisra korlátozódik. Az adatbázis-felhasználóra való környezeti váltás nem örökli a felhasználó kiszolgálószintű engedélyeit.

Fontos

Bár a környezet az adatbázis-felhasználóra való váltás aktív, az adatbázison kívüli erőforrások elérésére tett kísérletek az utasítás sikertelenségéhez vezetnek. Ide tartoznak a USE adatbázis- utasítások, elosztott lekérdezések és olyan lekérdezések, amelyek egy másik, három- vagy négyrészes azonosítót használó adatbázisra hivatkoznak.

'név' Érvényes felhasználó- vagy bejelentkezési név. név a sysadmin rögzített kiszolgálói szerepkör tagjának kell lennie, vagy a sys.database_principals vagy sys.server_principalstagként kell lennie.

név megadható helyi változóként.

név egyetlen fióknak kell lennie, és nem lehet csoport, szerepkör, tanúsítvány, kulcs vagy beépített fiók, például NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService vagy NT AUTHORITY\LocalSystem.

További információ: Felhasználó vagy bejelentkezési név megadása a jelen témakör későbbi részében.

NEM REVERT
Megadja, hogy a környezeti kapcsoló nem állítható vissza az előző környezetbe. A NO REVERT opció csak ad hoc szinten használható.

További információért a korábbi kontextushoz való visszatérésről lásd REVERT (Transact-SQL).

SÜTI @varbinary_variable
Megadja, hogy a végrehajtási kontextus csak akkor térhet vissza az előző kontextusba, ha a WITH COOKIE hívás REVERT tartalmazza a helyes @varbinary_variable értéket. A Database Engine átadja a cookie-t @varbinary_variable. A COOKIE INTO beállítás csak adhoc szinten használható.

@varbinary_variablevarbinary(8000).

Jegyzet

A cookie OUTPUT paraméter jelenleg varbinary(8000), amely a megfelelő maximális hossz. A jelenlegi implementáció azonban varbinary(100)ad vissza. Az alkalmazásoknak varbinary(8000) kell fenntartaniuk, hogy az alkalmazás továbbra is megfelelően működjön, ha a cookie visszatérési mérete egy későbbi kiadásban megnő.

HÍVÓ
Ha egy modulban használják, a modulon belüli utasításokat a modul hívójának kontextusában hajtja végre. Ha egy modulon kívül használják, az utasításnak nincs művelete.

Jegyzet

Ez a beállítás nem érhető el Azure Synapse Analytics.

Megjegyzések

A végrehajtási környezet módosítása mindaddig érvényben marad, amíg az alábbiak valamelyike nem következik be:

  • Egy másik EXECUTE AS nyilatkozat: futás.

  • Lefuttatják a REVERT nyilatkozatot.

  • A munkamenet el lesz ejtve.

  • A tárolt eljárás vagy eseményindító, ahol a parancsot végrehajtották, kilép.

Létrehozhatsz végrehajtási kontextusveremet azzal, hogy többször is meghívod az EXECUTE AS utasítást több alapelven keresztül. Amikor hívják, az REVERT utasítás a kontextust a következő szinten lévő bejelentkezési vagy felhasználóra váltja a kontextusveremben. Ennek a viselkedésnek a bemutatásához lásd A példa.

Felhasználó vagy bejelentkezési név megadása

A context_specification-ban> megadott EXECUTE AS<felhasználói vagy bejelentkezési névnek sys.database_principals-ben vagy sys.server_principals-ben főszereplőként kell léteznie, különben az EXECUTE AS utasítás meghibásodik. Emellett a megszemélyesítési engedélyeket meg kell adni a megbízónak. Ha a hívó nem az adatbázis tulajdonosa, vagy tagja a sysadmin rögzített kiszolgálói szerepkörnek, akkor is léteznie kell, ha a felhasználó Windows csoporttagságon keresztül fér hozzá az adatbázishoz vagy SQL Server példányához. Tegyük fel például, hogy a következő feltételek teljesülnek:

  • CompanyDomain\SQLUsers csoport hozzáfér a Sales adatbázishoz.

  • CompanyDomain\SqlUser1SQLUsers tagja, ezért implicit hozzáféréssel rendelkezik a Sales adatbázishoz.

Bár CompanyDomain\SqlUser1 a SQLUsers csoport tagságán keresztül fér hozzá az adatbázishoz, a EXECUTE AS USER = 'CompanyDomain\SqlUser1' utasítás meghiúsul, mert CompanyDomain\SqlUser1 nem létezik egyszerűként az adatbázisban.

Ha a felhasználó árva (a hozzá tartozó bejelentkezés már nem létezik), és a felhasználót nem WITHOUT LOGINrendszerrel hozták létre, EXECUTE AS akkor a felhasználó számára sikertelen.

Ajánlott eljárás

Adjon meg egy olyan bejelentkezést vagy felhasználót, amely a munkamenet műveleteinek végrehajtásához szükséges legkisebb jogosultságokkal rendelkezik. Például ne adjon meg kiszolgálószintű engedélyekkel rendelkező bejelentkezési nevet, ha csak adatbázisszintű engedélyekre van szükség; vagy ne adjon meg adatbázis-tulajdonosi fiókot, kivéve, ha ezekre az engedélyekre van szükség.

Figyelmeztet

Az utasítás EXECUTE AS sikeres lehet, amíg a Database Engine képes feloldani a nevet. Ha létezik tartományi felhasználó, előfordulhat, hogy Windows meg tudja oldani a Database Engine felhasználót, annak ellenére, hogy a Windows felhasználó nem rendelkezik hozzáféréssel a SQL Server. Ez olyan feltételhez vezethet, amelyben úgy tűnik, hogy a SQL Server hozzáféréssel nem rendelkező bejelentkezés be van jelentkezve, bár a megszemélyesített bejelentkezés csak a nyilvános vagy vendég számára biztosított engedélyekkel rendelkezik.

Biztonsági megfontolások

A dbo tulajdonjog kontextusában történő végrehajtás, például a kijelentés EXECUTE AS USER = 'dbo'használatával, megváltoztatja az explicit DENY jogosultságok értékelését. Amikor a végrehajtási kontextust átváltod a dbo tulajdonjog kontextusára, az eredeti hívó alapvetőre vonatkozó engedély-alapú DENY korlátozások nem érvényben maradnak az imidentáció időtartama alatt. Ennek eredményeként egy megbízó, amely képes átváltani a végrehajtási kontextust dbo-ra, például a db_owner fix adatbázis szerepében való tagság révén, végrehajthat olyan műveleteket, amelyeket egyébként explicit DENY jogosultságok blokkolnának.

Ez a viselkedés terv szerint történik. Vegye figyelembe, ha olyan engedélyeket ad meg, amelyek lehetővé teszik a tulajdonjog megszemélyesítését. DENY Az engedélyek nem szolgálhatnak kompenzációs kontrollként, amely korlátozná a DBO-ként végrehajtható alapvetők hatékony jogosultságait.

Használat NÉLKÜLE REVERT

Ha az EXECUTE AS utasítás tartalmazza az opcionális NINCS REVERT záradékot, az ülés végrehajtási kontextusa nem állítható vissza más REVERT utasítással vagy végrehajtással EXECUTE AS . Az utasítás által beállított környezet a munkamenet elvetéséig érvényben marad.

Amikor a WITH NO REVERT COOKIE = @varbinary_variable klauzulát megadjuk, a SQL Server adatbázismotor átadja a cookie értéket @varbinary_variable-nek. Az adott utasítás által állított végrehajtási kontextus csak akkor térhet vissza az előző kontextusba, ha a WITH COOKIE = @varbinary_variable utasítás hívása REVERT ugyanazt a @varbinary_variable értéket tartalmazza.

Ez a beállítás olyan környezetben hasznos, amelyben kapcsolatkészletezést használ. A kapcsolatkészletezés az adatbázis-kapcsolatok egy csoportjának karbantartása az alkalmazáskiszolgálón lévő alkalmazások általi újrafelhasználáshoz. Mivel a @varbinary_variable-nek átadott értéket csak az utasítás hívója EXECUTE AS ismeri, a hívó garantálhatja, hogy az általa létrehozott végrehajtási kontextust senki más nem változtathatja meg.

Az eredeti bejelentkezés meghatározása

A ORIGINAL_LOGIN függvénnyel adja vissza a SQL Server példányához csatlakozó bejelentkezés nevét. Ezzel a függvénnyel visszaadhatja az eredeti bejelentkezés identitását olyan munkamenetekben, amelyekben számos explicit vagy implicit környezeti kapcsoló található.

Engedélyek

A bejelentkezésen történő megadáshoz EXECUTE AS a hívónak IMPERSONATE engedélyt kell kell biztosítania a megadott bejelentkezési néven, és nem szabad megtagadni tőle az IMPERSONATE-től SEMMILYEN LOGIN engedélyt. Az adatbázis-felhasználó megadásához EXECUTE AS a hívónak IMPERSONATE jogosultsága kell a megadott felhasználónéven. Ha EXECUTE AS a CALLER meg van jelölve, az IMPERSONATE engedély nem szükséges.

Példák

Egy. Használata EXECUTE AS és REVERT kontextus váltásához

Az alábbi példa egy több tagot használó környezet-végrehajtási vermet hoz létre. A REVERT utasítással visszaállíthatja a végrehajtási környezetet az előző hívóra. A REVERT utasítás többször lesz végrehajtva, amíg a végrehajtási környezet nem lesz az eredeti hívóra állítva.

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  

Az alábbi példa egy munkamenet végrehajtási környezetét egy adott felhasználóra állítja, és megadja a WITH COOKIE INTO @varbinary_variable záradékot. A REVERT utasításnak meg kell adnia a @cookie változónak átadott értéket a EXECUTE AS utasításban, hogy sikeresen visszaállítsa a környezetet a hívónak. A példa futtatásához léteznie kell az A példában létrehozott login1 bejelentkezésnek és user1 felhasználónak.

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  

Lásd még:

REVERT (Transact-SQL)
EXECUTE AS Záradék (Transact-SQL)