सर्वर प्रिंसिपल SQL सर्वर MS 2012 में वर्तमान सुरक्षा संदर्भ के तहत डेटाबेस तक पहुँचने में सक्षम नहीं है


103

मैं SQL सर्वर प्रबंधन स्टूडियो के माध्यम से अपने होस्टिंग सर्वर के डेटाबेस तक पहुंचने की कोशिश कर रहा हूं, लॉगिन तक सब कुछ ठीक है लेकिन जब मैं कमांड का उपयोग करता हूं तो use myDatabaseयह समस्या देता है:

The server principal "****" is not able to access the database "****" under the current security context.

मैंने खोज की और होस्टिंग सेवा प्रदाताओं ने समस्या के लिए इस फिक्स को सूचीबद्ध किया है।

लेकिन यह मेरे लिए शायद काम नहीं कर रहा है क्योंकि यह SQL सर्वर प्रबंधन स्टूडियो 2008 के लिए है, लेकिन मैं SQL सर्वर प्रबंधन स्टूडियो 2012 का उपयोग कर रहा हूं।

क्या यह एक समस्या हो सकती है? और अगर हाँ तो क्या कोई मुझे SSMS 2012 में इसका विकल्प बता सकता है?


3
'होस्टिंग सेवा प्रदाताओं'? क्या हम समर्पित या साझा बात कर रहे हैं? यदि यह एक साझा होस्टिंग सर्वर है तो मैं सहायता के लिए आपके होस्टिंग प्रदाता से संपर्क करने की अत्यधिक सलाह देता हूं। एक साझा होस्टिंग वातावरण में SQL कुख्यात और छोटी समस्या है। इसका उत्पाद से कोई लेना-देना नहीं है लेकिन होस्टिंग प्रदाता सर्वर (एस) पर लागू होते हैं। हर होस्टिंग कंपनी के पास SQL ​​का लाभ उठाने का अपना तरीका है या ऐसा लगता है।
तेची जो

जवाबों:


80

यह देखने के लिए जांचें कि क्या आपका उपयोगकर्ता DB में मैप किया गया है जिसे आप लॉग इन करने का प्रयास कर रहे हैं।


76
आप कैसे करते हो?
ग्राहम

3
@ ग्राहम या तो उपयोगकर्ता की जाँच करने के लिए SQL सर्वर प्रबंधन स्टूडियो का उपयोग करें या इस उत्तर को देखें: stackoverflow.com/a/9356725/804773
Grambot

5
मैं ट्रिगर्स देखने के लिए सुझाव दूंगा, यही कारण था कि मुझे यह संदेश मिला, एक ट्रिगर था जो किसी अन्य डेटाबेस में कुछ सामान कर रहा था जहां मेरा उपयोगकर्ता अधिकृत नहीं था।
डेनियल जुएल

1
मैं इस जवाब के लिए ओपी की त्रुटि और टैंकों को मारता हूं, मुझे पता चला है कि मैंने अपने कनेक्शन स्ट्रिंग में Azure SQL डेटाबेस से कनेक्ट करने में डेटाबेस नाम में केवल एक बेवकूफ टाइपो था। यदि आपका डेटाबेस नाम सही है, तो आपको मास्टर तक पहुंचने की आवश्यकता नहीं है। यदि यह गलत है, तो (मेरे मामले में) मुझे लगता है कि एंटिटी फ्रेमवर्क (6.1.3) कुछ अतिरिक्त जानकारी के लिए मास्टर से जुड़कर अतिरिक्त स्मार्ट बनने की कोशिश कर रहा है (हालांकि यह केवल ईएफ से संबंधित नहीं हो सकता है - मुझे यकीन नहीं है)। लेकिन मेरा समाधान यह सुनिश्चित करना था कि मेरा कनेक्शन सही था। मुझे खराब डेटाबेस नाम के लिए एक बहुत अलग त्रुटि की उम्मीद थी। : - /
जैक्सिडियन

2
@ डैनियलवी की टिप्पणी को जोड़ने के लिए, किसी भी हार्डकोड डेटाबेस नामों के लिए संग्रहीत कार्यविधियों की भी जाँच करें। मेरे मामले में इसे ठीक कर दिया (लगभग 20 संग्रहीत प्रक्रियाओं को बदलना पड़ा)।
डेमोनसेले ३३५

26

हमारे PROD वातावरण में SSRS को एक रिपोर्ट तैनात करने में हमारी वही त्रुटि थी। यह पाया गया कि समस्या "उपयोग" कथन के साथ भी पुन: प्रस्तुत की जा सकती है। समाधान उपयोगकर्ता के GUID खाते के संदर्भ में डेटाबेस के साथ प्रश्न (यानी, "sp_change_users_login" का उपयोग करके फिर से सिंक करने के लिए था जैसे आप एक db को पुनर्स्थापित करने के बाद करेंगे)। सभी खातों को फिर से सिंक करने के लिए एक स्टॉक (कर्सर चालित) स्क्रिप्ट संलग्न है:

