EXECUTE AS (Transact-SQL)
Dotyczy:sql ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics
Ustawia kontekst wykonywania sesji.
Domyślnie sesja rozpoczyna się, gdy użytkownik loguje się i kończy się po wylogowaniu użytkownika. Wszystkie operacje podczas sesji podlegają kontroli uprawnień względem tego użytkownika. Po uruchomieniu instrukcji EXECUTE AS kontekst wykonywania sesji jest przełączany na określoną nazwę logowania lub użytkownika. Po przełączeniu kontekstu uprawnienia są sprawdzane względem tokenów logowania i zabezpieczeń użytkownika dla tego konta zamiast osoby wywołującej instrukcję EXECUTE AS. W istocie użytkownik lub konto logowania jest personifikowane przez czas trwania sesji lub wykonywania modułu lub przełącznik kontekstu jest jawnie przywracany.
Transact-SQL konwencje składni
Składnia
{ EXEC | EXECUTE } AS <context_specification>
[;]
<context_specification>::=
{ LOGIN | USER } = 'name'
[ WITH { NO REVERT | COOKIE INTO @varbinary_variable } ]
| CALLER
Argumenty
LOGIN
Dotyczy: SQL Server 2008 (10.0.x) i nowszych.
Określa kontekst wykonywania, który ma być personifikowany, jest identyfikatorem logowania. Zakres personifikacji jest na poziomie serwera.
Nuta
Ta opcja nie jest dostępna w zawartej bazie danych, usłudze Azure SQL Database lub usłudze Azure Synapse Analytics.
UŻYTKOWNIK
Określa kontekst, który ma być personifikowany, jest użytkownikiem w bieżącej bazie danych. Zakres personifikacji jest ograniczony do bieżącej bazy danych. Przełączenie kontekstu do użytkownika bazy danych nie dziedziczy uprawnień na poziomie serwera tego użytkownika.
Ważny
Gdy przełączenie kontekstu do użytkownika bazy danych jest aktywne, każda próba uzyskania dostępu do zasobów spoza bazy danych spowoduje niepowodzenie instrukcji. Obejmuje to instrukcje use database, zapytania rozproszone i zapytania odwołujące się do innej bazy danych używającej trzech lub czterech części identyfikatorów.
'nazwa' Jest prawidłowym użytkownikiem lub nazwą logowania. nazwa musi być członkiem sysadmin stałej roli serwera lub istnieć jako podmiot zabezpieczeń odpowiednio w sys.database_principals lub sys.server_principals.
nazwę można określić jako zmienną lokalną.
nazwa musi być pojedynczym kontem i nie może być grupą, rolą, certyfikatem, kluczem lub wbudowanym kontem, takim jak NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService lub NT AUTHORITY\LocalSystem.
Aby uzyskać więcej informacji, zobacz Określanie nazwy użytkownika lub nazwy logowania w dalszej części tego tematu.
BRAK PRZYWRACANIA
Określa, że nie można przywrócić przełącznika kontekstu do poprzedniego kontekstu. Opcja NIE ODWRÓĆ może być używana tylko na poziomie adhoc.
Aby uzyskać więcej informacji na temat przywracania do poprzedniego kontekstu, zobacz REVERT (Transact-SQL).
PLIK COOKIE DO @varbinary_variable
Określa kontekst wykonywania można przywrócić tylko do poprzedniego kontekstu, jeśli wywoływanie instrukcji REVERT WITH COOKIE zawiera poprawną wartość @varbinary_variable. Aparat bazy danych przekazuje plik cookie do @varbinary_variable. Opcja COOKIE INTO może być używana tylko na poziomie adhoc.
@varbinary_variable jest varbinary(8000).
Nuta
Parametr OUTPUT pliku cookie dla parametru jest obecnie udokumentowany jako varbinary(8000) który jest prawidłową maksymalną długością. Jednak bieżąca implementacja zwraca varbinary(100). Aplikacje powinny zarezerwować varbinary(8000) tak, aby aplikacja nadal działała prawidłowo, jeśli rozmiar zwracany przez plik cookie wzrośnie w przyszłej wersji.
OBIEKT WYWOŁUJĄCY
W przypadku użycia wewnątrz modułu określa instrukcje wewnątrz modułu są wykonywane w kontekście obiektu wywołującego modułu.
W przypadku użycia poza modułem instrukcja nie ma żadnej akcji.
Nuta
Ta opcja nie jest dostępna w usłudze Azure Synapse Analytics.
Uwagi
Zmiana kontekstu wykonywania pozostaje w mocy do momentu wystąpienia jednej z następujących czynności:
Zostanie uruchomiona inna instrukcja EXECUTE AS.
Zostanie uruchomiona instrukcja REVERT.
Sesja zostanie porzucona.
Procedura składowana lub wyzwalacz, w którym polecenie zostało wykonane, kończy działanie.
Stos kontekstu wykonywania można utworzyć, wywołując instrukcję EXECUTE AS wiele razy w wielu podmiotach zabezpieczeń. Po wywołaniu instrukcja REVERT przełącza kontekst na identyfikator logowania lub użytkownika w następnym poziomie w górę w stosie kontekstu. Aby zapoznać się z pokazem tego zachowania, zobacz Przykładowy.
Określanie nazwy użytkownika lub nazwy logowania
Nazwa użytkownika lub logowania określona w <context_specification> EXECUTE AS musi istnieć jako podmiot zabezpieczeń w sys.database_principals lub sys.server_principals, odpowiednio, lub instrukcja EXECUTE AS kończy się niepowodzeniem. Ponadto uprawnienia IMPERSONATE muszą być przyznawane dla podmiotu zabezpieczeń. Jeśli obiekt wywołujący nie jest właścicielem bazy danych lub jest członkiem sysadmin stałej roli serwera, podmiot zabezpieczeń musi istnieć nawet wtedy, gdy użytkownik uzyskuje dostęp do bazy danych lub wystąpienia programu SQL Server za pośrednictwem członkostwa w grupie systemu Windows. Załóżmy na przykład następujące warunki:
CompanyDomain\SQLUsers grupa ma dostęp do bazy danych Sales.
CompanyDomain\SqlUser1 jest członkiem SQLUsers i dlatego ma niejawny dostęp do bazy danych Sales.
Mimo że CompanyDomain\SqlUser1 ma dostęp do bazy danych za pośrednictwem członkostwa w grupie SQLUsers, instrukcja EXECUTE AS USER = 'CompanyDomain\SqlUser1'
kończy się niepowodzeniem, ponieważ CompanyDomain\SqlUser1
nie istnieje jako podmiot zabezpieczeń w bazie danych.
Jeśli użytkownik jest oddzielony (skojarzony identyfikator logowania już nie istnieje), a użytkownik nie został utworzony przy użyciu BEZ logowania, WYKONAJ JAKO zakończy się niepowodzeniem dla użytkownika.
Najlepsze rozwiązanie
Określ identyfikator logowania lub użytkownika, który ma najmniejsze uprawnienia wymagane do wykonywania operacji w sesji. Na przykład nie należy określać nazwy logowania z uprawnieniami na poziomie serwera, jeśli wymagane są tylko uprawnienia na poziomie bazy danych; lub nie określaj konta właściciela bazy danych, chyba że te uprawnienia są wymagane.
Ostrożność
Instrukcja EXECUTE AS może zakończyć się powodzeniem, o ile aparat bazy danych może rozpoznać nazwę. Jeśli użytkownik domeny istnieje, system Windows może być w stanie rozpoznać użytkownika aparatu bazy danych, mimo że użytkownik systemu Windows nie ma dostępu do programu SQL Server. Może to prowadzić do sytuacji, w której logowanie bez dostępu do programu SQL Server wydaje się być rejestrowane, chociaż personifikowany identyfikator logowania będzie miał tylko uprawnienia przyznane publicznie lub gościowi.
Używanie FUNKCJI BEZ PRZYWRACANIA
Jeśli instrukcja EXECUTE AS zawiera opcjonalną klauzulę BEZ REVERT, kontekst wykonywania sesji nie może zostać zresetowany przy użyciu funkcji REVERT lub przez wykonanie innej instrukcji EXECUTE AS. Kontekst ustawiony przez instrukcję pozostaje w mocy, dopóki sesja nie zostanie porzucona.
Po określeniu klauzuli WITH NO REVERT COOKIE = @varbinary_variable aparat bazy danych programu SQL Server przekazuje wartość pliku cookie do @varbinary_variable. Kontekst wykonywania ustawiony przez tę instrukcję można przywrócić tylko do poprzedniego kontekstu, jeśli wywołanie funkcji REVERT WITH COOKIE = @varbinary_variable instrukcja zawiera tę samą wartość @varbinary_variable.
Ta opcja jest przydatna w środowisku, w którym jest używane buforowanie połączeń. Buforowanie połączeń to konserwacja grupy połączeń bazy danych do ponownego użycia przez aplikacje na serwerze aplikacji. Ponieważ wartość przekazana do @varbinary_variable jest znana tylko obiektowi wywołującym instrukcji EXECUTE AS, obiekt wywołujący może zagwarantować, że kontekst wykonywania, który ustanawia, nie może zostać zmieniony przez nikogo innego.
Określanie oryginalnego identyfikatora logowania
Użyj funkcji ORIGINAL_LOGIN, aby zwrócić nazwę logowania połączonego z wystąpieniem programu SQL Server. Za pomocą tej funkcji można zwrócić tożsamość oryginalnego identyfikatora logowania w sesjach, w których istnieje wiele jawnych lub niejawnych przełączników kontekstowych.
Uprawnienia
Aby określić EXECUTE AS podczas logowania, obiekt wywołujący musi mieć PERSONIFIKUJ uprawnienia do określonej nazwy logowania i nie może zostać odrzucony PERSONIfikuj wszelkie uprawnienia logowania. Aby określić EXECUTE AS w użytkowniku bazy danych, obiekt wywołujący musi mieć PERSONIFIKUJ uprawnienia do określonej nazwy użytkownika. Po określeniu EXECUTE AS CALLER nie są wymagane personifikacji uprawnień.
Przykłady
A. Używanie funkcji EXECUTE AS i REVERT w celu przełączenia kontekstu
Poniższy przykład tworzy stos wykonywania kontekstu przy użyciu wielu podmiotów zabezpieczeń. Instrukcja REVERT
jest następnie używana do resetowania kontekstu wykonywania do poprzedniego obiektu wywołującego. Instrukcja REVERT
jest wykonywana wiele razy w górę stosu, dopóki kontekst wykonywania nie zostanie ustawiony na oryginalny obiekt wywołujący.
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. Używanie klauzuli WITH COOKIE
Poniższy przykład ustawia kontekst wykonywania sesji dla określonego użytkownika i określa klauzulę WITH COOKIE INTO @varbinary_variable. Instrukcja REVERT
musi określać wartość przekazaną do zmiennej @cookie
w instrukcji EXECUTE AS
, aby pomyślnie przywrócić kontekst z powrotem do obiektu wywołującego. Aby uruchomić ten przykład, login1
identyfikator logowania i user1
użytkownik utworzony w przykładzie A musi istnieć.
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