SID владельца базы данных, записанный в базе данных master, отличается от SID владельца базы данных
Когда я пытаюсь установить tSQLt на существующую базу данных, я получаю следующую ошибку:
SID владельца базы данных, записанный в базе данных master, отличается от SID владельца базы данных, записанной в базе данных ''. Вы должны исправить эту ситуацию, сбросив владельца базы данных '' с помощью оператора ALTER AUTHORIZATION.
5 ответов
Эта проблема может возникать, когда база данных восстанавливается из резервной копии и 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)
Добавил это в начало скрипта 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)
Применив приведенный ниже скрипт к базе данных, вы получите ошибку:
EXEC sp_changedbowner 'sa'
ALTER DATABASE [database_name] SET TRUSTWORTHY ON
Самый простой способ сменить владельца - это:
EXEC sp_changedbowner 'sa'
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
Также предотвращает ошибку в базе данных со странным именем или пользователем, а также исправляет ошибку, если пользователь не связан (использует логин s a).
Я также столкнулся с этой проблемой и обнаружил, что владелец целевой базы данных не существует в основной базе данных. Сопоставление этого пользователя с основной базой данных решило проблему для меня.
Если вы хотите импортировать новый clr, если вы получили это сообщение об ошибке, просто установите Sa в качестве владельца для вашей базы данных, как показано ниже, так что должно работать
Изменить авторизацию на базе данных::[] на [sa]