4

順番に実行する必要のあるSQLServerエージェントジョブがいくつかあります。実行する必要のあるジョブの概要を把握するために、を呼び出して他のジョブを呼び出すメインジョブを作成しました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;

これで十分に機能します。WHILE 1 = 1しかし、私はより賢く、そして/またはより安全な( ?)解決策が可能であると感じました。

私は次のことに興味があります。あなたが私にいくつかの洞察を提供してくれることを願っています:

  • このアプローチの問題は何ですか?
  • これを行うためのより良い方法を提案できますか?

(私はこの質問をd​​ba.stackexchange.comにも投稿しました。これは、プログラミングが少なく、dbaが多いという観点からも利益を得るためです。)

4

2 に答える 2

3

テーブルをポーリングすることを選択した場合は、msdb.dbo.sysjobhistoryを確認し、run_statusが4でなくなるまで待つ必要があります。

おそらく別のアプローチは、ジョブの最後のステップである失敗または成功で、プロセスが完了した「マスター」ジョブサーバーにエントリを作成し、ローカルで確認することです。また、一元化されたジョブサーバーで開始と停止を統合することにより、「一体何が起こったのか」を簡単に追跡できるようになる可能性があります。

3番目の、はるかに堅牢なアプローチは、Service Brokerのようなものを使用して、プロセス間の通信とシグナリングを処理することです。これにはさらに多くのセットアップが必要になりますが、プロセス間で通信するための最も多くのメカニズムになります。

于 2012-07-13T21:41:39.453 に答える
0

アプローチに問題はありません。私はあなたの要件のようにやややっていて、他の理由で実行ステータスを確認するためにmsdbのsysjobhistoryテーブルを使用しました。

質問に戻って、同じアプローチを使用するmsdb.dbo.sp_start_jobストアドプロシージャを参照してください。これは、1つのデフォルトのMicrosoftBizTalkジョブ'MessageBox_Message_ManageRefCountLog_BizTalkMsgBoxDb'によって使用され、別の依存するデフォルトのbiztalkジョブ'MessageBox_Message_Cleanup_BizTalkMsgBoxDb'を呼び出します。BizTalkメッセージボックスには、ジョブのステータスを確認するためのストアドプロシージャが1つあります。BizTalkメッセージボックスの「int_IsAgentJobRunning」を参照してください。

于 2013-01-31T07:14:22.593 に答える