2012-09-04 1 views
14

मैंने हाल ही में अपने विकास पर्यावरण को SQL 2000 से SQL 2008 R2 में अपग्रेड किया है। मैंने अपने उत्पादन डीबी का बैकअप लिया है और इसे हमारे नए देव सर्वर को बहाल कर दिया है।एसक्यूएल एक मौजूदा उपयोगकर्ता को लॉगिन करता है

मैंने dev सर्वर पर एक लॉगिन बनाया है जो मैं उत्पादन सर्वर पर उपयोग किए जाने वाले लॉगिन को प्रतिबिंबित करता हूं, लेकिन मैं इसे डेटाबेस में 'dbo' उपयोगकर्ता से मैप नहीं कर सकता। जब मैं में प्रवेश के गुणों को संपादित dbo '' उपयोगकर्ता मानचित्रण ", मैं के साथ उपयोगकर्ता की जगह ', और मैं निम्नलिखित त्रुटि मिलती है:

TITLE: Microsoft SQL Server Management Studio Create failed for User 'dbo'. (Microsoft.SqlServer.Smo) An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo) User, group, or role 'dbo' already exists in the current database. (Microsoft SQL Server, Error: 15023)

तो कैसे मैं एक मौजूदा उपयोगकर्ता के लिए एक लॉगिन मैप करते

+6

वहाँ [आल्टर उपयोगकर्ता] (http://msdn.microsoft.com/en-us/library/ms176060.aspx) कमांड है: 'लॉगिन के साथ उपयोगकर्ता xyz बदलें = [डोमेन \ उपयोगकर्ता नाम] ' –

+1

हटाएं और फिर से बनाएं उपयोगकर्ता – Paparazzi

+0

यदि मैंने जो उत्तर दिया है, वह आपकी समस्या को हल करने के लिए पर्याप्त था, तो क्या आप इसे सही समाधान के रूप में चिह्नित करना चाहते हैं? अधिक जानकारी के साथ मेटा का एक लिंक यहां दिया गया है। http://meta.stackexchange.com/a/5235/256426 – jwhaley58

उत्तर

12

लॉगिन के साथ उपयोगकर्ता में सामंजस्य के लिए, आप उदाहरण के लिए प्रणाली संग्रहीत प्रक्रिया sp_change_users_login इस्तेमाल किया जा सकता

sp_change_users_login [ @Action = ] 'action' 
[ , [ @UserNamePattern = ] 'user' ] 
[ , [ @LoginName = ] 'login' ] 
[ , [ @Password = ] 'password' ]; 

:।

EXEC sp_change_users_login 'Update_One','User123','User123'

यदि आपके पास बहुत से उपयोगकर्ता हैं जो सिंक से बाहर हैं, तो आप सभी उपयोगकर्ताओं को खींचने और उनके लिए यह आदेश चलाने के लिए कर्सर का उपयोग कर सकते हैं। उन उपयोगकर्ताओं के खिलाफ इसे चलाने के लिए कोई प्रतिकूल प्रभाव नहीं है जो सिंक्रनाइज़ नहीं हैं, और यह सभी अनाथ उपयोगकर्ताओं को ठीक करेगा।

DECLARE @sql NVARCHAR(MAX); 
DECLARE curSQL CURSOR 
FOR 
     SELECT 'EXEC sp_change_users_login ''UPDATE_ONE'', ''' + name + ''', ''' + name + '''' 
     FROM  sysusers 
     WHERE issqluser = 1 
       AND name NOT IN ('guest', 'dbo', 'sys', 'INFORMATION_SCHEMA') 
OPEN curSQL 
FETCH curSQL INTO @sql 
WHILE @@FETCH_STATUS = 0 
    BEGIN 
      EXEC (
      @sql 
      ) 
      FETCH curSQL INTO @sql 
    END 
CLOSE curSQL 
DEALLOCATE curSQL 

इस डेटाबेस के संदर्भ से चलाने के लिए है आप उन में तय की जरूरत है।

+0

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

+0

जब मैं आपकी क्वेरी चलाता हूं तो मुझे मिलता है: स्केलर वैरिएबल "@sql" घोषित करना चाहिए। – YesMan85

+0

मुझे विश्वास नहीं है कि यह पकड़े बिना इस लंबे समय तक चला गया है। उसके लिए माफ़ करना। इसे सिर्फ उस चर को घोषित करने की आवश्यकता है। मैंने इसे स्क्रिप्ट में जोड़ा। – jwhaley58

8

मुझे लगता है कि इस पोस्ट के लिए निकोला Markovinović की टिप्पणी एक जवाब के रूप में जोड़ा जाना चाहिए। ऑल्टर उपयोगकर्ता आदेश का उपयोग करें:

USE {database}; 
ALTER USER {user} WITH login = {login} 

कहाँ:

  • {डेटाबेस}: डेटाबेस अनाथ उपयोगकर्ता युक्त
  • {user}: अनाथ उपयोगकर्ता नाम
  • {LOGIN}: लॉगिन नाम। आप एक ही लॉगिन के रूप में पुराने सर्वर पर इस्तेमाल का उपयोग करें या किसी अन्य लॉगिन नाम के उपयोगकर्ता को मैप

मैं http://www.aip.im/2010/05/re-map-database-user-to-login-in-sql-server-after-restoring-or-attaching-database/#sthash.fbazv94Z.dpuf

0

पर इस उत्तर SQL सर्वर 2012 के तहत पाया जा सकता है, उपयोगकर्ता 'dbo' परिवर्तित नहीं किया जा सकता है ।