当我尝试将 tSQLt 安装到现有数据库上时,出现以下错误:
master 数据库中记录的数据库所有者 SID 与数据库 '' 中记录的数据库所有者 SID 不同。您应该通过使用 ALTER AUTHORIZATION 语句重置数据库 '' 的所有者来纠正这种情况。
当我尝试将 tSQLt 安装到现有数据库上时,出现以下错误:
master 数据库中记录的数据库所有者 SID 与数据库 '' 中记录的数据库所有者 SID 不同。您应该通过使用 ALTER AUTHORIZATION 语句重置数据库 '' 的所有者来纠正这种情况。
当从备份还原的数据库且数据库所有者的 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)
将此添加到 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
死灵法:
如果您不想使用 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 登录)也可以修复错误。
更改数据库所有者的最简单方法是:
EXEC SP_ChangeDBOwner 'sa'