2009-04-28 11 views
7

मैं निम्नलिखित सेटअप मिल गया है:समस्या "रूप में निष्पादित करें"

वहाँ कई तालिकाओं है कि चलाता उन पर सेट (है कि इतिहास डेटा एकत्र) के साथ एक एसक्यूएल सर्वर DB है। ये ट्रिगर EXECUTE AS 'HistoryUser' के साथ सीएलआर संग्रहीत प्रक्रियाएं हैं। HistoryUser उपयोगकर्ता लॉगिन के बिना डेटाबेस में एक साधारण उपयोगकर्ता है। इसमें सभी तालिकाओं से पढ़ने और इतिहास तालिका में लिखने के लिए पर्याप्त अनुमतियां हैं।

जब मैं डीबी बैकअप लेता हूं और फिर इसे किसी अन्य मशीन पर पुनर्स्थापित करता हूं (इस मामले में वर्चुअल मशीन, लेकिन इससे कोई फर्क नहीं पड़ता), ट्रिगर्स अब और काम नहीं करते हैं। वास्तव में, उपयोगकर्ता के लिए कोई प्रतिरूपण अब और काम नहीं करता है। यहां तक ​​कि एक साधारण बयान इस तरह के रूप में

exec ('select 3') as user='HistoryUser' 

एक त्रुटि पैदा करता है:

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

मैं read in MSDN अगर डीबी मालिक एक डोमेन उपयोगकर्ता है कि इस से हो सकता है, लेकिन यह नहीं है। और यहां तक ​​कि अगर मैं इसे किसी और चीज में बदलता हूं (उनके अनुशंसित समाधान) यह समस्या बनी हुई है।

यदि मैं लॉगिन के बिना कोई अन्य उपयोगकर्ता बनाता हूं, तो मैं इसे प्रतिरूपण के लिए ठीक से उपयोग कर सकता हूं। जो है, यह सिर्फ ठीक काम करता है:

create user TestUser without login 
go 
exec ('select 3') as user='TestUser' 

मैं उन सभी ट्रिगर पुन: नहीं करना चाहते, इसलिए वहाँ किसी भी तरह से मैं कैसे मौजूदा HistoryUser काम कर सकते हैं?

टक्कर: क्षमा करें, लेकिन इस थोड़े जरूरी है ...

उत्तर

4

क्या उपयोगकर्ता खाते के रूप में ट्रिगर निष्पादित करता है।

आपको उपयोगकर्ता खाता इतिहास उपयोगकर्ता के लिए उस उपयोगकर्ता को व्यक्तिगत निजीकरण प्रदान करने की आवश्यकता होगी।

GRANT IMPERSONATE ON USER:: YourUser TO HistoryUser 

अधिक जानकारी यहां

http://msdn.microsoft.com/en-us/library/ms181362.aspx

+0

Nop, मदद नहीं करता है। –

4

समस्याएं इस तरह है कि एक और आम तौर पर बेमेल शामिल सिड के लिए एक मशीन से एक डेटाबेस जाने के बाद पैदा होती है, हालांकि मुझे यकीन नहीं है अगर है या कैसे यह करने के लिए लागू होता है आपका मुकदमा। डेटाबेस उपयोगकर्ताओं को छोड़ने और फिर से बनाने का प्रयास करें, सुनिश्चित करें कि उन तालिकाओं पर इसकी अनुमतियों को पुनर्स्थापित करना सुनिश्चित करें।

+0

यह सिर्फ बात है - इस उपयोगकर्ता ने कभी लॉगिन नहीं किया है। क्या एसआईडी? और जैसा कि मैंने ऊपर दिए गए प्रश्न में कहा था, मैं उपयोगकर्ता को फिर से बनाना नहीं चाहूंगा, क्योंकि तब मुझे ट्रिगर्स का पूरा समूह भी बनाना होगा। –

+0

यह मेरे लिए काम किया। हमें डेटाबेस को किसी अन्य सर्वर से माइग्रेट करना पड़ा और इस समस्या में भाग गया। – ahwm

3

यह एक "अनाथ उपयोगकर्ता" है। यह काम नहीं करेगा। दस्तावेज़ीकरण यह स्पष्ट बताता है। :-( "अनाथ उपयोगकर्ता" राज्य को ठीक करें और यह फिर से काम करेगा

+2

कौन सा प्रलेखन - क्या आप एक लिंक प्रदान कर सकते हैं? धन्यवाद – doza

5

अनाथ उपयोगकर्ताओं का पता लगाएं, फिर लॉगिन से लिंक करके हल करें।

का पता लगाने:

उपयोग <Database_Name>;
जाओ;
sp_change_users_login @ एक्शन = ' रिपोर्ट ';
जाओ;

संकल्प:
निम्न आदेश डेटाबेस उपयोगकर्ता <database_user> द्वारा निर्दिष्ट के साथ <LOGIN_NAME> द्वारा निर्दिष्ट सर्वर लॉगिन खाते relinks:

उपयोग <Database_Name>;
GO
sp_change_users_login @ क्रिया = ' update_one ',
@ UserNamePattern = ' <database_user> ',
@ LOGINNAME = ' <LOGIN_NAME> ';
GO

https://msdn.microsoft.com/en-us/library/ms175475.aspx

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