USE <your database>
GO

-------- Reset SQL user account guids ---------------------
DECLARE @UserName nvarchar(255) 
DECLARE orphanuser_cur cursor for 
      SELECT UserName = su.name 
      FROM sysusers su
      JOIN sys.server_principals sp ON sp.name = su.name
      WHERE issqluser = 1 AND
            (su.sid IS NOT NULL AND su.sid <> 0x0) AND
            suser_sname(su.sid) is null 
      ORDER BY su.name 

OPEN orphanuser_cur 
FETCH NEXT FROM orphanuser_cur INTO @UserName 

WHILE (@@fetch_status = 0)
BEGIN 
--PRINT @UserName + ' user name being resynced' 
exec sp_change_users_login 'Update_one', @UserName, @UserName 
FETCH NEXT FROM orphanuser_cur INTO @UserName 
END 

CLOSE orphanuser_cur 
DEALLOCATE orphanuser_cur

2
मेरे लिए काम किया धन्यवाद। मैंने अपने परीक्षण सर्वर पर SQL सर्वर प्रमाणीकरण के साथ एक डेटाबेस की प्रतिलिपि बनाई थी और यह दुर्गम था। अब यह है
माइक जे

1
यदि उपयोगकर्ता डेटाबेस में मौजूद है, लेकिन लॉगिन के लिए मैपिंग जारी रखने में विफल रहता है, तो SSMS ऑब्जेक्ट एक्सप्लोरर के माध्यम से उपयोगकर्ता को हटाने के लिए फिर लॉगिन को रीमैप करते हुए मेरे लिए काम किया। अन्यथा, मुझे संदेह है कि ऊपर प्रस्तावित समाधान को लेने की आवश्यकता होगी।
jjt

10

मैंने इस समस्या के साथ कुश्ती में काफी समय बिताया और तब मुझे एहसास हुआ कि मैं इस तथ्य में एक साधारण गलती कर रहा था कि मैं भूल गया था कि मैं किस विशेष डेटाबेस को अपने कनेक्शन को लक्षित कर रहा था। मैं क्रेडेंशियल दर्ज करने के लिए मानक SQL सर्वर कनेक्शन विंडो का उपयोग कर रहा था:

SQL सर्वर कनेक्शन विंडो

मुझे यह सत्यापित करने के लिए कनेक्शन गुण टैब की जांच करनी थी कि मैं कनेक्ट करने के लिए सही डेटाबेस चुन रहा था। मैंने गलती से कनेक्ट टू डेटाबेस विकल्प को पिछले सत्र से चयन के लिए सेट कर दिया था। यही कारण है कि मैं डेटाबेस से कनेक्ट करने में असमर्थ था मुझे लगा कि मैं कनेक्ट करने की कोशिश कर रहा था।

कनेक्शन गुण

ध्यान दें कि आपको दिखाने के Options >>लिए कनेक्शन गुण और अन्य टैब के लिए बटन पर क्लिक करना होगा।


10

यह मेरे लिए काम किया:

use <Database>
EXEC  sp_change_users_login @Action='update_one', @UserNamePattern='<userLogin>',@LoginName='<userLogin>';

इस समस्या की कल्पना की जा सकती है:

SELECT sid FROM sys.sysusers WHERE name = '<userLogin>'
SELECT sid FROM sys.syslogins WHERE name = '<userLogin>';

2
इसने मेरे लिए इसे ठीक कर दिया। धन्यवाद ! "समस्या के साथ कल्पना की जा सकती है" -> यदि वे एक अलग हैश लौटाते हैं, तो एक समस्या है और ऊपर की क्वेरी उन्हें सिंक करेगी।
बज़ाउट

6

SQL लॉगिन सर्वर स्तर पर परिभाषित किया गया है, और विशिष्ट डेटाबेस में उपयोगकर्ताओं के लिए मैप किया जाना चाहिए ।

SSMS ऑब्जेक्ट एक्सप्लोरर में, उस सर्वर के अंतर्गत जिसे आप संशोधित करना चाहते हैं, सुरक्षा > लॉगिन का विस्तार करें , फिर उपयुक्त उपयोगकर्ता पर डबल-क्लिक करें जो "लॉगिन गुण" संवाद लाएगा।

