Kürzlich habe ich EXECUTE AS LOGIN verwendet, um zu überprüfen, ob eine bestimmte Person eine Tabellenfunktion in einer unserer Datenbanken verwenden kann oder nicht. Die Tests zeigten, dass er konnte, aber er meldete wiederholt einen Fehler.
Die Person verwendet Login 'WEB', um eine Verbindung zur Datenbank herzustellen, und sie hat den Benutzer 'WEB' in dieser Datenbank, der mit Login 'WEB' verknüpft ist. Daher habe ich die folgenden Skripte ausprobiert:
-- 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
und
-- 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
Der erste Teil war in Ordnung mit dem Ergebnis von:
WEB | WEB | WEB | NETZ
Das zweite Ergebnis war jedoch etwas verwirrend:
dbo | WEB | WEB | NETZ
Was ist der Unterschied zwischen EXECUTE AS USER und EXECUTE AS LOGIN, der den zweiten zum Scheitern bringt? Außerdem ist der erste natürlich die Datenbankebene und der zweite der Identitätswechsel auf Serverebene, was mir bekannt ist und was die Situation hier nicht erklärt.