मास्टर स्वामी में दर्ज डेटाबेस स्वामी SID डेटाबेस स्वामी SID से भिन्न होता है


86

जब मैं किसी मौजूदा डेटाबेस पर tSQLt को स्थापित करने की कोशिश करता हूं तो मुझे निम्नलिखित त्रुटि मिलती है:

डेटाबेस स्वामी में दर्ज डेटाबेस स्वामी SID डेटाबेस '' में दर्ज डेटाबेस स्वामी SID से भिन्न होता है। आपको ALTER AUTHORIZATION कथन का उपयोग करके डेटाबेस के स्वामी को रीसेट करके इस स्थिति को ठीक करना चाहिए।

जवाबों:


141

यह समस्या तब उत्पन्न हो सकती है जब डेटाबेस बैकअप से बहाल हो और डेटाबेस मालिक का SID मास्टर डेटाबेस में सूचीबद्ध SID से मेल नहीं खाता हो। यहां एक समाधान है जो त्रुटि संदेश में अनुशंसित "ALTER AUTHORIZATION" कथन का उपयोग करता है:

DECLARE @Command VARCHAR(MAX) = 'ALTER AUTHORIZATION ON DATABASE::[<<DatabaseName>>] TO 
[<<LoginName>>]' 

SELECT @Command = REPLACE(REPLACE(@Command 
            , '<<DatabaseName>>', SD.Name)
            , '<<LoginName>>', SL.Name)
FROM master..sysdatabases SD 
JOIN master..syslogins SL ON  SD.SID = SL.SID
WHERE  SD.Name = DB_NAME()

PRINT @Command
EXEC(@Command)

धन्यवाद! यह अधिक उचित लगता है। क्या आपको लगता है कि स्ट्रिंग में '[' डालने के बजाय quotename () का उपयोग करना उचित नहीं है? इसके अलावा शायद var DBName और var LoginName में चयन करने के बाद REPLACE () का उपयोग करने के बजाय उन लोगों को var कमांड में एक साथ रखा जाए?
JDPeckham

3
यदि आपके पास आपके DB नाम में रिक्त स्थान या विशेष अक्षर हैं - तो यह स्क्रिप्ट आपको त्रुटि देगा। तो बस इस तरह से [] कोष्ठक डालें: 'DATABASE पर ALTER AUTHORIZATION :: [<< डेटाबेसनाम >>] से [<< LoginName >>]'
buhtla

9
जब मैं इसे चलाता हूं तो मुझे त्रुटि मिलती है "प्रस्तावित नया डेटाबेस मालिक पहले से ही उपयोगकर्ता है या डेटाबेस में अलियास है"
MobileMon

इस स्क्रिप्ट के लिए, आंतरिक syslogins करने में शामिल होने के मेरे लिए काम नहीं करता है, क्योंकि हो सिड बेमेल है समस्या।
क्रोकेक

31

इसे tSQLt.class.sql स्क्रिप्ट के शीर्ष पर जोड़ा गया

declare @user varchar(50)
SELECT  @user = quotename(SL.Name)
  FROM  master..sysdatabases SD inner join master..syslogins SL
    on  SD.SID = SL.SID
 Where  SD.Name = DB_NAME()
exec('exec sp_changedbowner ' + @user)

यह एक आकर्षण की तरह काम करता है tSQLt Version: 1.0.5873.27393और एक सरल समाधान प्रतीत होता है। MS SQL Server 2019 डेवलपर और SSMS 18 का उपयोग करना।
चांदी

19

नीचे दी गई स्क्रिप्ट डेटाबेस पर लागू करें जो आपको त्रुटि मिलती है:

EXEC sp_changedbowner 'sa'

ALTER DATABASE [database_name] SET TRUSTWORTHY ON 

दूसरा बयान निम्नलिखित सुरक्षा भेद्यता के मामले में है: VA1102 - भरोसेमंद बिट MSDB को छोड़कर सभी डेटाबेस पर अक्षम होना चाहिए
Shadi Namrouti

5

नेक्रोमैनिंग:
यदि आप SQL-Server 2000 विचारों (पदावनत) का उपयोग नहीं करना चाहते हैं, तो इसका उपयोग करें:

-- Restore sid when db restored from backup... 
DECLARE @Command NVARCHAR(MAX) 
SET @Command = N'ALTER AUTHORIZATION ON DATABASE::<<DatabaseName>> TO <<LoginName>>' 
SELECT @Command = REPLACE 
                  ( 
                      REPLACE(@Command, N'<<DatabaseName>>', QUOTENAME(SD.Name)) 
                      , N'<<LoginName>>' 
                      ,
                      QUOTENAME
                      (
                          COALESCE
                          (
                               SL.name 
                              ,(SELECT TOP 1 name FROM sys.server_principals WHERE type_desc = 'SQL_LOGIN' AND is_disabled = 'false' ORDER BY principal_id ASC )
                          )
                      )
                  ) 
FROM sys.databases AS SD
LEFT JOIN sys.server_principals  AS SL 
    ON SL.SID = SD.owner_sid 


WHERE SD.Name = DB_NAME() 

PRINT @command 
EXECUTE(@command) 
GO

बग को नामांकित डेटाबेस या उपयोगकर्ता पर बग से बचाता है, और बग को भी ठीक करता है यदि कोई उपयोगकर्ता संबद्ध नहीं है (sa लॉगिन का उपयोग करता है)।


3

DB मालिक को बदलने का सबसे सरल तरीका है:

EXEC SP_ChangeDBOwner 'sa'

हां हमने वह स्थापित कर दिया है।
JDPeckham

0

मैं इस मुद्दे में भी भाग गया, और पाया कि लक्ष्य डेटाबेस का स्वामी मास्टर डेटाबेस में मौजूद नहीं था। उस उपयोगकर्ता को मास्टर डेटाबेस पर मैप करने से मेरे लिए समस्या हल हो गई।


मास्टर को मैप करने से मालिक नहीं बदलता है। आपको मैपिंग के बाद निम्नलिखित रन करना चाहिए: EXEC sp_changedbowner 'TheOwnerName'
Shadi Namrouti
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.