SID владельца базы данных, записанный в основной базе данных, отличается от SID владельца базы данных
Когда я пытаюсь установить tSQLt на существующую базу данных, я получаю следующую ошибку:
SID владельца базы данных, записанный в основной базе данных, отличается от SID владельца базы данных, записанный в базе данных ''. Вы должны исправить эту ситуацию, сбросив владельца базы данных "используя ALTER" АВТОРИЗАЦИЯ.
Ответы
Ответ 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]