Die in der Master-Datenbank aufgezeichnete Datenbankbesitzer-SID unterscheidet sich von der Datenbankbesitzer-SID

83

Wenn ich versuche, tSQLt auf einer vorhandenen Datenbank zu installieren, wird der folgende Fehler angezeigt:

Die in der Master-Datenbank aufgezeichnete Datenbankbesitzer-SID unterscheidet sich von der in der Datenbank '' aufgezeichneten Datenbankbesitzer-SID. Sie sollten diese Situation korrigieren, indem Sie den Eigentümer der Datenbank '' mit der Anweisung ALTER AUTHORIZATION zurücksetzen.

JDPeckham
quelle

Antworten:

139

Dieses Problem kann auftreten, wenn eine aus einer Sicherung wiederhergestellte Datenbank und die SID des Datenbankeigentümers nicht mit der in der Masterdatenbank aufgeführten Eigentümer-SID übereinstimmen. Hier ist eine Lösung, die die in der Fehlermeldung empfohlene Anweisung "ALTER AUTHORIZATION" verwendet:

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)
JohnnyM
quelle
Vielen Dank! Das scheint angemessener. Denken Sie, dass es sich nicht lohnt, quotename () zu verwenden, anstatt das '[' in den String einzufügen? Wählen Sie möglicherweise auch var DBName und var LoginName aus und fügen Sie diese dann in var Command zusammen, anstatt REPLACE () zu verwenden.
JDPeckham
3
Wenn Ihr DB-Name Leerzeichen oder Sonderzeichen wie '-' enthält, gibt dieses Skript einen Fehler aus. Setzen Sie also einfach [] Klammern wie diese: 'ALTER AUTHORIZATION ON DATABASE :: [<< Datenbankname >>] TO [<< Login Name >>]'
buhtla
9
Wenn ich dies ausführe, erhalte ich die Fehlermeldung "Der vorgeschlagene neue Datenbankeigentümer ist bereits ein Benutzer oder ein Alias ​​in der Datenbank"
MobileMon
Aus diesem Skript, an den inneren zu syslogins nicht für mich funktioniert wahrscheinlich , weil der SID Mismatch ist das Problem.
Crokusek
30

Dies wurde oben im Skript tSQLt.class.sql hinzugefügt

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)
JDPeckham
quelle
19

Wenden Sie das folgende Skript auf die Datenbank an. Sie erhalten den Fehler:

EXEC sp_changedbowner 'sa'

ALTER DATABASE [database_name] SET TRUSTWORTHY ON 
NarendraMishra
quelle
Die zweite Anweisung betrifft die folgende Sicherheitslücke: VA1102 - Das vertrauenswürdige Bit sollte in allen Datenbanken außer MSDB
Shadi Namrouti
5

Necromaning:
Wenn Sie die SQL-Server 2000-Ansichten (veraltet) nicht verwenden möchten, verwenden Sie Folgendes:

-- 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

Verhindert auch Fehler in ungewöhnlich benannten Datenbanken oder Benutzern und behebt Fehler, wenn kein Benutzer zugeordnet ist (verwendet ein Login).

Stefan Steiger
quelle
2

Der einfachste Weg, den Besitzer zu wechseln, ist:

EXEC sp_changedbowner 'sa'
Shadi Namrouti
quelle
Ja, das haben wir festgestellt.
JDPeckham
0

Ich bin auch auf dieses Problem gestoßen und habe festgestellt, dass der Eigentümer der Zieldatenbank nicht in der Masterdatenbank vorhanden ist. Das Zuordnen dieses Benutzers zur Master-Datenbank hat das Problem für mich behoben.

Rolan
quelle
Die Zuordnung zum Master ändert den Eigentümer nicht. Nach dem Mapping sollten Sie Folgendes ausführen: EXEC sp_changedbowner 'TheOwnerName'
Shadi Namrouti