เมื่อเร็ว ๆ นี้ฉันใช้ EXECUTE AS LOGIN เพื่อตรวจสอบว่าบางคนสามารถหรือไม่สามารถใช้ฟังก์ชันตารางในฐานข้อมูลของเรา การทดสอบแสดงให้เห็นว่าเขาทำได้ แต่เขารายงานความล้มเหลวซ้ำ ๆ
บุคคลนั้นใช้ชื่อเข้าสู่ระบบ 'WEB' เพื่อเชื่อมต่อกับฐานข้อมูลและมีผู้ใช้ 'เว็บ' ในฐานข้อมูลที่เกี่ยวข้องกับชื่อเข้าสู่ระบบ 'เว็บ' ดังนั้นฉันจึงลองใช้สคริปต์ต่อไปนี้:
-- 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
และ
-- 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
ส่วนแรกใช้ได้กับผลลัพธ์ของ:
เว็บ | เว็บ | เว็บ | เว็บ
แต่ผลลัพธ์ที่สองค่อนข้างสับสน:
dbo | เว็บ | เว็บ | เว็บ
ความแตกต่างระหว่าง EXECUTE AS USER และ EXECUTE AS LOGIN ทำให้ครั้งที่สองล้มเหลวคืออะไร นอกจากนี้แน่นอนคนแรกที่เป็นระดับฐานข้อมูลและคนที่สองเป็นการเลียนแบบระดับเซิร์ฟเวอร์ของสิ่งที่ฉันรู้และไม่ได้อธิบายสถานการณ์ที่นี่