logging在主数据库中的数据库所有者SID不同于数据库所有者SID

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

logging在主数据库中的数据库所有者SID不同于logging在数据库“'中的数据库所有者SID。 您应该通过使用ALTER AUTHORIZATION语句重置数据库的所有者来纠正这种情况。

从备份中恢复的数据库和数据库所有者的SID与主数据库中列出的所有者SID不匹配时,可能会出现此问题。 这是一个解决scheme,它使用错误消息中推荐的“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.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 

Necromaning:
如果您不想使用SQL-Server 2000视图(不build议使用),请使用以下命令:

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

也可以防止奇怪命名的数据库或用户的错误,也修复了如果没有用户关联(使用salogin)的错误。

当你想要导入一个新的clr,如果你有这个错误信息只需设置为所有者为您的databse像下面所以应该是工作

修改Database :: []到[sa]的授权

Interesting Posts