Delen via


UITVOER ALS (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics

Stelt de uitvoeringscontext van een sessie in.

Standaard start een sessie wanneer een gebruiker inlogt en eindigt wanneer de gebruiker uitlogt. Alle bewerkingen tijdens een sessie zijn onderworpen aan permissiecontroles tegen die gebruiker. Wanneer een EXECUTE AS-instructie wordt uitgevoerd, wordt de uitvoeringscontext van de sessie omgezet naar de opgegeven login of gebruikersnaam. Na de contextwissel worden de machtigingen gecontroleerd met de login- en gebruikersbeveiligingstokens voor dat account in plaats van met de persoon die de EXECUTE AS-instructie aanroept. In wezen wordt de gebruiker of het inlogaccount geïmiteerd voor de duur van de sessie- of module-uitvoering, of wordt de contextwissel expliciet teruggedraaid.

Transact-SQL syntaxis-conventies

Syntaxis

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

Arguments

LOGIN
van toepassing op: SQL Server 2008 (10.0.x) en hoger.

Geeft aan dat de uitvoeringscontext die geïmiteerd moet worden een login is. De reikwijdte van imitatie ligt op serverniveau.

Opmerking

Deze optie is niet beschikbaar in een besloten database, Azure SQL Database of Azure Synapse Analytics.

USER
Hiermee geeft u de context die moet worden geïmiteerd een gebruiker in de huidige database is. Het bereik van imitatie is beperkt tot de huidige database. Een contextwissel naar een databasegebruiker erft niet de serverniveaurechten van die gebruiker.

Belangrijk

Terwijl de contextwissel naar de databasegebruiker actief is, zal elke poging om bronnen buiten de database te benaderen ervoor zorgen dat de instructie faalt. Dit omvat USE-databasestatements , gedistribueerde queries en queries die verwijzen naar een andere database die drie- of vierdelige identificaties gebruikt.

'naam' is een geldige gebruikers- of inlognaam. Name moet lid zijn van de sysadmin vaste serverrol, of respectievelijk als principal bestaan in sys.database_principals of sys.server_principals.

naam kan worden gespecificeerd als een lokale variabele.

naam moet een singleton-account zijn en mag geen groep, rol, certificaat, sleutel of ingebouwd account zijn, zoals NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService of NT AUTHORITY\LocalSystem.

Voor meer informatie, zie Specificeren van een Gebruiker of Inlognaam later in dit onderwerp.

GEEN TERUGDRAAIEN
Geeft aan dat de contextwissel niet kan worden teruggezet naar de vorige context. De optie GEEN TERUGDRAAIEN kan alleen op adhoc-niveau worden gebruikt.

Voor meer informatie over het terugkeren naar de vorige context, zie REVERT (Transact-SQL).

KOEKJE IN @varbinary_variable
Specificeert dat de uitvoeringscontext alleen kan worden teruggezet naar de vorige context als de aanroepende REVERT WITH COOKIE-instructie de juiste @varbinary_variable waarde bevat. De Database Engine geeft de cookie door aan @varbinary_variable. De COOKIE IN-optie kan alleen op adhoc-niveau worden gebruikt.

@varbinary_variable is varbinair(8000).

Opmerking

De cookie OUTPUT-parameter voor is momenteel gedocumenteerd als varbinary(8000), wat de juiste maximale lengte is. De huidige implementatie geeft echter varbinary(100) terug. Applicaties moeten varbinary(8000) reserveren zodat de applicatie correct blijft functioneren als de cookie-return in een toekomstige release toeneemt.

BELLER
Wanneer gebruikt binnen een module, specificeert dat de statements in de module worden uitgevoerd in de context van de aanroeper van de module. Wanneer de instructie buiten een module wordt gebruikt, heeft deze geen actie.

Opmerking

Deze optie is niet beschikbaar in Azure Synapse Analytics.

Opmerkingen

De wijziging in uitvoeringscontext blijft van kracht totdat een van de volgende zich voordoet:

  • Er wordt een andere EXECUTE AS-instructie uitgevoerd.

  • Er wordt een REVERT-instructie uitgevoerd.

  • De sessie wordt afgebroken.

  • De opgeslagen procedure of trigger waar het commando werd uitgevoerd, sluit af.

Je kunt een uitvoeringscontextstack maken door de EXECUTE AS-instructie meerdere keren aan te roepen over meerdere principals heen. Wanneer deze wordt aangeroepen, schakelt de REVERT-instructie de context over naar de login of gebruiker in het volgende niveau in de contextstack. Voor een demonstratie van dit gedrag, zie Voorbeeld A.

Het specificeren van een gebruikers- of inlognaam

De gebruiker of inlognaam die in EXECUTE AS <context_specification> is gespecificeerd, moet respectievelijk als principal bestaan in sys.database_principals of sys.server_principals, anders faalt de EXECUTE AS-instructie. Daarnaast moeten IMPERSONATE-rechten aan de principal worden verleend. Tenzij de aanroeper de database-eigenaar is, of lid is van de sysadmin fixed server-rol, moet de principal bestaan zelfs wanneer de gebruiker toegang heeft tot de database of de instantie van SQL Server via een Windows-groepslidmaatschap. Stel bijvoorbeeld dat u de volgende voorwaarden hebt:

  • De CompanyDomain\SQLUsers-groep heeft toegang tot de Sales-database .

  • CompanyDomain\SqlUser1 is lid van SQLUsers en heeft daarom impliciete toegang tot de Sales-database .

Hoewel CompanyDomain\SqlUser1 toegang heeft tot de database via lidmaatschap van de SQLUsers-groep , faalt de instructie EXECUTE AS USER = 'CompanyDomain\SqlUser1' omdat CompanyDomain\SqlUser1 niet als principal in de database bestaat.

Als de gebruiker wees is (de bijbehorende login bestaat niet meer) en de gebruiker niet is aangemaakt met WITHOUT LOGIN, zal EXECUTE AS falen voor de gebruiker.

Aanbevolen procedure

Geef een login of gebruiker aan die de minste rechten heeft om de bewerkingen in de sessie uit te voeren. Geef bijvoorbeeld geen inlognaam met serverniveau-rechten op, als alleen database-niveau rechten vereist zijn; of specificeer geen database-eigenaaraccount tenzij die rechten vereist zijn.

Waarschuwing

De EXECUTE AS-instructie kan slagen zolang de Database Engine de naam kan oplossen. Als er een domeingebruiker bestaat, kan Windows mogelijk de gebruiker voor de Database Engine oplossen, ook al heeft de Windows-gebruiker geen toegang tot SQL Server. Dit kan ertoe leiden dat een login zonder toegang tot SQL Server lijkt ingelogd te zijn, hoewel de geïmiteerde login alleen de rechten krijgt die aan publiek of gast worden toegekend.

MET GEBRUIK VAN ZONDER TERUGDRAAIEN

Wanneer de EXECUTE AS-instructie de optionele WITH NO REVERT-clausule bevat, kan de uitvoeringscontext van een sessie niet worden gereset met REVERT of door een andere EXECUTE AS-instructie uit te voeren. De context die door de verklaring wordt gezet, blijft van kracht totdat de sessie wordt beëindigd.

Wanneer de clausule WITH NO REVERT COOKIE = @varbinary_variable wordt gespecificeerd, geeft de SQL Server Database Engine de cookiewaarde door aan @varbinary_variable. De uitvoeringscontext die door die instructie is ingesteld, kan alleen worden teruggezet naar de vorige context als de aanroepende REVERT WITH COOKIE = @varbinary_variable-instructie dezelfde @varbinary_variable-waarde bevat.

Deze optie is nuttig in een omgeving waarin verbindingspooling wordt gebruikt. Verbindingspooling is het onderhouden van een groep databaseverbindingen voor hergebruik door applicaties op een applicatieserver. Omdat de waarde die aan @varbinary_variable wordt doorgegeven alleen bekend is bij de aanroeper van de EXECUTE AS-instructie, kan de aanroeper garanderen dat de uitvoeringscontext die zij opstellen door niemand anders kan worden gewijzigd.

Het bepalen van de oorspronkelijke login

Gebruik de functie ORIGINAL_LOGIN om de naam terug te geven van de login die verbonden is met de instantie van SQL Server. Je kunt deze functie gebruiken om de identiteit van de oorspronkelijke login terug te geven in sessies waarin veel expliciete of impliciete contextwisselingen plaatsvinden.

Permissions

Om EXECUTE AS te specificeren bij een login, moet de aanroeper IMPERSONATE-toestemming hebben op de opgegeven loginnaam en mag de IMITATE ANY LOGIN-toestemming niet worden geweigerd. Om EXECUTE AS te specificeren op een databasegebruiker, moet de aanroeper IMPERSONATE-rechten hebben op de opgegeven gebruikersnaam. Wanneer EXECUTE AS CALLER is opgegeven, zijn IMPERSONATE-rechten niet vereist.

Voorbeelden

Eén. EXECUTE AS en REVERT gebruiken om van context te wisselen

Het volgende voorbeeld creëert een contextuitvoeringsstack met meerdere principals. De REVERT instructie wordt vervolgens gebruikt om de uitvoeringscontext terug te zetten naar de vorige caller. De REVERT instructie wordt meerdere keren uitgevoerd en omhoog in de stack totdat de uitvoeringscontext is ingesteld op de oorspronkelijke aanroeper.

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  

Het volgende voorbeeld stelt de uitvoeringscontext van een sessie in voor een gespecificeerde gebruiker en specificeert de WITH COOKIE IN @varbinary_variable clausule. De REVERT instructie moet de waarde specificeren die aan de variabele @cookie in de EXECUTE AS instructie wordt doorgegeven om de context succesvol terug te keren naar de aanroeper. Om dit voorbeeld te kunnen uitvoeren, moeten de login1 login en user1 gebruiker die in voorbeeld A zijn aangemaakt, bestaan.

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  

Zie ook

TERUGKEREN (Transact-SQL)
EXECUTE AS-component (Transact-SQL)