Gần đây tôi đã sử dụng EXECUTE AS LOGIN để kiểm tra xem một người nào đó có thể hoặc không thể sử dụng chức năng bảng trong một trong các cơ sở dữ liệu của chúng tôi. Các xét nghiệm cho thấy anh ta có thể nhưng anh ta liên tục báo cáo thất bại.
Người này sử dụng thông tin đăng nhập 'WEB' để kết nối với cơ sở dữ liệu và anh ta có người dùng 'WEB' trong cơ sở dữ liệu đó được liên kết với thông tin đăng nhập 'WEB', vì vậy tôi đã thử các tập lệnh sau:
-- 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
và
-- 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
Phần đầu tiên là tốt với kết quả của:
WEB | WEB | WEB | WEB
Nhưng kết quả thứ hai hơi khó hiểu:
dbo | WEB | WEB | WEB
Sự khác biệt giữa EXECUTE AS USER và EXECUTE AS LOGIN khiến cho cái thứ hai thất bại? Tất nhiên, bên cạnh đó, cái đầu tiên là cấp độ cơ sở dữ liệu và cái thứ hai là mạo danh cấp độ máy chủ, về những gì tôi biết và không giải thích tình huống ở đây.