2012-09-12 40 views
55
SID

in der Master-Datenbank Wenn ich versuche, tSQLt auf eine bestehende Datenbank zu installieren ich die folgende Fehlermeldung erhalten:Der Datenbankbesitzer SID unterscheidet sich von der Datenbankeigentümer

The database owner SID recorded in the master database differs from the database owner SID recorded in database ''. You should correct this situation by resetting the owner of database '' using the ALTER AUTHORIZATION statement.

Antwort

98

Dieses Problem kann auftreten, wenn eine Datenbank aus einer Sicherung und die SID der Datenbank-Besitzer die Besitzer SID in der Master-Datenbank aufgelistet entspricht nicht wiederhergestellt. Hier ist eine Lösung, die die „ALTER AUTHORIZATION“ Anweisung empfohlen in der Fehlermeldung 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) 
+0

Vielen Dank! Das scheint passender zu sein. Denkst du, es lohnt sich nicht, quiteename() zu verwenden, anstatt das "[" in die Zeichenfolge zu schreiben? Vielleicht auch in var DBName und var LoginName auswählen und diese dann in var Command zusammenfassen anstatt REPLACE() zu benutzen? – JDPeckham

+3

Wenn Sie Leerzeichen oder Sonderzeichen wie '-' in Ihrem DB-Namen haben, gibt Ihnen dieses Skript einen Fehler. Also setzen Sie einfach [] Klammern wie folgt: 'ALTER AUTORISIERUNG AUF DATENBANK :: [<< DatabaseName >>] TO [<>]' – buhtla

+6

Wenn ich dies ausführen bekomme ich den Fehler "Der vorgeschlagene neue Datenbankbesitzer ist bereits ein Benutzer oder Alias in der Datenbank " – MobileMon

25

hat dieses Bild an der Spitze des tSQLt. class.sql Skript

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

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

-- 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 auf seltsam benannten Datenbank oder Benutzer, und auch behebt einen Fehler, wenn kein Benutzer zugeordnet ist (sa Login verwendet).

7

Wenden Sie das unten Skript auf Datenbank erhalten Sie den Fehler:

EXEC sp_changedbowner 'sa' 

ALTER DATABASE [database_name] SET TRUSTWORTHY ON 
+0

Bitte überprüfen Sie diese [URL] (http://stackoverflow.com/help) es wird nützlich sein, um Ihre Content-Qualität zu erhöhen –

+1

Das hat für mich funktioniert. –

-2

Wenn Sie ein neues clr importieren möchten, wenn Sie diese Fehlermeldung als Eigentümer nur gesetzt Sa bekam wie unten für Ihre databse sollte so sein Arbeit

Ändern Sie die Autorisierung für die Datenbank :: [] bis [sa]

Verwandte Themen