Serwisanci dostępni teraz · czynne całą dobę, także w weekendy i świętaWarszawa i okolice · dojazd bezpłatny
Darmowa diagnoza laptopa
Darmowa diagnoza laptopa
Dojazd do klienta bezpłatnie
Dojazd do klienta bezpłatnie
Laptopy zastępcze bezpłatnie
Laptopy zastępcze bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie

EXECUTE AS USER

Termin Definicja
EXECUTE AS USER

EXECUTE AS USER to wariant tej klauzuli umożliwiający zmianę kontekstu wykonania na poziomie użytkownika bazy danych.

EXECUTE AS USER w SQL Server

EXECUTE AS USER jest wariantem mechanizmu EXECUTE AS w Microsoft SQL Server, który przełącza kontekst wykonywania na określonego użytkownika bazy danych. Użytkownik bazy danych jest principalem zdefiniowanym w konkretnej bazie, a jego informacje można sprawdzać między innymi w widoku katalogowym sys.database_principals. Nie jest to przełączenie na login serwera. W przypadku składni USER SQL Server szuka wskazanego principalu w bieżącej bazie danych.

Po zmianie kontekstu aparat SQL Server wykonuje kontrole uprawnień wobec tokenu bezpieczeństwa impersonowanego użytkownika, a nie wyłącznie wobec osoby, która rozpoczęła sesję. Przykładowa instrukcja ma postać EXECUTE AS USER = 'NazwaUzytkownika';. Od tego momentu zapytania wykonywane w zakresie obowiązywania kontekstu są analizowane tak, jakby były uruchamiane przez wskazanego użytkownika bazy. Bieżący kontekst można sprawdzić funkcją USER_NAME() albo funkcją CURRENT_USER.

Różnica między użytkownikiem bazy a loginem serwera

W SQL Server login jest principalem na poziomie instancji, natomiast użytkownik jest principalem na poziomie konkretnej bazy danych. Dlatego EXECUTE AS USER nie służy do przełączania na konto znajdujące się wyłącznie w sys.server_principals. Jeżeli wskazana nazwa nie odpowiada użytkownikowi istniejącemu w bieżącej bazie, instrukcja zakończy się błędem. Sam fakt, że konto Windows ma dostęp do bazy przez członkostwo w grupie, nie zawsze oznacza, że można użyć jego nazwy jako docelowego użytkownika w tej składni.

Przełączenie kontekstu wymaga odpowiednich uprawnień do impersonacji. W typowym przypadku wykonujący instrukcję musi posiadać uprawnienie IMPERSONATE względem docelowego użytkownika, chyba że działa w uprzywilejowanym kontekście, na przykład jako właściciel bazy lub członek odpowiedniej stałej roli serwera. Uprawnienie do uruchomienia procedury, zapytania albo funkcji nie jest automatycznie tym samym co prawo do impersonowania dowolnego użytkownika bazy danych. To rozróżnienie ma znaczenie przy analizie błędów autoryzacji.

Zakres działania i powrót do pierwotnego kontekstu

Instrukcja EXECUTE AS USER może zmienić kontekst bieżącej sesji. Aby zakończyć przełączenie i wrócić do wcześniejszego kontekstu, stosuje się REVERT. W kodzie wielopoziomowym przełączenia mogą tworzyć stos kontekstów, dlatego liczba instrukcji REVERT powinna odpowiadać rzeczywiście wykonanym zmianom. Jeżeli przełączenie jest wykonywane w ramach modułu, takiego jak procedura składowana, jego zakres może być związany z wykonaniem tego modułu, zależnie od użytej składni i sposobu zdefiniowania modułu.

W przypadku dynamicznego polecenia można ograniczyć przełączenie do zakresu wykonywanego polecenia, używając składni EXECUTE ('...') AS USER = 'NazwaUzytkownika'. Jest to inny zakres niż przełączenie całej sesji. SQL Server sprawdza wtedy uprawnienia wymagane przez dynamiczny kod wobec wskazanego użytkownika. Trzeba jednak pamiętać, że dynamiczny SQL nie zawsze korzysta z tych samych reguł co zwykłe zapytania objęte łańcuchem własności. Jeżeli właściciele obiektów są różni albo zapytanie jest dynamiczne, uprawnienia do obiektów docelowych mogą być sprawdzane bezpośrednio.

Analiza uprawnień przy użyciu EXECUTE AS USER

Mechanizm jest używany między innymi do kontrolowanego wykonywania procedur składowanych, funkcji i innych modułów w kontekście określonego użytkownika bazy. Pozwala sprawdzić, czy dany fragment kodu rzeczywiście działa z uprawnieniami przewidzianymi dla konkretnego principalu. Przy diagnostyce należy rozdzielić kilka możliwych przyczyn problemu: brak użytkownika w bieżącej bazie, brak uprawnienia IMPERSONATE, brak uprawnienia EXECUTE do modułu, brak dostępu do obiektu oraz nieprawidłowy zakres przełączenia.

Podstawową kontrolę można wykonać, sprawdzając użytkownika w sys.database_principals, a następnie porównując jego uprawnienia do obiektów z wymaganiami zapytania. Pomocne są także funkcje USER_NAME(), SUSER_SNAME() i ORIGINAL_LOGIN(). Pierwsza pokazuje bieżącego użytkownika bazy, druga zwraca nazwę loginu reprezentowanego przez bieżący kontekst, a trzecia pozwala ustalić login, który rozpoczął pierwotną sesję. Po przełączeniu te wartości nie muszą wskazywać tej samej tożsamości. Jeżeli moduł ma zapisany kontekst wykonania, można sprawdzić metadane modułu, w tym kolumnę execute_as_principal_id w sys.sql_modules. Diagnostyka środowiska SQL Server powinna obejmować również bezpieczne przejrzenie definicji procedur, zależności między obiektami oraz kolejności instrukcji EXECUTE AS i REVERT.

+48 22 100 48 29Zadzwoń teraz · serwisant w 1 godzinę