2012-09-12 14 views

risposta

98

Questo problema può sorgere quando un database ripristinato da un backup e il SID del proprietario del database non corrispondono ai proprietari SID elencati nel database master. Ecco una soluzione che utilizza la "autorizzazione ALTER" dichiarazione raccomandato 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) 
+0

Grazie! Sembra più appropriato. Pensi che non valga la pena usare quotename() invece di mettere il '[' nella stringa? Potrebbe anche essere la selezione in var DBName e var LoginName e poi metterli insieme in var Command invece di usare REPLACE()? – JDPeckham

+3

Se nel tuo nome DB ci sono spazi o caratteri speciali come '-' questo script ti darà un errore. Quindi metti semplicemente parentesi [] come questa: 'ALTER AUTORIZZAZIONE SU DATABASE :: [<< DatabaseName >>] TO [<>]' – buhtla

+6

Quando eseguo questo ottengo l'errore "Il nuovo proprietario del database proposto è già un utente o un alias nel database " – MobileMon

25

aggiunto questo alla parte superiore della tSQLt. sceneggiatura 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) 
4

Necromaning:
Se non si desidera utilizzare 2000 vista di SQL-Server (deprecato), utilizzare questo:

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

impedisce anche bug su strano nome del database o utente e correzioni di bug anche se nessun utente è associato (utilizza accesso sa).

7

applicare lo script di seguito sulla base di dati si ottiene l'errore:

EXEC sp_changedbowner 'sa' 

ALTER DATABASE [database_name] SET TRUSTWORTHY ON 
+0

Si prega di controllare questo [URL] (http://stackoverflow.com/help) sarà utile per aumentare la qualità dei contenuti fino –

+1

Questo ha funzionato per me. –

-2

Quando vuole importare un nuovo CLR se si ha questo messaggio di errore è sufficiente impostare Sa come proprietario per il databse come qui di seguito così dovrebbe essere il lavoro

Alter Autorizzazione sul database :: [] a [sa]

Problemi correlati