সার্ভার অধ্যক্ষ এসকিউএল সার্ভার এমএস 2012-এ বর্তমান সুরক্ষা প্রসঙ্গে ডেটাবেস অ্যাক্সেস করতে পারবেন না


103

আমি এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওর মাধ্যমে আমার হোস্টিং সার্ভারের ডেটাবেসটি অ্যাক্সেস করার চেষ্টা করছি, লগইন অবধি সমস্ত কিছু ঠিক আছে তবে আমি যখন আদেশটি ব্যবহার করি তখন use myDatabaseএটি আমাকে এই ত্রুটি দেয়:

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

আমি অনুসন্ধান করেছি এবং হোস্টিং পরিষেবা সরবরাহকারীরা সমস্যার জন্য এই ফিক্সটি তালিকাভুক্ত করেছেন ।

তবে এটি সম্ভবত আমার পক্ষে কাজ করছে না কারণ এটি এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও ২০০৮ এর জন্য তবে আমি এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও 2012 ব্যবহার করছি।

এই সমস্যা হতে পারে? এবং হ্যাঁ যদি কেউ এসএমএসএস 2012 সালে এর বিকল্প আমাকে বলতে পারে?


3
'হোস্টিং সেবা সরবরাহকারী'? আমরা কি নিবেদিত বা ভাগ কথা বলছি? যদি এটি একটি ভাগ করা হোস্টিং সার্ভার হয় তবে আমি সহায়তার জন্য আপনার হোস্টিং সরবরাহকারীর সাথে যোগাযোগ করার পরামর্শ দিচ্ছি। একটি শেয়ার্ড হোস্টিং পরিবেশে এসকিউএল কুখ্যাত এবং সমস্যাযুক্ত। পণ্যটির সাথে এর কোনও যোগসূত্র নেই তবে হোস্টিং সরবরাহকারীরা সার্ভারে (নীতিগুলি) প্রয়োগ করে এমন নীতিগুলি। প্রতিটি হোস্টিং সংস্থার এসকিউএল উপার্জনের নিজস্ব উপায় রয়েছে বা তাই এটি মনে হয়।
টেকি জো

উত্তর:


80

আপনার ব্যবহারকারী যে ডিবিতে লগ ইন করতে চাইছেন তা ম্যাপ করা হয়েছে কিনা তা পরীক্ষা করে দেখুন।


76
তুমি এটা কিভাবে করলে?
গ্রাহাম

3
@Graham হয় ব্যবহারকারী চেক করুন অথবা এই উত্তর দেখতে SQL সার্ভার ম্যানেজমেন্ট স্টুডিও ব্যবহার করুন: stackoverflow.com/a/9356725/804773
Grambot

5
আমি ট্রিগারগুলি সন্ধান করার পরামর্শ দেব, এই কারণেই আমি এই বার্তাটি পেয়েছি, অন্য একটি ডাটাবেসে এমন কিছু ট্রিগার রয়েছে যেখানে আমার ব্যবহারকারী অনুমোদিত ছিল না।
ড্যানিয়েলভি

1
আমি এই উত্তরের ওপির ত্রুটি এবং ট্যাঙ্কগুলিতে আঘাত করেছি, আমি বুঝতে পেরেছিলাম যে আমার সংযোগের স্ট্রিংটিতে অ্যাজুরে এসকিউএল ডেটাবেসকে সংযুক্ত করার জন্য আমার কাছে একটি বোকা টাইপ ছিল। যদি আপনার ডেটাবেসটির নামটি সঠিক হয় তবে আপনার মাস্টারের অ্যাক্সেসের দরকার নেই। যদি এটি ভুল হয়, তবে (আমার ক্ষেত্রে) আমি মনে করি সত্তা ফ্রেমওয়ার্ক (6.1.3) কিছু অতিরিক্ত তথ্যের জন্য মাস্টারের সাথে সংযোগ স্থাপন করে অতিরিক্ত স্মার্ট হওয়ার চেষ্টা করছে (যদিও এটি কেবল ইএফের সাথে সম্পর্কযুক্ত নয় - আমি নিশ্চিত নই)। তবে আমার সমাধানটি ছিল আমার কানেকশনস্ট্রিংটি সঠিক কিনা তা নিশ্চিত করা। খারাপ ডেটাবেস নামের জন্য আমি খুব আলাদা ত্রুটিটি আশা করেছি। : - /
জ্যাক্সিডিয়ান

