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

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

SID владельца базы данных, записанный в базе данных master, отличается от SID владельца базы данных, записанного в базе данных ''. Вы должны исправить эту ситуацию, сбросив владельца базы данных '' с помощью инструкции ALTER AUTHORIZATION.


person JDPeckham    schedule 12.09.2012    source источник


Ответы (5)


Эта проблема может возникнуть, если база данных восстановлена ​​из резервной копии, а SID владельца базы данных не соответствует SID владельца, указанному в базе данных master. Вот решение, в котором используется инструкция «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)
person JohnnyM    schedule 01.11.2012
comment
Спасибо! Это кажется более подходящим. Как вы думаете, не стоит использовать quotename() вместо того, чтобы помещать в строку '['? Также, возможно, выбрав var DBName и var LoginName, а затем объединив их в var Command вместо использования REPLACE()? - person JDPeckham; 14.11.2012
comment
Если у вас есть пробелы или специальные символы, такие как «-», в имени вашей БД, этот скрипт выдаст вам ошибку. Поэтому просто поставьте [] квадратные скобки следующим образом: «ИЗМЕНИТЬ АВТОРИЗАЦИЯ НА БАЗЕ ДАННЫХ::[‹‹DatabaseName››] TO [‹‹LoginName››]» - person buhtla; 25.01.2013
comment
Когда я запускаю это, я получаю сообщение об ошибке. Предлагаемый новый владелец базы данных уже является пользователем или псевдонимом в базе данных. - person MobileMon; 27.11.2013
comment
Для этого скрипта внутреннее соединение с системными логинами у меня не работает, вероятно, из-за несоответствия SID является проблемой. - person crokusek; 12.02.2015

Добавил это в начало скрипта 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)
person JDPeckham    schedule 12.09.2012
comment
Это сработало как шарм с tSQLt Version: 1.0.5873.27393 и кажется более простым решением. Использование MS SQL Server 2019 Developer и SSMS 18. - person silver; 04.10.2020

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

EXEC sp_changedbowner 'sa'

ALTER DATABASE [database_name] SET TRUSTWORTHY ON 
person NarendraMishra    schedule 31.05.2016
comment
Второй оператор вызывает следующую уязвимость системы безопасности: VA1102 — бит Trustworthy должен быть отключен во всех базах данных, кроме MSDB. - person Shadi Namrouti; 10.12.2019

Necromaning:
Если вы не хотите использовать представления 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).

person Stefan Steiger    schedule 22.01.2015

Самый простой способ изменить владельца БД:

EXEC SP_ChangeDBOwner 'sa'
person Shadi Namrouti    schedule 10.12.2019
comment
Да, мы это установили. - person JDPeckham; 11.12.2019