उपयोगकर्ता मैपिंग का चयन करें , जो सर्वर पर सभी डेटाबेस दिखाएगा, जिसमें मौजूदा मैपिंग का चयन किया जाएगा। यहां से आप अतिरिक्त डेटाबेस का चयन कर सकते हैं (और सुनिश्चित करें कि प्रत्येक डेटाबेस में जो भूमिकाएं उपयोगकर्ता को चाहिए) का चयन करें, फिर मैपिंग जोड़ने के लिए ठीक क्लिक करें ।

यहां छवि विवरण दर्ज करें

पुनर्स्थापना या समान ऑपरेशन के बाद ये मैपिंग डिस्कनेक्ट हो सकती हैं। इस मामले में, उपयोगकर्ता अभी भी डेटाबेस में मौजूद हो सकता है लेकिन वास्तव में लॉगिन करने के लिए मैप नहीं किया जाता है। यदि ऐसा होता है, तो आप लॉगिन को पुनर्स्थापित करने के लिए निम्नलिखित चला सकते हैं:

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

आप DB उपयोगकर्ता को हटा भी सकते हैं और उसे लॉगिन गुण संवाद से पुनः बना सकते हैं, लेकिन किसी भी भूमिका सदस्यता या अन्य सेटिंग्स को पुनः बनाने की आवश्यकता होगी।


4

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

    USE [new_db]
GO

/****** Object:  Synonym [dbo].[synTable]    Script Date: 10/15/2015 9:45:01 AM ******/
DROP SYNONYM [dbo].[synTable]
GO

/****** Object:  Synonym [dbo].[synTable]    Script Date: 10/15/2015 9:45:01 AM ******/
CREATE SYNONYM [dbo].[synTable] FOR [dbo].[tTheRealTable]
GO

2

उपयोगकर्ता के लॉगिन करने के लिए ठीक से मैप किए जाने पर भी हमारी वही त्रुटि थी।

उपयोगकर्ता को हटाने की कोशिश करने के बाद यह पता चला कि कुछ SPs में "उस उपयोगकर्ता के रूप में" निष्पादित किया गया था।

समस्या को उन एसपी को हटाकर, उपयोगकर्ता को छोड़ने, लॉगिन से जुड़े उपयोगकर्ता को फिर से बनाना और एसपी को फिर से बनाकर हल किया गया था।

