从一个主要作业顺序调用多个 SQL Server 代理作业的好方法?

11 sql-server t-sql sql-server-2008-r2 sql-server-agent

我有几个应该按顺序运行的 SQL Server 代理作业。为了对应该执行的作业有一个很好的概述,我创建了一个主作业,它通过调用EXEC msdb.dbo.sp_start_job N'TEST1'. 在sp_start_job瞬间完成(作业步骤1),但我想我的主要工作要等到工作TEST1已经调用下一个工作之前完成。

所以我写了这个小脚本,它在作业被调用后立即开始执行(作业步骤 2),并强制主作业等待子作业完成:

WHILE 1 = 1
  BEGIN
    WAITFOR DELAY '00:05:00.000';

    SELECT *
    INTO   #jobs
    FROM   OPENROWSET('SQLNCLI', 'Server=TESTSERVER;Trusted_Connection=yes;',
           'EXEC msdb.dbo.sp_help_job @job_name = N''TEST1'',
           @execution_status = 0, @job_aspect = N''JOB''');

    IF NOT (EXISTS (SELECT top 1 * FROM #jobs))
      BEGIN
        BREAK
      END;

    DROP TABLE #jobs;

  END;
Run Code Online (Sandbox Code Playgroud)

这工作得很好。但我觉得更聪明和/或更安全(WHILE 1 = 1?)的解决方案应该是可能的。

我对以下事情很好奇,希望你能给我一些见解:

  • 这种方法有什么问题?
  • 你能建议一个更好的方法来做到这一点吗?

(我首先在StackOverflow 上发布了这个问题,因为我专注于改进代码。仍然有效。但我的猜测是,这里的人们通常会更聪明地说出为什么我不应该像我那样尝试这样做”我现在就做,或者提供好的替代方案。)

编辑(7 月 25 日)
显然我的脚本没有太多错误,根据指出它问题的答案数量很少:-) 这种脚本的替代方法似乎是使用专为这些设计的工具任务(如 SQL Sentry 事件管理器或...) - 或者自己编写这样的工具。我们不会在我现在的公司购买这样的工具,所以现在我只会坚持使用脚本。

Aar*_*and 9

SQL Sentry有一个专门为此构建的工具:链接作业并将它们安排在各种工作流程顺序中。

几年前,在我加入公司之前,我就开始使用 SQL Sentry 来做到这一点。我想要的是一种在生产备份完成后立即在我们的测试服务器上启动还原作业的方法。

我最初实施的只是备份作业开始时间和恢复开始时间之间的大量缓冲。这并不是万无一失的。由于备份时间不同,缓冲区经常让我们浪费时间,即使它可以开始恢复也没有开始。有时缓冲区不够用。

我接下来实施的与您所拥有的类似 - 我在测试服务器上编写了一个在计划备份后不久启动的作业,并不断轮询以查看作业何时完成。后来修改为仅在备份作业中进行第二步更新测试服务器上的表。没有太大的不同,除了还原作业只需要在本地查看表而不是远程监控作业历史记录。回想一下,这可能是该表上的触发器调用,sp_start_job因此该作业不必每 n 分钟运行一次(或根本不需要调度)。

最终的解决方案是将作业链接在一起......当服务器 A 上的备份完成时,事件管理器启动服务器 B 上的还原作业。如果有第三个作业和第四个作业,或基于要做什么的条件逻辑当工作失败与成功等时,这一切都可以解释。工作流设计器会提醒你很多 SSIS:

在此处输入图片说明

当然,我所描述的基本机制不是火箭手术。如果你坐下来做,你可以自己编写这种类型的链接包装器。只是为您提供一种您不必的选择。