Подтвердить что ты не робот

SID владельца базы данных, записанный в основной базе данных, отличается от SID владельца базы данных

Когда я пытаюсь установить tSQLt на существующую базу данных, я получаю следующую ошибку:

SID владельца базы данных, записанный в основной базе данных, отличается от SID владельца базы данных, записанный в базе данных ''. Вы должны исправить эту ситуацию, сбросив владельца базы данных "используя ALTER" АВТОРИЗАЦИЯ.

4b9b3361

Ответ 1

Эта проблема может возникнуть, когда база данных, восстановленная из резервной копии и SID владельца базы данных, не соответствует идентификатору SID владельцев, указанному в основной базе данных. Вот решение, в котором используется утверждение "ALTER AUTHORIZATION", рекомендуемое в сообщении об ошибке:

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)

Ответ 2

Добавлено это в начало tSQLt.class.sql script

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)

Ответ 3

Примените приведенную ниже script к базе данных, вы получите сообщение об ошибке:

EXEC sp_changedbowner 'sa'

ALTER DATABASE [database_name] SET TRUSTWORTHY ON 

Ответ 4

Некроманинг:
Если вы не хотите использовать представления SQL-Server 2000 (устаревшие), используйте это:

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

Также предотвращает ошибку для странно названной базы данных или пользователя, а также исправляет ошибку, если ни один пользователь не связан (использует sa login).

Ответ 5

Когда вы хотите импортировать новый clr, если вы получили это сообщение об ошибке, просто установите Sa как владельца для вашей базы данных, как показано ниже, так что работа должна быть

Изменить авторизацию в базе данных:: [] на [sa]