web-dev-qa-db-ja.com

OlaHallengrenのSQLServerジョブのコマンドを更新するにはどうすればよいですか?

OlaのMaintenanceSolution.sqlスクリプトから作成されたジョブを、完全に削除して再作成したり、ジョブのプロパティに移動してからステップに移動して変更したりすることなく、各ジョブを個別に変更することなく、簡単に更新する方法を探しています。コマンド。

具体的には、@CleanupTime引数を更新しようとしています。これは、古いバックアップをいつ削除するかをジョブに通知するために使用されます。彼の [〜#〜] faq [〜#〜] によると、彼のスクリプトの新しいバージョンが利用可能であり、その新しいバージョンに更新したいときはいつでも、MaintenanceSolution.sqlをダウンロードする必要があります。スクリプトを作成して再実行します。ジョブを作成しない場合は、SET @CreateJobs = 'N'を指定するオプションを使用します。つまり、@CreateJobs = 'Y'を離れると、ジョブが新たに作成されるということですが、そうではないようです。

たとえば、「DatabaseBackup-USER_DATABASES-FULL」ジョブがすでに存在し、ステップのコマンドが@CleanupTime = 48を示している場合、MaintenanceSolution.sqlスクリプトを@CleanupTime = 168で再実行してから、戻ります。ジョブのステップに入ると、まだ@CleanupTime = 48が表示されます。

3
Matador1006

すべてを完全に再作成したり、UIで自分を指してクリックしたりすることなく、ステップを更新できます。 msdb.dbo.sysjobstepsに対して直接手動クエリを作成できます(REPLACE()呼び出しを発行するSELECTから始めて、問題がなければUPDATEに変更します)。

SELECT REPLACE(js.command, N'foo', N'bar') 
  FROM msdb.dbo.sysjobsteps AS js
  INNER JOIN msdb.dbo.sysjobs AS j
  ON js.job_id = j.job_id
  WHERE j.name = N'name of the job';

満足している場合は、最初の数行だけが変更されます。

UPDATE js
  SET command = REPLACE(js.command, N'foo', N'bar') 
  FROM msdb.dbo.sysjobsteps AS js
  INNER JOIN msdb.dbo.sysjobs AS j
  ON js.job_id = j.job_id
  WHERE j.name = N'name of the job';

置き換える文字列がすべてのジョブステップで正確に同じではない可能性があり、誤検知が発生する可能性があるため、それよりも自動化するのは困難です(たとえば、一度に複数のジョブを更新する)。 、も。

5
Aaron Bertrand