Когда я пытаюсь установить tSQLt в существующую базу данных, я получаю следующую ошибку:
SID владельца базы данных, записанный в базе данных master, отличается от SID владельца базы данных, записанного в базе данных ''. Вы должны исправить эту ситуацию, сбросив владельца базы данных '' с помощью оператора ALTER AUTHORIZATION.
sql-server
clrstoredprocedure
tsqlt
JDPeckham
источник
источник
Добавлен в начало скрипта 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)
источник
tSQLt Version: 1.0.5873.27393
и кажется более простым решением. Использование MS SQL Server 2019 Developer и SSMS 18.Примените следующий скрипт к базе данных, вы получите ошибку:
EXEC sp_changedbowner 'sa' ALTER DATABASE [database_name] SET TRUSTWORTHY ON
источник
Некроманинг:
если вы не хотите использовать представления 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).
источник
Самый простой способ сменить владельца БД:
источник