हाल ही में मैं जाँच करने के लिए लॉग इन का उपयोग कर रहा हूँ कि क्या कोई निश्चित व्यक्ति हमारे किसी डेटाबेस में टेबल फ़ंक्शन का उपयोग कर सकता है या नहीं। परीक्षणों से पता चला कि वह कर सकता था लेकिन उसने बार-बार विफलता की सूचना दी।
व्यक्ति डेटाबेस से जुड़ने के लिए लॉगिन 'वेब' का उपयोग करता है और उसके पास उस डेटाबेस में उपयोगकर्ता 'वेब' है, जो लॉगिन 'वेब' से जुड़ा है, इसलिए मैंने निम्नलिखित स्क्रिप्ट की कोशिश की:
-- 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 | वेब | वेब | वेब
USER के रूप में EXECUTE AS और EXECUTE AS LOGIN के बीच अंतर क्या है जो दूसरा विफल रहता है? इसके अलावा, निश्चित रूप से, पहला डेटाबेस स्तर और दूसरा सर्वर लेवल इंपर्सनेशन है, जिसकी मुझे जानकारी है और जो यहां की स्थिति की व्याख्या नहीं करता है।