8

SQLServerエージェントのスケジュールされたジョブがいくつかあり、そのうちの1つがデータベースの完全バックアップを実行します。バックアップの開始時に他のいくつかのジョブを無効にし、バックアップが完了したらそれらを再度有効にします。そうするための正しい方法は何ですか?次のtsqlコマンドの1つをバックアップタスクの最初のステップに追加することを考えていました(そしてそれぞれのenableコマンドを最後のステップに追加する)が、どちらが優れているか(または別の方法があるかもしれません)がわかりません。

UPDATE MSDB.dbo.sysjobs
SET Enabled = 0
WHERE [Name] IN (....)

またはEXEC dbo.sp_update_job
ありがとう。

4

6 に答える 6

6

間違いなくsp_update_jobを使用してください。ジョブがすでにスケジュールされている場合、sysjobsテーブルを直接操作しても、必ずしもキャッシュされたスケジュールが再計算されるとは限りません。

ENABLEDフラグ(まだ試していません)では機能する可能性がありますが、start_step_idのような列では機能しないことはわかっています。

于 2011-03-23T19:56:53.530 に答える
4

EXEC dbo.sp_update_jobシステムテーブルを直接更新できないため、実行する必要があります( sysjobsがシステムテーブルとしてカウントされるかどうかはわかりませんが、 Mitchは更新できると言っています)

sp_getapplockとsp_releaseapplockを使用して、実際にジョブを更新せずに他のジョブを「ロック」することを検討します。

于 2011-03-23T15:49:03.843 に答える
2

サポートされている再利用可能なロジックをカプセル化するため、sp_update_jobを使用します。なぜ車輪の再発明をするのか。

http://msdn.microsoft.com/en-us/library/ms188745.aspx

于 2011-03-23T15:56:17.663 に答える
1

SQL Agentは、ジョブの有効なステータスをキャッシュします。したがって、sysjobsテーブルを更新するだけでは、スケジュールによるジョブのトリガーが実際に妨げられることはありません。ストアドプロシージャはsp_update_jobキャッシュを更新するようにトリガーするので、それを使用することをお勧めします。

それでもsysjobsで値を手動で設定する場合は、実行sp_sqlagent_notifyして実際にSQLエージェントを取得する必要があります。更新は有効なステータスのキャッシュです。sp_update_job必要な正確なパラメータについては、のコードをご覧ください。

于 2012-03-15T20:50:28.577 に答える
1

提案されたアプローチに問題はありません。また、職種を介して操作することもできます。

UPDATE j
SET j.Enabled = 0
FROM MSDB.dbo.sysjobs j
INNER JOIN MSDB.dbo.syscategories c ON j.category_id = c.category_id
WHERE c.[Name] = 'Database Maintenance';

私はそれをプロファイリングしていませんが、私は疑っています

USE msdb ;
GO

EXEC dbo.sp_update_job
    @job_name = N'SomeJob',
    @enabled = 0;
GO

同じコードを生成しますが、通常は組み込みのprocが最適です。

于 2011-03-23T15:48:01.830 に答える
0

もう1つのアプローチは、他のジョブの開始時にバックアップジョブのステータスをチェックし、バックアップが実行されている場合は現在のジョブを中止またはスリープするステップを追加することです。

私たちは時々両方の方法でそれを行いましたが、異なる仕事がどれほど信頼できる/重要であるかに依存します。

于 2011-03-23T19:48:08.487 に答える