2012-09-12 50 views

Respuesta

98

Este problema puede surgir cuando una base de datos restaurada a partir de una copia de seguridad y el SID del propietario de la base no coinciden con los propietarios SID registrados en la base principal. Aquí es una solución que utiliza la "Autorización ALTER" declaración recomendada en el mensaje de error:

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

¡Gracias! Eso parece más apropiado. ¿Crees que no vale la pena usar quotename() en lugar de poner '' 'en la cadena? También, tal vez, seleccionar en var DBName y var LoginName luego ponerlos juntos en var Command en lugar de usar REPLACE()? – JDPeckham

+3

Si tiene espacios o caracteres especiales como '-' en su nombre de base de datos, este script dará error. Así que simplemente ponga [] corchetes como este: 'ALTERAR LA AUTORIZACIÓN EN LA BASE DE DATOS :: [<< DatabaseName >>] TO [<>]' – buhtla

+6

Cuando ejecuto esto obtengo el error "El nuevo propietario propuesto de la base de datos ya es un usuario o alias en la base de datos " – MobileMon

25

añadido esto a la parte superior de la tSQLt. guión 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:
Si no desea utilizar el SQL-Server 2000 vistas (en desuso), utilice la siguiente:

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

también evita error en la base de datos de usuario o extraño nombre, y también correcciones de errores si el usuario no está asociado (utiliza inicio de sesión sa).

7

Aplicación del script a continuación en la base de datos se obtiene el error:

EXEC sp_changedbowner 'sa' 

ALTER DATABASE [database_name] SET TRUSTWORTHY ON 
+0

Compruebe esta [URL] (http://stackoverflow.com/help) Será útil aumentar la calidad de su contenido hasta –

+1

Esto funcionó para mí. –

-2

Cuando desee importar un nuevo CLR si has obtenido este mensaje de error acaba de establecer Sa como propietario para su DATABSE, como a continuación lo que debe ser un trabajo

Alter Autorización en la base de datos :: [] a [sa]

Cuestiones relacionadas