Владелец базы данных Сида, записанный в базе данных Master отличается от владельца базы данных Сида
при попытке установить tSQLt на существующую базу данных я получаю следующее сообщение об ошибке:
SID владельца базы данных, записанный в базе данных master, отличается от
владелец базы данных SID, зарегистрированный в базе данных ". Вы должны исправить
эта ситуация путем сброса владельца базы данных " с помощью ALTER
Заявление об авторизации.
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)
добавил Это в верхнюю часть tSQLt.класс.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
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).
когда вы хотите импортировать новую среду clr, если вы получили это сообщение об ошибке, просто установите Sa в качестве владельца для своей базы данных, как показано ниже, так что должно быть work
изменить авторизацию в базе данных:: [] to [sa]
Comments