संभवतः यह इस राज्य में बैकअप से पुनर्स्थापित करने से प्राप्त हुआ (एक समय के दौरान जब संबंधित लॉगिन मौजूद नहीं था) या बल्क स्कीमा सिंकिंग (यदि संभव हो तो एक एसपी को निष्पादित करने के साथ ही बना सके, हालांकि उपयोगकर्ता मौजूद नहीं हो सकता है। इस उत्तर से संबंधित है ।


1
क्या आप विस्तार से बता सकते हैं कि आपको एसपी से क्या मतलब है?
स्कूबा स्टीव

1
संग्रहीत प्रक्रिया। SP बनाते समय (proc xxx बनायें ...), एक वैकल्पिक क्लॉज़ है "निष्पादन के साथ <user>" जो यह निर्दिष्ट करता है कि SP चलाएगा जैसे कि उपयोगकर्ता ने वर्तमान में लॉग इन उपयोगकर्ता के बजाय इसे चलाया था।
क्रुकसेक

1

मुझे vb.net में सर्वर प्रबंधन ऑब्जेक्ट (SMO) का उपयोग करते समय एक ही त्रुटि का सामना करना पड़ा (मुझे यकीन है कि यह C # में समान है)

शुरुआती पोस्ट पर टेकी जो की टिप्पणी एक उपयोगी चेतावनी थी कि साझा होस्टिंग में बहुत सारी अतिरिक्त चीजें चल रही हैं। यह पता लगाने में थोड़ा समय लगा, लेकिन नीचे दिए गए कोड से पता चलता है कि किसी को SQL डेटाबेस तक पहुंचने के तरीके में बहुत विशिष्ट होना चाहिए। जब भी एसएमओ कॉल साझा होस्टिंग वातावरण में विशिष्ट नहीं थे तब 'सर्वर प्रिंसिपल ...' त्रुटि दिखाई देने लगी थी।

कोड का यह पहला खंड एक स्थानीय SQL एक्सप्रेस सर्वर के खिलाफ था और सरल विंडोज प्रमाणीकरण पर निर्भर था। इन नमूनों में उपयोग किए गए सभी कोड इस परियोजना परियोजना के लेख में रॉबर्ट कनास द्वारा एसएमओ ट्यूटोरियल पर आधारित हैं :

  Dim conn2 = New ServerConnection()
  conn2.ServerInstance = "<local pc name>\SQLEXPRESS"
  Try
    Dim testConnection As New Server(conn2)
    Debug.WriteLine("Server: " + testConnection.Name)
    Debug.WriteLine("Edition: " + testConnection.Information.Edition)
    Debug.WriteLine(" ")

    For Each db2 As Database In testConnection.Databases
      Debug.Write(db2.Name & " - ")
      For Each fg As FileGroup In db2.FileGroups
        Debug.Write(fg.Name & " - ")
        For Each df As DataFile In fg.Files
          Debug.WriteLine(df.Name + " - " + df.FileName)
        Next
      Next
    Next
    conn2.Disconnect()

  Catch err As Exception
    Debug.WriteLine(err.Message)
  End Try

उपरोक्त कोड स्थानीय SQLEXPRESS सर्वर पर हर डेटाबेस के लिए .mdf फाइलें ठीक पाता है क्योंकि प्रमाणीकरण विंडोज द्वारा संभाला जाता है और यह सभी डेटाबेस में व्यापक है।

निम्न कोड में .mdf फ़ाइलों के लिए 2 खंड हैं। इस मामले में फ़ाइलग्रुप कार्यों की तलाश में केवल पहला पुनरावृत्ति है, और यह केवल एक फ़ाइल ढूंढता है क्योंकि कनेक्शन साझा होस्टिंग वातावरण में केवल एक डेटाबेस के लिए है।

दूसरा पुनरावृत्ति, जो ऊपर काम किए गए पुनरावृत्ति की एक प्रति है, तुरंत चोक हो जाता है क्योंकि जिस तरह से लिखा गया है वह साझा वातावरण में 1 डेटाबेस तक पहुंचने की कोशिश करता है, जो कि उपयोगकर्ता आईडी / पासवर्ड लागू नहीं होता है, इसलिए SQL सर्वर 'सर्वर प्रिंसिपल ...' त्रुटि के रूप में प्राधिकरण त्रुटि देता है।

Dim sqlConnection1 As New System.Data.SqlClient.SqlConnection
sqlConnection1.ConnectionString = "connection string with User ID/Password to a specific database in a shared hosting system. This string will likely also include the Data Source and Initial Catalog parameters"
Dim conn1 As New ServerConnection(sqlConnection1)
Try
  Dim testConnection As New Server(conn1)
  Debug.WriteLine("Server: " + testConnection.Name)
  Debug.WriteLine("Edition: " + testConnection.Information.Edition)
  Debug.WriteLine(" ")

  Dim db2 = testConnection.Databases("the name of the database to which the User ID/Password in the connection string applies")
  For Each fg As FileGroup In db2.FileGroups
    Debug.Write(fg.Name & " - ")
    For Each df As DataFile In fg.Files
      Debug.WriteLine(df.Name + " - " + df.FileName)
    Next
  Next

  For Each db3 As Database In testConnection.Databases
    Debug.Write(db3.Name & " - ")
    For Each fg As FileGroup In db3.FileGroups
      Debug.Write(fg.Name & " - ")
      For Each df As DataFile In fg.Files
        Debug.WriteLine(df.Name + " - " + df.FileName)
      Next
    Next
  Next

  conn1.Disconnect()

Catch err As Exception
  Debug.WriteLine(err.Message)
End Try

उस दूसरे पुनरावृत्ति लूप में, कोड ठीक संकलित करता है, लेकिन क्योंकि एसएमओ सटीक सिंटैक्स के साथ सही डेटाबेस तक पहुंचने के लिए सेटअप नहीं था, वह प्रयास विफल हो जाता है।

जैसा कि मैं सिर्फ एसएमओ सीख रहा हूं, मुझे लगा कि अन्य नवाबी लोग इस त्रुटि के लिए और अधिक सरल स्पष्टीकरण जानने की सराहना कर सकते हैं - हमने इसे गलत कोडित किया।


0

मेरा मानना ​​है कि जब आपने डेटाबेस उपयोगकर्ता बनाया था तो आपको "ग्रांट कनेक्ट टू" स्टेटमेंट याद आ रहा होगा।

नीचे पूर्ण स्निपेट है जिसे आपको SQL सर्वर DBMS के साथ-साथ डेटाबेस के विरुद्ध एक उपयोगकर्ता दोनों को बनाने की आवश्यकता होगी

USE [master]
GO

CREATE LOGIN [SqlServerLogin] WITH PASSWORD=N'Passwordxyz', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=ON
GO

USE [myDatabase]
GO

CREATE USER [DatabaseUser] FOR LOGIN [SqlServerLogin] WITH DEFAULT_SCHEMA=[mySchema]
GO

GRANT CONNECT TO [DatabaseUser]
GO

-- the role membership below will allow you to run a test "select" query against the tables in your database
ALTER ROLE [db_datareader] ADD MEMBER [DatabaseUser]
GO
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.