Владелец базы данных Сида, записанный в базе данных Master отличается от владельца базы данных Сида



при попытке установить tSQLt на существующую базу данных я получаю следующее сообщение об ошибке:




SID владельца базы данных, записанный в базе данных master, отличается от
владелец базы данных SID, зарегистрированный в базе данных ". Вы должны исправить
эта ситуация путем сброса владельца базы данных " с помощью ALTER
Заявление об авторизации.


552   5  

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

    Ничего не найдено.