Kiedy próbuję zainstalować tSQLt w istniejącej bazie danych, pojawia się następujący błąd:
Identyfikator SID właściciela bazy danych zapisany w bazie danych master różni się od identyfikatora SID właściciela bazy danych zapisanego w bazie danych ''. Należy naprawić tę sytuację, resetując właściciela bazy danych „” za pomocą instrukcji ALTER AUTHORIZATION.
sql-server
clrstoredprocedure
tsqlt
JDPeckham
źródło
źródło
Dodano to na początku skryptu 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)
źródło
tSQLt Version: 1.0.5873.27393
prostszym rozwiązaniem i wydaje się, że jest prostszym rozwiązaniem. Korzystanie z MS SQL Server 2019 Developer i SSMS 18Zastosuj poniższy skrypt do bazy danych, a otrzymasz błąd:
EXEC sp_changedbowner 'sa' ALTER DATABASE [database_name] SET TRUSTWORTHY ON
źródło
Nekromancja:
Jeśli nie chcesz używać widoków SQL-Server 2000 (przestarzałe), użyj tego:
-- 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
Zapobiega również błędom w dziwnie nazwanej bazie danych lub użytkowniku, a także naprawia błąd, jeśli żaden użytkownik nie jest powiązany (używa loginu sa).
źródło
Najprostszym sposobem zmiany właściciela bazy danych jest:
źródło
Natknąłem się również na ten problem i stwierdziłem, że właściciel docelowej bazy danych nie istnieje w głównej bazie danych. Odwzorowanie tego użytkownika na główną bazę danych rozwiązało problem.
źródło