SQLServer2005,维护计划无法同时执行多个任务或多个子计划

时间:2022-06-01 18:42:53
MSSQLServer2005(Sp3),安装在Windows 2003 Server sp2上,
自从由于以前建立的维护计划无法删除,执行了如下的操作把维护计划删除之后,
重新建立维护计划时,维护计划内如果有多个任务,或有多个子计划,
就无法执行,执行时出错。




我是按照下列步骤执行删除无法删除的维护计划的。
系统中有无法删除的维护计划,错误提示类似于:
“DELETE语句与 REFERENCE约束"FK_subplan_job_id"冲突。
该冲突发生于数据库"msdb",表"dbo.sysmaintplan_subplans",column 'job_id'”
----------------------------*/
--适用于mssql2005,可用于删除sql server 2005中使用界面环境无法删除的 维护计划
 
use [msdb]
 set nocount on
 begin tran
 declare @SubPlanName varchar(200) 
 --计划名称从Sqlserver 代理->作业查看,
 --例 如:BakUserDB.子计划,那该值就是“子计划”,赋值给下面的变量
 set @SubPlanName='Subplan_1' --'子计划' 
 
 --获得外键约束用到的列
 declare @subPlan_id varchar(100),@job_id varchar(100)
      ,@msx_job_id varchar(100),@Schedule_id varchar(100)
 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 and @SubPlan_id<>'') 
 delete from sysmaintplan_log where SubPlan_id=@SubPlan_id
 
 if (@SubPlanName<>'' and @SubPlanName is not null)  
 delete from sysmaintplan_SubPlans where SubPlan_Name=@SubPlanName
 
 if (@Schedule_id is not null and @Schedule_id <>'') 
 delete from SysSchedules where Schedule_id=@Schedule_id
 
 if (@job_id is not null and @job_id<>'')
 delete from sysjobs where job_id=@job_id
 
 
  /*--------------------------------------------------------------------
 在上面的句子执行完后,该维护计划的接点依然存在,此时再更新msdb中对应的视图
 (该视图我是通过Sql Server Profiler监测到的)代码如下:
 ---------------------------------------------------------------------*/
 delete
   FROM msdb.dbo.sysmaintplan_plans
 --执行上述代码结束后,刷新维护计划的节点,该节点成功删除。
 commit tran
 if @@error<>0 Print '执行失败'
 else Print '执行成功'
 
 set nocount off

9 个解决方案

#1


现在又出现了维护计划无法删除的情况了,郁闷啊

#2


全力帮顶

#3


这个只有帮顶了.

#4


# dawugui
# (爱新觉罗.毓华)
难道您也不知道如何解决么?

#5


各位老大们,帮忙啊

#6


等待中

#7


本帖最后由 htl258 于 2010-05-20 09:35:51 编辑
----------------------------*/
--适用于mssql2005,可用于删除sql server 2005中使用界面环境无法删除的 维护计划
 
use [msdb]
 set nocount on
 begin tran
 declare @SubPlanName varchar(200)  ,@error int
 --计划名称从Sqlserver 代理->作业查看,
 --例 如:BakUserDB.子计划,那该值就是“子计划”,赋值给下面的变量
 set @SubPlanName='Subplan_1' --'子计划'  
 set @error=0
  
 --按照顺序删除记录
 delete from sysmaintplan_log 
 where exists(select 1 from sysmaintplan_SubPlans where SubPlan_name=@SubPlanName and subplan_id=sysmaintplan_log.subplan_id)
 set @error= @error+@@error
 
 delete from sysmaintplan_SubPlans where SubPlan_Name=@SubPlanName
 set @error= @error+@@error 
 
 delete from SysSchedules 
 where exists(select 1 from sysmaintplan_SubPlans where SubPlan_name=@SubPlanName and SysSchedules.Schedule_id=schedule_id)
 set @error= @error+@@error
 
 delete from sysjobs 
 where exists(select 1 from sysmaintplan_SubPlans where SubPlan_name=@SubPlanName and sysjobs.job_id=job_id)
  set @error= @error+@@error 
 
  /*--------------------------------------------------------------------
 在上面的句子执行完后,该维护计划的接点依然存在,此时再更新msdb中对应的视图
 (该视图我是通过Sql Server Profiler监测到的)代码如下:
 ---------------------------------------------------------------------*/
 delete FROM msdb.dbo.sysmaintplan_plans
 set @error= @error+@@error 
 --执行上述代码结束后,刷新维护计划的节点,该节点成功删除。
 if @error<>0
 rollback tran
 else 
 commit tran
 
 if @error<>0 Print '执行失败'
 else Print '执行成功'
  
 set nocount off
这为这样试试

#8


没什么区别啊

#9


等待中

#1


现在又出现了维护计划无法删除的情况了,郁闷啊

#2


全力帮顶

#3


这个只有帮顶了.

#4


# dawugui
# (爱新觉罗.毓华)
难道您也不知道如何解决么?

#5


各位老大们,帮忙啊

#6


等待中

#7


本帖最后由 htl258 于 2010-05-20 09:35:51 编辑
----------------------------*/
--适用于mssql2005,可用于删除sql server 2005中使用界面环境无法删除的 维护计划
 
use [msdb]
 set nocount on
 begin tran
 declare @SubPlanName varchar(200)  ,@error int
 --计划名称从Sqlserver 代理->作业查看,
 --例 如:BakUserDB.子计划,那该值就是“子计划”,赋值给下面的变量
 set @SubPlanName='Subplan_1' --'子计划'  
 set @error=0
  
 --按照顺序删除记录
 delete from sysmaintplan_log 
 where exists(select 1 from sysmaintplan_SubPlans where SubPlan_name=@SubPlanName and subplan_id=sysmaintplan_log.subplan_id)
 set @error= @error+@@error
 
 delete from sysmaintplan_SubPlans where SubPlan_Name=@SubPlanName
 set @error= @error+@@error 
 
 delete from SysSchedules 
 where exists(select 1 from sysmaintplan_SubPlans where SubPlan_name=@SubPlanName and SysSchedules.Schedule_id=schedule_id)
 set @error= @error+@@error
 
 delete from sysjobs 
 where exists(select 1 from sysmaintplan_SubPlans where SubPlan_name=@SubPlanName and sysjobs.job_id=job_id)
  set @error= @error+@@error 
 
  /*--------------------------------------------------------------------
 在上面的句子执行完后,该维护计划的接点依然存在,此时再更新msdb中对应的视图
 (该视图我是通过Sql Server Profiler监测到的)代码如下:
 ---------------------------------------------------------------------*/
 delete FROM msdb.dbo.sysmaintplan_plans
 set @error= @error+@@error 
 --执行上述代码结束后,刷新维护计划的节点,该节点成功删除。
 if @error<>0
 rollback tran
 else 
 commit tran
 
 if @error<>0 Print '执行失败'
 else Print '执行成功'
  
 set nocount off
这为这样试试

#8


没什么区别啊

#9


等待中