JDP*_*ham 76 sql-server clrstoredprocedure tsqlt
当我尝试将tSQLt安装到现有数据库时,我收到以下错误:
记录在主数据库中的数据库所有者SID与记录在数据库''中的数据库所有者SID不同.您应该通过使用ALTER AUTHORIZATION语句重置数据库''的所有者来纠正这种情况.
Joh*_*nyM 134
从备份还原的数据库和数据库所有者的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)
Run Code Online (Sandbox Code Playgroud)
JDP*_*ham 30
将其添加到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)
Run Code Online (Sandbox Code Playgroud)
小智 17
在数据库上应用以下脚本会出现错误:
EXEC sp_changedbowner 'sa'
ALTER DATABASE [database_name] SET TRUSTWORTHY ON
Run Code Online (Sandbox Code Playgroud)
死灵法师:
如果您不想使用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
Run Code Online (Sandbox Code Playgroud)
还可以防止在名称不正确的数据库或用户上出现错误,并且还可以在没有用户关联的情况下修复错误(使用sa登录)。