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
還可以防止奇怪命名數據庫或用戶上的錯誤,並且還修復錯誤,如果沒有用戶相關聯(使用sa登錄)。
謝謝!這似乎更合適。你認爲用quotename()代替在字符串中放置'[''是不值得的嗎?也可以選擇var DBName和var LoginName,然後將它們放在var Command中而不是使用REPLACE()? – JDPeckham
如果您的DB名稱中包含空格或特殊字符(如' - '),則此腳本會給您提供錯誤。因此,只需將[]括號如下所示:'ALTER AUTHORIZATION ON DATABASE :: [<< DatabaseName >>] TO [<>]' –
buhtla
當我運行這個時,我得到錯誤「建議的新數據庫所有者已經是用戶或別名在數據庫中「 – MobileMon