Il SID del proprietario del database registrato nel database master è diverso dal SID del proprietario del database


87

Quando provo a installare tSQLt su un database esistente ottengo il seguente errore:

Il SID del proprietario del database registrato nel database master è diverso dal SID del proprietario del database registrato nel database ''. È necessario correggere questa situazione reimpostando il proprietario del database "" utilizzando l'istruzione ALTER AUTHORIZATION.

Risposte:


143

Questo problema può verificarsi quando un database ripristinato da un backup e il SID del proprietario del database non corrisponde ai proprietari SID elencati nel database master. Ecco una soluzione che utilizza l'istruzione "ALTER AUTHORIZATION" consigliata nel messaggio di errore:

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)

Grazie! Sembra più appropriato. Pensi che non valga la pena usare quotename () invece di inserire "[" nella stringa? Magari anche selezionando in var DBName e var LoginName quindi inserendoli insieme in var Command invece di usare REPLACE ()?
JDPeckham

3
Se hai spazi o caratteri speciali come "-" nel nome del database, questo script ti darà un errore. Quindi inserisci le parentesi [] in questo modo: 'ALTER AUTHORIZATION ON DATABASE :: [<<DatabaseName>>] TO [<<LoginName>>]'
buhtla

10
Quando lo
eseguo

Per questo script, il join interno a syslogins non funziona per me, probabilmente perché la mancata corrispondenza SID è il problema.
crokusek

31

Aggiunto questo all'inizio dello script 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)

Questo ha funzionato come un fascino con tSQLt Version: 1.0.5873.27393e sembra essere una soluzione più semplice. Utilizzo di MS SQL Server 2019 Developer e SSMS 18.
argento

19

Applicare lo script seguente sul database si ottiene l'errore:

EXEC sp_changedbowner 'sa'

ALTER DATABASE [database_name] SET TRUSTWORTHY ON 

1
La seconda istruzione rileva la seguente vulnerabilità di sicurezza: VA1102 - Il bit Trustworthy dovrebbe essere disabilitato su tutti i database eccetto MSDB
Shadi Namrouti

5

Necromaning:
se non si desidera utilizzare le viste SQL-Server 2000 (deprecate), utilizzare questa:

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

Previene anche bug su database o utenti con nomi strani e corregge anche bug se nessun utente è associato (usa login sa).


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.