programing

마스터 데이터베이스에 기록된 데이터베이스 소유자 SID가 데이터베이스 소유자 SID와 다릅니다.

subpage 2023. 4. 19. 23:02
반응형

마스터 데이터베이스에 기록된 데이터베이스 소유자 SID가 데이터베이스 소유자 SID와 다릅니다.

기존 데이터베이스에 tSQLt를 설치하려고 하면 다음 오류가 나타납니다.

마스터 데이터베이스에 기록된 데이터베이스 소유자 SID가 데이터베이스 '에 기록된 데이터베이스 소유자 SID와 다릅니다.ALTER Authorization 문을 사용하여 데이터베이스 "의 소유자를 리셋하여 이 상황을 수정해야 합니다.

이 문제는 백업에서 복원된 데이터베이스와 데이터베이스 소유자의 SID가 마스터 데이터베이스에 나열된 소유자 SID와 일치하지 않을 때 발생할 수 있습니다.다음은 오류 메시지에서 권장되는 "ALTER AUTHORITION" 문을 사용하는 솔루션입니다.

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.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)

다음 스크립트를 데이터베이스에 적용하면 오류가 발생합니다.

EXEC sp_changedbowner 'sa'

ALTER DATABASE [database_name] SET TRUSTWORTHY ON 

DB 소유자를 변경하는 가장 간단한 방법은 다음과 같습니다.

EXEC SP_ChangeDBOwner 'sa'

네크로마닝:
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 로그인을 사용).

언급URL : https://stackoverflow.com/questions/12389656/the-database-owner-sid-recorded-in-the-master-database-differs-from-the-database

반응형