Ostatnio używam EXECUTE AS LOGIN, aby sprawdzić, czy dana osoba może lub nie może użyć funkcji tabeli w jednej z naszych baz danych. Testy wykazały, że mógł, ale wielokrotnie zgłaszał niepowodzenie.
Osoba używa loginu „WEB”, aby połączyć się z bazą danych, i ma użytkownika „WEB” w tej bazie danych powiązanego z logowaniem „WEB”, więc wypróbowałem następujące skrypty:
-- part 1
EXECUTE AS USER = 'WEB'
GO
SELECT
USER_NAME() AS 'user_name'
,SUSER_NAME() AS 'suser_name'
,SUSER_SNAME() AS 'suser_sname'
,SYSTEM_USER AS 'system_user'
GO
REVERT
GO
i
-- part 2
EXECUTE AS LOGIN = 'WEB'
GO
SELECT
USER_NAME() AS 'user_name'
,SUSER_NAME() AS 'suser_name'
,SUSER_SNAME() AS 'suser_sname'
,SYSTEM_USER AS 'system_user'
GO
REVERT
GO
Pierwsza część była w porządku z wynikiem:
WEB | WEB | WEB | SIEĆ
Ale drugi wynik był nieco mylący:
dbo | WEB | WEB | SIEĆ
Jaka jest różnica między WYKONAJ JAKO UŻYTKOWNIK a WYKONAJ JAKO LOGOWANIE, co powoduje, że drugi się nie powiedzie? Poza tym, oczywiście, pierwszy to personifikacja na poziomie bazy danych, a drugi to personifikacja na poziomie serwera, o czym jestem świadomy i nie wyjaśnia tutaj sytuacji.