變更 SQL Server 2005 主機名或 IP 後,原有維護計畫因綁定舊伺服器名稱而成為「孤兒計畫」,在 SSMS 中無法正常刪除。本文提供經實測可行的 T-SQL 清理腳本,直接操作 msdb 系統表徹底移除殘留計畫與相關作業/排程。
msdb.dbo.sysmaintplan_plans 等系統表,包含伺服器名稱資訊。檢視 → 已註冊的伺服器 → 右鍵舊主機名稱 → 刪除。
-- 刪除維護計畫(變更主機名後清理)
USE [msdb];
SET NOCOUNT ON;
BEGIN TRAN;
DECLARE @SubPlanName VARCHAR(200) = 'Subplan_1'; -- 依實際計畫名稱調整
-- 取得相關 ID
DECLARE @SubPlan_id UNIQUEIDENTIFIER, @job_id UNIQUEIDENTIFIER,
@msx_job_id UNIQUEIDENTIFIER, @Schedule_id UNIQUEIDENTIFIER;
SELECT @job_id = job_id, @msx_job_id = msx_job_id, @SubPlan_id = subplan_id
FROM sysmaintplan_SubPlans WHERE SubPlan_name = @SubPlanName;
-- 依相依順序刪除
IF @SubPlan_id IS NOT NULL
DELETE FROM sysmaintplan_log WHERE SubPlan_id = @SubPlan_id;
IF @SubPlanName IS NOT NULL AND @SubPlanName <> ''
DELETE FROM sysmaintplan_SubPlans WHERE SubPlan_Name = @SubPlanName;
IF @Schedule_id IS NOT NULL AND @Schedule_id <> '00000000-0000-0000-0000-000000000000'
DELETE FROM SysSchedules WHERE Schedule_id = @Schedule_id;
IF @job_id IS NOT NULL AND @job_id <> '00000000-0000-0000-0000-000000000000'
DELETE FROM sysjobs WHERE job_id = @job_id;
-- 關鍵:清除計畫主表殘留記錄
DELETE FROM msdb.dbo.sysmaintplan_plans;
COMMIT TRAN;
IF @@ERROR <> 0 PRINT 'Job failed ;-(' ELSE PRINT 'Job done! ;-)';
SET NOCOUNT OFF;
| 系統表 | 用途 | 刪除順序 |
|---|---|---|
| sysmaintplan_log | 計畫執行歷程 | 1 |
| sysmaintplan_SubPlans | 子計畫定義 | 2 |
| SysSchedules | 排程定義 | 3 |
| sysjobs | SQL Agent 作業 | 4 |
| sysmaintplan_plans | 計畫主表(必須最後清除) | 5 |
msdb 系統表屬非官方支援操作,**執行前務必備份 msdb**,生產環境建議在維護窗口進行。其他 SQL Server 版本(2008/R2/2012+)系統表結構可能不同,請先驗證再使用。掌握此清理腳本,能快速解決主機遷移後的維護計畫殘留問題,避免 SSMS 操作卡住、錯誤訊息干擾日常運維。