必須在查詢分析器執行系統預存程序:
-- 1. 先終止所有連線(避免鎖定)
CREATE PROC dbo.killspid @dbname SYSNAME AS
BEGIN
DECLARE @sql NVARCHAR(MAX), @spid INT;
SET @sql = N'DECLARE c CURSOR FOR SELECT spid FROM sysprocesses WHERE dbid = DB_ID(''' + @dbname + N''')';
EXEC sp_executesql @sql;
OPEN c; FETCH NEXT FROM c INTO @spid;
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC(N'KILL ' + @spid);
FETCH NEXT FROM c INTO @spid;
END
CLOSE c; DEALLOCATE c;
END
GO
-- 2. 執行終止連線
EXEC dbo.killspid 'OldDBName';
GO
-- 3. 重命名
EXEC sp_renamedb 'OldDBName', 'NewDBName';
GO
替代法:企業管理器 → 右鍵資料庫 → 所有工作 → **分離資料庫** → 勾選「清除連線」 → 執行 sp_renamedb → 再附加。
-- 在目標資料庫內執行
EXEC sp_MSForEachTable 'sp_changeobjectowner ''?'', ''dbo''';
GO
隱藏預存程序 sp_MSForEachTable 會遍歷使用者資料表,自動套用 sp_changeobjectowner。
DTS/匯入匯出精靈預設僅複製資料,**物件屬性會遺失**。正確步驟:
UPDATE TargetTable
SET TargetColumn = REPLACE(TargetColumn, '惡意字串', '安全字串');
GO
⚠️ 執行前**務必完整備份**,建議先用 SELECT 驗證影響範圍:
SELECT * FROM TargetTable WHERE TargetColumn LIKE '%惡意字串%';
現象:資料庫還原後,網站存取報「ODBC 驅動程式不支援所需屬性」或 HTTP 500。
原因:資料庫內使用者存在,但對應的伺服器登入 (Login) 遺失(SID 不匹配)。
EXEC sp_change_users_login 'Auto_Fix', 'UserName', NULL, 'Password'; (SQL 2000/2005)ALTER USER UserName WITH LOGIN = LoginName; (SQL 2005+)db_datareader、db_datawriter,**避免給 db_owner**。特徵:資料庫使用者存在,但「登入」欄為空。
解決:企業管理器 → 安全性 → 使用者 → 刪除該使用者 → 重新新增 → 指派 db_datareader/db_datawriter。同樣遵循最小權限原則。
這六大經典問題涵蓋了資料庫生命週期中「重命名、擁有者、遷移、清洗、還原、權限」的核心痛點。掌握 sp_renamedb、sp_MSForEachTable、匯出精靈「複製物件」選項、REPLACE 清洗、孤立使用者 sp_change_users_login/ALTER USER 修復,即可從容應對大多數維運情境。記住:**動刀前先備份、最小權限原則、驗證後再提交**。