当我尝试将tSQLt安装到现有数据库时,我收到以下错误:
master数据库中记录的数据库所有者SID与 数据库所有者SID记录在数据库中''。你应该纠正 这种情况通过重置数据库的所有者''使用ALTER 授权声明。
答案 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'