2012-10-23 7 views
12

मैं डेटाबेस के आधार पर निम्न क्वेरी चला रहा हूँ:स्पष्टीकरण के रूप में क्यों उपयोगकर्ता/लॉगिन के रूप में अपेक्षित परिणाम वापस नहीं कर रहे हैं?

execute as user = 'domain\username' 
select * from fn_my_permissions(null, 'DATABASE') 
order by subentity_name, permission_name 
revert; 

लेकिन निम्न त्रुटि फेंक दिया जाता है:

Cannot execute as the database principal because the principal "dev\spadmin" does not exist, this type of principal cannot be impersonated, or you do not have permission.

उपयोगकर्ता डेटाबेस की dbo है, और जब मैं खोल प्रबंधन स्टूडियो में गुण, मैं देख सकता हूं कि यह उस लॉगिन से जुड़ा हुआ है। दूसरी ओर, EXECUTE AS LOGIN = 'domain\username' चल रहा है परिणाम। और यदि मैं स्पष्ट रूप से EXECUTE AS USER = 'dbo' चलाता हूं, तो मुझे परिणाम मिलते हैं। मेरे पास एक अलग डेटाबेस भी है जहां यह वही परिदृश्य EXECUTE AS USER और EXECUTE AS LOGIN दोनों के साथ परिणाम देता है।

एक अलग उपयोगकर्ता के साथ एक और परिदृश्य में, मैंने EXECUTE AS LOGIN = 'domain\username' चलाया है और मुझे परिणाम नहीं मिलते हैं, लेकिन मुझे EXECUTE AS USER = 'domain\username' के साथ परिणाम मिलते हैं।

इन परिदृश्यों में दोनों उपयोगकर्ता लॉग इन से जुड़े हैं जो डेटाबेस के लिए db_owner के सदस्य हैं।

क्या कोई मुझे बता सकता है कि ये प्रश्न उन परिणामों को वापस क्यों नहीं कर रहे हैं जिनकी मैं अपेक्षा करता हूं? और अगर मुझे कोई महत्वपूर्ण जानकारी याद आ रही है तो मुझे बताएं। धन्यवाद!

उत्तर

9

समस्या क्योंकि लॉग इन domain\username, डेटाबेस की dbo है भी इसका मतलब है कि कि कि डेटाबेस के भीतर उनकी संगत उपयोगकर्ता नाम dbo और नहींdomain\username है।

+0

जो चीज मुझे भ्रमित करती है वह यह है कि 'उपयोगकर्ता के रूप में निष्पादित करें' 'डोमेन \ उपयोगकर्ता नाम' दूसरे डेटाबेस पर काम करता है जहां उपयोगकर्ता डीबीओ है लेकिन इस डेटाबेस पर नहीं। कोई विचार क्यों हो सकता है? – athom

+0

मेरा अनुमान है कि वे एक गैर-डीबीओ उपयोगकर्ता थे और बाद में डेटाबेस के मालिक बन गए, लेकिन उनकी पुरानी उपयोगकर्ता प्रविष्टि पीछे छोड़ दी गई। ऐसा नहीं होना चाहिए लेकिन मैंने इसे निश्चित रूप से देखा है। – RBarryYoung

+0

मैंने यह देखने के लिए जांच की कि दोनों उपयोगकर्ताओं के बीच अंतर क्या था। वह उपयोगकर्ता जहां 'उपयोगकर्ता के रूप में निष्पादित करें' क्वेरी काम नहीं कर रही थी, उसके पास डीबीक्रिएटर, सार्वजनिक और सुरक्षा व्यवस्थापक की सर्वर भूमिकाएं हैं।उपयोगकर्ता जिस क्वेरी में काम करता था, सभी सर्वर भूमिकाएं थीं। एक बार जब मैंने इसे अन्य उपयोगकर्ता के समान भूमिका निभाई, तो मुझे अन्य उपयोगकर्ता के समान परिणाम मिल गए। – athom

1

रन ALTER AUTHORIZATION ON DATABASE::[<yourdb>] TO [sa]

+1

मैं डेटाबेस के बारे में कुछ भी बदलना नहीं चाहता, क्योंकि इस क्वेरी को चलाने वाले एप्लिकेशन का अंततः क्लाइंट मशीनों पर उपयोग किया जाएगा। मैं बस यह निर्धारित करने के लिए कि क्या यह सही तरीके से कॉन्फ़िगर किया गया है, एक विशिष्ट उपयोगकर्ता/लॉगिन की अनुमतियां प्राप्त करना चाहता हूं। जब तक मैं गलत नहीं समझता कि वास्तव में वह क्वेरी क्या कर रही है। – athom

0

मुझे एक संग्रहीत प्रक्रिया के लिए एक ही त्रुटि थी जो मैंने लिखा था।

मैंने पाया त्रुटि तरह से मैं क्वेरी

SELECT emp_no 
FROM db_name.employee 
WHERE emp_no = 1234 

मैं db_name2 पर प्रक्रिया को क्रियान्वित किया गया था एक बार मैं अपने स्क्रिप्ट से डेटाबेस नाम हटा में डेटाबेस नाम निर्दिष्ट किया था के कारण हुई थी

SELECT emp_no 
FROM employee 
WHERE emp_no = 1234 

यह ठीक काम किया।

मुझे नहीं लगता कि लॉग के कम एक्सेस अधिकार अन्य डेटाबेस या use db_name कमांड के उपयोग के लिए अनुमति देते हैं।

संबंधित मुद्दे