SID власника бази даних, записаний у головній базі даних, відрізняється від SID власника бази даних


86

Коли я намагаюся встановити tSQLt на існуючу базу даних, я отримую таку помилку:

SID власника бази даних, записаний у головній базі даних, відрізняється від SID власника бази даних, записаний у базі даних ''. Ви повинні виправити цю ситуацію, скинувши налаштування власника бази даних '' за допомогою оператора ALTER AUTHORIZATION.

Відповіді:


141

Ця проблема може виникнути, коли база даних, відновлена ​​з резервної копії, і 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)

Дякую! Це видається більш доречним. Ви вважаєте, що не варто використовувати quotename () замість того, щоб вставляти '[' у рядок? Також, можливо, вибравши у var DBName та var LoginName, потім зібравши їх у команду var замість використання REPLACE ()?
JDPeckham

3
Якщо у вашому імені БД є пробіли або спеціальні символи, такі як '-', цей сценарій видасть вам помилку. Тож просто поставте [] дужки таким чином: 'ALTER AUTHORIZATION ON DATABASE :: [<<DatabaseName>>] TO [<<LoginName>>]'
buhtla

9
Коли я запускаю це, я отримую помилку "Запропонований новий власник бази даних вже є користувачем або псевдонімом у базі даних"
MobileMon

У цьому сценарії внутрішнє приєднання до системних входів для мене не працює, можливо, тому , що проблема полягає у невідповідності SID .
crokusek

31

Додав це у початок скрипта 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 та SSMS 18.
срібло

19

Застосуйте наведений нижче сценарій до бази даних, і ви отримаєте помилку:

EXEC sp_changedbowner 'sa'

ALTER DATABASE [database_name] SET TRUSTWORTHY ON 

Другий вислів стосується такої уразливості безпеки: VA1102 - Довірений біт слід вимкнути у всіх базах даних, крім MSDB
Шаді Намруті

5

Некроманування:
Якщо ви не хочете використовувати представлення даних 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

Також запобігає помилці з дивно названою базою даних або користувачем, а також виправляє помилку, якщо жоден користувач не асоційований (використовує логін).



0

Я також зіткнувся з цією проблемою і виявив, що власник цільової бази даних не існував у головній базі даних. Призначення цього користувача до головної бази даних вирішило проблему для мене.


Перетворення на головне не змінює власника. Вам слід запустити наступне після відображення: EXEC sp_changedbowner 'TheOwnerName'
Shadi Namrouti
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.