2
@ ড্যানিয়েলভের মন্তব্যে যোগ করতে, কোনও হার্ডকডযুক্ত ডাটাবেস নামের জন্য সঞ্চিত পদ্ধতিও পরীক্ষা করে দেখুন। এটি আমার ক্ষেত্রে স্থির করে (প্রায় 20 টি সঞ্চিত পদ্ধতি পরিবর্তন করতে হয়েছিল)।
Demonslay335

26

আমাদের পিআরডি পরিবেশে এসএসআরএসে একটি প্রতিবেদন স্থাপন করতে আমাদের একই ত্রুটি হয়েছিল। এটি পাওয়া গেছে যে সমস্যাটি একটি "ব্যবহার" বিবৃতি দিয়ে পুনরুত্পাদন করা যেতে পারে। সমাধানটি ছিল ডাটাবেসের সাথে ব্যবহারকারীর জিইউডি অ্যাকাউন্টের রেফারেন্সটিকে পুনরায় সিঙ্ক করা (যেমন, "ডিবি পুনরুদ্ধারের পরে আপনি" স্পাইচেঞ্জ_উজার্স_লগিন "ব্যবহার করছেন)। সমস্ত অ্যাকাউন্ট পুনরায় সিঙ্ক করার জন্য একটি স্টক (কার্সার চালিত) স্ক্রিপ্ট সংযুক্ত করা হয়েছে:

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
আমার জন্য কাজ করেছেন আপনাকে ধন্যবাদ। আমি আমার পরীক্ষার সার্ভারে একটি এসকিউএল সার্ভার প্রমাণীকরণের সাথে একটি ডাটাবেস অনুলিপি করেছিলাম এবং এটি অ্যাক্সেসযোগ্য ছিল। এখন এটি
মাইকএইচ

1
ব্যবহারকারী যদি ডাটাবেসে উপস্থিত থাকে তবে লগইনে ম্যাপিং চালিয়ে যেতে ব্যর্থ হয়, এসএসএমএস অবজেক্ট এক্সপ্লোরারের মাধ্যমে ব্যবহারকারী মুছে ফেললে লগইনটিকে পুনরায় তৈরি করা আমার পক্ষে কাজ করে। অন্যথায় আমার সন্দেহ হয় যে উপরে প্রস্তাবিত সমাধানটি নেওয়া দরকার।
jjt

10

আমি এই সমস্যাটির সাথে লড়াই করার জন্য বেশ কিছুটা সময় কাটিয়েছি এবং তখন আমি বুঝতে পেরেছিলাম যে আমি কোন সাধারণ ডাটাবেসের সাথে আমার সংযোগটি লক্ষ্য করে যাচ্ছিলাম তা ভুলে গিয়েছিলাম in আমি শংসাপত্রগুলি প্রবেশের জন্য স্ট্যান্ডার্ড এসকিউএল সার্ভার সংযোগ উইন্ডোটি ব্যবহার করছিলাম:

এসকিউএল সার্ভার সংযোগ উইন্ডো

আমি সংযোগের জন্য সঠিক ডাটাবেসটি বেছে নিচ্ছি কিনা তা যাচাই করতে আমাকে সংযোগের বৈশিষ্ট্য ট্যাবটি পরীক্ষা করতে হয়েছিল। আমি দুর্ভাগ্যক্রমে এখানে পূর্ববর্তী অধিবেশন থেকে একটি নির্বাচনের জন্য সেট করে ডেটাবেস বিকল্পটি সংযোগ ছেড়ে চলে এসেছি। এই কারণেই আমি ভেবেছিলাম যে আমি যে ডাটাবেসটিতে সংযোগ স্থাপনের চেষ্টা করছি তার সাথে সংযোগ করতে অক্ষম ।

সংযোগের বৈশিষ্ট্য

নোট করুন যে সংযোগের বৈশিষ্ট্য এবং অন্যান্য ট্যাবগুলি প্রদর্শিত হতে আপনাকে 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
এটি আমার জন্য এটি স্থির করে দিয়েছে। ধন্যবাদ! "সমস্যাটি সাথে চিত্রিত করা যেতে পারে" -> তারা যদি অন্য কোনও হ্যাশ ফিরে আসে তবে একটি সমস্যা আছে এবং উপরের ক্যোয়ারী সেগুলি সিঙ্ক করবে।
28 এ বেজেট করুন

6

এসকিউএল লগইনগুলি সার্ভার স্তরে সংজ্ঞায়িত করা হয় এবং নির্দিষ্ট ডেটাবেজে ব্যবহারকারীদের কাছে ম্যাপ করতে হবে ।

এসএসএমএস অবজেক্ট এক্সপ্লোরারে সার্ভারের অধীনে আপনি সুরক্ষা > লগইনগুলি প্রসারিত করতে চান , তারপরে উপযুক্ত ব্যবহারকারীকে ডাবল ক্লিক করুন যা "লগইন সম্পত্তি" ডায়ালগটি উপস্থিত করবে।

ব্যবহারকারীর ম্যাপিং নির্বাচন করুন , যা বিদ্যমান ম্যাপিং নির্বাচন করে সার্ভারে সমস্ত ডাটাবেস প্রদর্শন করবে। এখান থেকে আপনি অতিরিক্ত ডাটাবেসগুলি নির্বাচন করতে পারেন (এবং প্রতিটি ডাটাবেসে কোনও ব্যবহারকারীর ভূমিকা থাকতে হবে তা নির্বাচন করতে ভুলবেন না), তারপরে ম্যাপিংগুলি যুক্ত করতে ওকে ক্লিক করুন।

এখানে চিত্র বর্ণনা লিখুন

এই ম্যাপিংগুলি পুনরুদ্ধার বা অনুরূপ ক্রিয়াকলাপের পরে সংযোগ বিচ্ছিন্ন হয়ে যেতে পারে। এই ক্ষেত্রে, ব্যবহারকারীর ডাটাবেজে এখনও উপস্থিত থাকতে পারে তবে লগইনে আসলে ম্যাপ করা হয়নি। যদি এটি ঘটে থাকে তবে লগইনটি পুনরুদ্ধার করতে আপনি নিম্নলিখিতটি চালাতে পারেন:

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

আপনি ডিবি ব্যবহারকারীকে মুছুন এবং লগইন বৈশিষ্ট্যগুলি ডায়ালগ থেকে এটি পুনরায় তৈরি করতে পারেন, তবে যে কোনও ভূমিকা সদস্যতা বা অন্যান্য সেটিংস পুনরায় তৈরি করা দরকার।


4

আমার ক্ষেত্রে, বার্তাটি একটি প্রতিশব্দ দ্বারা হয়েছিল যা অজান্তেই ডাটাবেসের নামটি "অবজেক্টের নাম" এ অন্তর্ভুক্ত করে। আমি যখন একটি নতুন নামে ডাটাবেস পুনরুদ্ধার করেছি, প্রতিশব্দটি এখনও পুরানো ডিবি নামের দিকে ইঙ্গিত করেছে। পুরানো ডিবিতে যেহেতু ব্যবহারকারীর অনুমতি নেই, বার্তাটি উপস্থিত হয়েছিল। ঠিক করার জন্য, আমি ডাটাবেসের নামের সাথে অবজেক্টের নামটি যোগ্য না করে প্রতিশব্দটি বাদ দিয়ে পুনরায় তৈরি করেছি:

    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

ব্যবহারকারী সঠিকভাবে লগইনে ম্যাপ করলেও আমাদের একই ত্রুটি হয়েছিল।

ব্যবহারকারীর মুছে ফেলার চেষ্টা করার পরে এটি আবিষ্কার করা হয়েছিল যে কয়েকটি এসপি সেই ব্যবহারকারীকে "মৃত্যুদণ্ড কার্যকর হিসাবে" ধারণ করে।

সমস্যাগুলি সেই এসপিগুলি বাদ দিয়ে, ব্যবহারকারীকে ফেলে দেওয়া, লগইনের সাথে যুক্ত ব্যবহারকারীকে পুনরায় তৈরি এবং এসপিগুলিকে পুনরায় তৈরি করার মাধ্যমে সমাধান করা হয়েছিল।

সম্ভবত ব্যাকআপ থেকে পুনরুদ্ধার (এই সময়ে সম্পর্কিত সম্পর্কিত লগইন উপস্থিত ছিল না) বা বাল্ক স্কিমা সিঙ্কিং (সম্ভবত যদি ব্যবহারকারীর অস্তিত্ব না থাকায় এক্সিকিউট দিয়ে একটি এসপি তৈরি করা সম্ভব হয় তবে এটি সম্ভবত এই অবস্থায় থাকতে পারে also এছাড়াও থাকতে পারে এই উত্তর সম্পর্কিত হয়েছে ।


1
এসপিদের দ্বারা আপনি কী বোঝাতে চেয়েছেন তা কী আপনি ব্যাখ্যা করতে পারেন?
স্কুবা স্টিভ

1
সংরক্ষিত নীতিমালা. এসপি তৈরি করার সময় (প্রোক এক্সএক্সএক্সএক্সএক্স তৈরি করুন ...) তৈরি করার সময়, "<ব্যবহারকারীর হিসাবে এক্সিকিউট" সহ একটি alচ্ছিক ধারা রয়েছে যা উল্লেখ করে যে এসপিটি বর্তমানে চালিত ব্যবহারকারীদের পরিবর্তে এটি চালিত করবে।
ক্রোকুসেক

1

Vb.net- এ সার্ভার ম্যানেজমেন্ট অবজেক্টস (এসএমও) ব্যবহার করার সময় আমি একই ত্রুটির মুখোমুখি হয়েছি (আমি নিশ্চিত যে এটি সি # তেও একই)

প্রাথমিক পোস্টে টেকি জোয়ের মন্তব্যটি একটি দরকারী সতর্কতা ছিল যে ভাগ করে নেওয়া হোস্টিংয়ে অতিরিক্ত অনেক কিছু চলছে things এটি নির্ধারণ করতে কিছুটা সময় নিয়েছিল, তবে নীচের কোডটি দেখায় যে এসকিউএল ডাটাবেসগুলিতে অ্যাক্সেস করার ক্ষেত্রে কীভাবে একজনকে খুব নির্দিষ্ট হতে হবে। 'সার্ভার অধ্যক্ষ ...' ত্রুটিটি দেখা গেছে যখনই ভাগ করা হোস্টিং পরিবেশে এসএমও কলগুলি নির্দিষ্টভাবে নির্দিষ্ট ছিল না।

কোডের এই প্রথম বিভাগটি স্থানীয় এসকিউএল এক্সপ্রেস সার্ভারের বিরুদ্ধে ছিল এবং সাধারণ উইন্ডোজ প্রমাণীকরণের উপর নির্ভর করে। এই নমুনাগুলিতে ব্যবহৃত সমস্ত কোড এই কোড প্রকল্পের ওয়েবসাইট নিবন্ধে রবার্ট কানাসের এসএমও টিউটোরিয়াল ভিত্তিক :

  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

উপরের কোডটি স্থানীয় এসকিউএলএক্সপ্রেস সার্ভারে প্রতিটি ডাটাবেসের জন্য .mdf ফাইলগুলি সন্ধান করে কারণ প্রমাণীকরণ উইন্ডোজ দ্বারা পরিচালিত হয় এবং এটি সমস্ত ডাটাবেস জুড়ে বিস্তৃত।

নিম্নলিখিত কোডে .mdf ফাইলগুলির জন্য পুনরাবৃত্তি হওয়া 2 বিভাগ রয়েছে। এই ক্ষেত্রে ফাইলগ্রুপের সন্ধানের জন্য কেবল প্রথম পুনরাবৃত্তিটি কাজ করে এবং এটি কেবলমাত্র একটি একক ফাইল খুঁজে পায় কারণ সংযুক্তিটি ভাগ করে নেওয়া হোস্টিং পরিবেশে কেবল একটি একক ডাটাবেসের সাথে থাকে।

দ্বিতীয় পুনরাবৃত্তি, যা উপরে কাজ করে এমন পুনরাবৃত্তির অনুলিপি তাৎক্ষণিকভাবে চাপ দেয় কারণ এটি যেভাবে লেখা হয়েছে তা ভাগ করা পরিবেশে 1 ম ডাটাবেসটি অ্যাক্সেস করার চেষ্টা করে, যা ব্যবহারকারীর আইডি / পাসওয়ার্ড প্রয়োগ করে না, তাই এসকিউএল সার্ভারটি 'সার্ভার অধ্যক্ষ ...' ত্রুটির আকারে কোনও অনুমোদনের ত্রুটি প্রদান করে।

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

আমি বিশ্বাস করি আপনি যখন ডেটাবেস ব্যবহারকারী তৈরি করেছেন তখন আপনি একটি "গ্রান্ট কানেক্ট টু" বিবৃতিটি মিস করতে পারেন।

নীচে সম্পূর্ণ স্নিপেটের জন্য আপনাকে এসকিউএল সার্ভার ডিবিএমএসের সাথে লগইন পাশাপাশি ডাটাবেসের বিরুদ্ধে একটি ব্যবহারকারী উভয় তৈরি করতে হবে

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.