KÖR SOM (Transact-SQL)
gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics
Anger körningskontexten för en session.
Som standard startar en session när en användare loggar in och slutar när användaren loggar ut. Alla åtgärder under en session är föremål för behörighetskontroller mot användaren. När en EXECUTE AS--instruktion körs växlas körningskontexten för sessionen till det angivna inloggnings- eller användarnamnet. Efter kontextväxlingen kontrolleras behörigheter mot inloggnings- och användarsäkerhetstoken för det kontot i stället för den person som anropar instruktionen EXECUTE AS. I grund och botten personifieras användar- eller inloggningskontot under hela sessionen eller modulkörningen, eller så återställs kontextväxeln uttryckligen.
Transact-SQL syntaxkonventioner
Syntax
{ EXEC | EXECUTE } AS <context_specification>
[;]
<context_specification>::=
{ LOGIN | USER } = 'name'
[ WITH { NO REVERT | COOKIE INTO @varbinary_variable } ]
| CALLER
Argument
LOGGA IN
gäller för: SQL Server 2008 (10.0.x) och senare.
Anger att körningskontexten som ska personifieras är en inloggning. Omfånget för personifiering är på servernivå.
Not
Det här alternativet är inte tillgängligt i en innesluten databas, Azure SQL Database eller Azure Synapse Analytics.
ANVÄNDARE
Anger att kontexten som ska personifieras är en användare i den aktuella databasen. Omfattningen för personifiering är begränsad till den aktuella databasen. En kontextväxling till en databasanvändare ärver inte användarens behörigheter på servernivå.
Viktig
Kontextväxlingen till databasanvändaren är aktiv, men alla försök att komma åt resurser utanför databasen gör att instruktionen misslyckas. Detta inkluderar USE database-instruktioner, distribuerade frågor och frågor som refererar till en annan databas som använder tre- eller fyradelade identifierare.
"namn" Är ett giltigt användarnamn eller inloggningsnamn. namn måste vara medlem i sysadmin fast serverroll eller finnas som huvudnamn i sys.database_principals respektive sys.server_principals.
namn kan anges som en lokal variabel.
namn måste vara ett singleton-konto och får inte vara en grupp, roll, certifikat, nyckel eller inbyggt konto, till exempel NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService eller NT AUTHORITY\LocalSystem.
Mer information finns i Ange ett användar- eller inloggningsnamn senare i det här avsnittet.
INGEN ÅTERSTÄLLNING
Anger att kontextväxlingen inte kan återställas till föregående kontext. Alternativet NO REVERT kan endast användas på adhoc-nivå.
Mer information om hur du återgår till föregående kontext finns i REVERT (Transact-SQL).
COOKIE INTO @VARBINARY_VARIABLE
Anger att körningskontexten bara kan återställas till föregående kontext om den anropande REVERT WITH COOKIE-instruktionen innehåller rätt @varbinary_variable värde. Databasmotorn skickar cookien till @varbinary_variable. Alternativet COOKIE INTO kan endast användas på adhoc-nivå.
@varbinary_variable är varbinary(8000).
Not
Cookien OUTPUT parametern för dokumenteras för närvarande som varbinary(8000) vilket är rätt maximal längd. Den aktuella implementeringen returnerar dock varbinary(100). Program bör reservera varbinary(8000) så att programmet fortsätter att fungera korrekt om cookiens returstorlek ökar i en framtida version.
BESÖKARE
När de används i en modul anger du att instruktionerna i modulen körs i kontexten för modulens anropare.
När den används utanför en modul har instruktionen ingen åtgärd.
Not
Det här alternativet är inte tillgängligt i Azure Synapse Analytics.
Anmärkningar
Ändringen i körningskontexten gäller tills något av följande inträffar:
En annan EXECUTE AS-instruktion körs.
En REVERT-instruktion körs.
Sessionen tas bort.
Den lagrade proceduren eller utlösaren där kommandot kördes avslutas.
Du kan skapa en körningskontextstack genom att anropa EXECUTE AS-instruktionen flera gånger över flera huvudkonton. När den anropas växlar REVERT-instruktionen kontexten till inloggningen eller användaren i nästa nivå upp i kontextstacken. En demonstration av det här beteendet finns i Exempel A.
Ange ett användar- eller inloggningsnamn
Det användar- eller inloggningsnamn som anges i EXECUTE AS-<context_specification> måste finnas som huvudnamn i sys.database_principals eller sys.server_principals, eller så misslyckas EXECUTE AS-instruktionen. Dessutom måste IMPERSONATE-behörigheter beviljas för huvudkontot. Om anroparen inte är databasägare eller är medlem i sysadmin fast serverroll, måste huvudnamnet finnas även när användaren har åtkomst till databasen eller instansen av SQL Server via ett Windows-gruppmedlemskap. Anta till exempel följande villkor:
CompanyDomain\SQLUsers grupp har åtkomst till databasen Sales.
CompanyDomain\SqlUser1 är medlem i SQLUsers och har därför implicit åtkomst till databasen Sales.
Även om CompanyDomain\SqlUser1 har åtkomst till databasen via medlemskap i gruppen SQLUsers misslyckas instruktionen EXECUTE AS USER = 'CompanyDomain\SqlUser1'
eftersom CompanyDomain\SqlUser1
inte finns som huvudnamn i databasen.
Om användaren är överbliven (den associerade inloggningen finns inte längre) och användaren inte har skapats med UTAN INLOGGNING, misslyckas KÖR SOM- för användaren.
Bästa praxis
Ange en inloggning eller användare som har de lägsta behörigheter som krävs för att utföra åtgärderna i sessionen. Ange till exempel inte ett inloggningsnamn med behörigheter på servernivå, om endast behörigheter på databasnivå krävs. eller ange inte ett databasägarkonto om inte dessa behörigheter krävs.
Försiktighet
EXECUTE AS-instruktionen kan lyckas så länge databasmotorn kan matcha namnet. Om det finns en domänanvändare kanske Windows kan matcha användaren för databasmotorn, även om Windows-användaren inte har åtkomst till SQL Server. Detta kan leda till ett villkor där en inloggning utan åtkomst till SQL Server verkar vara inloggad, men den personifierade inloggningen skulle bara ha behörigheter som beviljats till offentlig eller gäst.
Använda UTAN ÅTERSTÄLLNING
När EXECUTE AS-instruktionen innehåller den valfria MED INGEN REVERT-sats kan körningskontexten för en session inte återställas med REVERT eller genom att köra en annan EXECUTE AS-instruktion. Kontexten som anges av -instruktionen gäller tills sessionen har tagits bort.
När satsen WITH NO REVERT COOKIE = @varbinary_variable anges skickar SQL Server Database Engine cookievärdet till @varbinary_variable. Körningskontexten som anges av instruktionen kan bara återställas till föregående kontext om anropande REVERT WITH COOKIE = @varbinary_variable-instruktionen innehåller samma @varbinary_variable värde.
Det här alternativet är användbart i en miljö där anslutningspooler används. Anslutningspooler är underhållet av en grupp databasanslutningar för återanvändning av program på en programserver. Eftersom värdet som skickas till @varbinary_variable bara är känt för anroparen av EXECUTE AS-instruktionen kan anroparen garantera att körningskontexten som de upprättar inte kan ändras av någon annan.
Fastställa den ursprungliga inloggningen
Använd funktionen ORIGINAL_LOGIN för att returnera namnet på inloggningen som är ansluten till SQL Server-instansen. Du kan använda den här funktionen för att returnera identiteten för den ursprungliga inloggningen i sessioner där det finns många explicita eller implicita kontextväxlar.
Behörigheter
Om du vill ange KÖR SOM- vid en inloggning måste anroparen ha PERSONIFIERa behörighet för det angivna inloggningsnamnet och får inte nekas behörigheten PERSONIFIERA INLOGGNINGAR. Om du vill ange KÖR SOM- på en databasanvändare måste anroparen ha PERSONIFIERa behörigheter för det angivna användarnamnet. När EXECUTE AS CALLER har angetts krävs inte PERSONIFIERING behörigheter.
Exempel
A. Använda EXECUTE AS och REVERT för att växla kontext
I följande exempel skapas en kontextkörningsstack med flera huvudnamn. Instruktionen REVERT
används sedan för att återställa körningskontexten till den tidigare anroparen. Instruktionen REVERT
körs flera gånger när stacken flyttas tills körningskontexten har angetts till den ursprungliga anroparen.
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
B. Använda WITH COOKIE-satsen
I följande exempel anges körningskontexten för en session till en angiven användare och anger satsen WITH COOKIE INTO @varbinary_variable.
REVERT
-instruktionen måste ange värdet som skickas till variabeln @cookie
i EXECUTE AS
-instruktionen för att återställa kontexten till anroparen. Om du vill köra det här exemplet måste login1
inloggning och user1
användare som skapats i exempel A finnas.
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