记录在主数据库中的数据库所有者SID与数据库所有者SID不同

时间:2012-09-12 13:45:53

标签: sql-server clrstoredprocedure tsqlt

当我尝试将tSQLt安装到现有数据库时,我收到以下错误:

  

master数据库中记录的数据库所有者SID与   数据库所有者SID记录在数据库中''。你应该纠正   这种情况通过重置数据库的所有者''使用ALTER   授权声明。

6 个答案:

答案 0 :(得分:124)

从备份还原的数据库和数据库所有者的SID与master数据库中列出的所有者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)

答案 1 :(得分:28)

将此添加到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)

答案 2 :(得分:15)

在数据库上应用以下脚本会出现错误:

EXEC sp_changedbowner 'sa'

ALTER DATABASE [database_name] SET TRUSTWORTHY ON 

答案 3 :(得分:4)

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

还可以防止奇怪命名的数据库或用户出错,如果没有用户关联,也可以修复bug(使用sa登录)。

答案 4 :(得分:0)

我也遇到了这个问题,发现主数据库中不存在目标数据库的所有者。将该用户映射到主数据库为我解决了这个问题。

答案 5 :(得分:0)

更改所有者的最简单方法是:

EXEC sp_changedbowner 'sa'