1

有点卡在我们遇到的问题上,让我尽力解释场景,问题以及我们尝试过的内容。

  1. 我们有一个 SQL 作业,它正在记录到一个特定的文件,该文件带有一个附加到末尾的日期标记
  2. 第一步检查我们的日志文件是什么,例如 log_01012012.log,如果这不正确,我们更新表 sysjobsteps 以获得所有步骤的新文件位置 - 例如 log_02012012.log。我们通过在第一个工作步骤中调用存储过程来做到这一点。
  3. 虽然这在表中得到更新,但其余步骤继续使用旧日志,因为我假设该表仅在作业开始时被读取一次。

我们尝试使用以下代码在存储过程中重新启动作业:

EXEC msdb.dbo.sp_stop_job @job_name = 'My Job'
waitfor delay '00:00:15'
EXEC msdb.dbo.sp_start_job @job_name = 'My Job'

但是,当我们终止作业时,它会在终止存储过程(我猜它是作业的子进程)时出现,这意味着它永远不会进入重新启动作业的步骤。

有没有一种方法可以让作业重新启动,以便再次查看 sysjobsteps 表并使用正确的位置进行日志记录?

可能解决问题的事情是

  • 能够从作业本身重新启动作业
  • 能够在某些方面刷新工作。

任何我需要澄清的事情我都会尽力而为,但我们目前陷入困境,所有输入将不胜感激!

4

3 回答 3

0

转到 SSMS 上的 sql server 代理

扩大工作

  1. 创造工作,
  2. 定义步骤(sp 或简单查询)
  3. 定义计划(sqlserver 重新启动时多久甚至启动一次作业)
  4. 设置通知以在作业完成时向您发送电子邮件(成功/失败)

希望这可以帮助。

于 2012-05-11T03:37:33.620 回答
0

您可以使用 Service Broker 做一些花哨的事情。就像是:

1) 作为工作的最后一步,将消息放入代理队列。内容可以为空;这只是表示“嘿......需要重新提交工作”的象征。

2)为延迟的队列编写一个激活存储过程(就像您在已经存在的过程中所做的那样),然后重新提交作业

或者,您不是在作业步骤本身中硬编码日志文件名,而是将该数据放在某个表中。然后,在更改位置的步骤中,将成功条件定义为“转到下一步”,将失败条件定义为“转到第 1 步”。然后修改更改文件位置的代码以返回错误(从而触发作业步骤的失败条件)。

于 2012-05-11T10:51:25.273 回答
0

意识到将近十年了,但我遇到了同样的问题并解决如下。使用 OP 建议的代码:

EXEC msdb.dbo.sp_start_job @job_name = 'My Job A'

只需创建一对匹配的作业,每个作业都有相同的第一步(执行实际工作)和包含上述代码但指向相反作业名称的最后一步(基本上你不能从自身重新启动同一个作业据我所知)。只需确保您在“高级”选项卡中设置“步骤行为”以在每种情况下执行最后一步,该工作就会无限期地消失。

于 2021-06-04T08:31:14.403 回答