Baru-baru ini saya telah menggunakan EXECUTE AS LOGIN untuk memeriksa apakah orang tertentu bisa atau tidak bisa menggunakan fungsi tabel di salah satu database kami. Tes menunjukkan bahwa dia bisa tetapi dia berulang kali melaporkan kegagalan.
Orang tersebut menggunakan login 'WEB' untuk terhubung ke database dan dia memiliki pengguna 'WEB' dalam database yang terkait dengan login 'WEB' jadi saya mencoba skrip berikut:
-- 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
dan
-- 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
Bagian pertama baik-baik saja dengan hasil:
WEB | WEB | WEB | WEB
Tetapi hasil kedua agak membingungkan:
dbo | WEB | WEB | WEB
Apa perbedaan antara EXECUTE AS USER dan EXECUTE AS LOGIN yang membuat yang kedua gagal? Selain itu, tentu saja, yang pertama adalah tingkat basis data dan yang kedua adalah peniruan tingkat server, dari apa yang saya ketahui dan tidak menjelaskan situasi di sini.