私は手動で調整された期間に開始するジョブを持っていますが、かなりの作業が必要です(バックアップの復元と別のサーバーの構成)
数分から数日の増分で実行するようにスケジュールされたいくつかのジョブがあります。スケジューラーを「オフ」にしたいので、手動ジョブが完了するまでスケジュールどおりに実行されません。失われたジョブは、スケジューラーが再始動された後、次のスケジュールされた時刻まで再度実行されないことを理解しています。
私は AnOracleコマンド を見つけましたが、私は100%Microsoft SQL Serverです
SQLエージェントをオフにすると、ジョブは実行されません だとわかっていますが、それは私が探しているものではありません。
今日存在する仕事は、次回同じ仕事になることは期待されていません。 EXEC dbo.sp_update_job を使用してジョブを無効にすることは、実行可能なソリューションではありません。
追加情報:何らかの理由で意図的に無効にされているジョブが、再度有効にされたい場合もあります。スケジューラーを停止することが最良の選択のようです。
まず、いくつかの情報を保持するステージングテーブルを作成することをお勧めします。以下のコードが出力するデータを保持するようにテーブルを作成する必要があります。保管することをお勧めしますSchedule_ID
、name
、job_id
最低でも。 (カンニングしたい場合は、アスタリスクを展開して必要な列を選択してから、Word INTO
とdatabase.schema.table_name_you_want_to_createを追加すると、初めてテーブルが作成されます。その後、インサートに変更できます。)
SELECT * FROM
MSDB.dbo.sysschedules ss
INNER JOIN msdb.dbo.sysjobschedules jss
ON jss.schedule_id = ss.schedule_id
WHERE ss.enabled = 1
このコードはすべてのスケジュールのスケジュールを返し、内部結合も実行して、返されるデータを、現在有効になっているジョブとペアになっているスケジュールのみに制限します。
次に、ステージングテーブルを介してループまたはカーソルまたは同様のものを作成し、 sp_update_scheduleプロシージャ を実行します。これにより、有効になっていてジョブとペアになっているすべてのスケジュールが無効になります。メンテナンスが完了したら、ループをもう一度実行できますが、今回は以前に無効にしたスケジュールを有効にします。
ループの例が必要な場合は、 過去にスタックオーバーフローで作成した例 を確認できます。
戻って、提案を使用して完全なコードソリューションを作成しました。以下をご覧ください。合計で2つのスクリプトがあります。 1つ目はジョブを無効にし、2つ目は再度有効にします。 本番環境に置く前に、テスト環境でこれをテストします。完全性のソース 。
スクリプト1:
USE MSDB;
/*************************************************************
Checking for history table. Creating it if it doesn't exist.
*************************************************************/
IF OBJECT_ID('dbo.JobsEnabledTracker', 'U') IS NULL
BEGIN
CREATE TABLE [dbo].[JobsEnabledTracker](
[Id] [INT] IDENTITY(1, 1) NOT NULL,
[job_id] [UNIQUEIDENTIFIER] NULL,
[schedule_id] [BIGINT] NULL,
[enabled] [BIT] NULL);
END;
IF EXISTS
(
SELECT
1
FROM [dbo].[JobsEnabledTracker]
WHERE [enabled] = 1
)
OR
(
SELECT
COUNT(*)
FROM [dbo].[JobsEnabledTracker]
) = 0
BEGIN
PRINT 'There are jobs enabled or there are no jobs yet populated in the history table.';
/***********************
Clear out history table
***********************/
PRINT 'Truncating history table: dbo.JobsEnabledTracker';
TRUNCATE TABLE [dbo].[JobsEnabledTracker];
PRINT 'Inserting records into history table: dbo.JobsEnabledTracker';
/******************************
Add in values to history table
******************************/
INSERT INTO [dbo].[JobsEnabledTracker]
(
[job_id],
[schedule_id],
[enabled]
)
SELECT
[jss].[job_id],
[jss].[schedule_id],
1 AS 'enabled'
FROM [msdb].[dbo].[sysschedules] AS [ss]
INNER JOIN [msdb].[dbo].[sysjobschedules] AS [jss] ON [jss].[schedule_id] = [ss].[schedule_id]
WHERE [ss].[enabled] = 1;
/**********************************************************************************
Table variable to hold schedules and jobs enabled. This is important for the loop.
**********************************************************************************/
DECLARE @JobsEnabled TABLE
([Id] INT
PRIMARY KEY IDENTITY(1, 1),
[job_id] UNIQUEIDENTIFIER,
[schedule_id] BIGINT,
[enabled] BIT
);
/*****************************************
Insert schedules that we need to disable.
*****************************************/
INSERT INTO @JobsEnabled
(
[job_id],
[schedule_id],
[enabled]
)
SELECT
[job_id],
[schedule_id],
[enabled]
FROM [dbo].[JobsEnabledTracker];
/********************************
Holds the job id and schedule id
********************************/
DECLARE @jobid UNIQUEIDENTIFIER;
DECLARE @scheduleid BIGINT;
/***********************************
Holds the ID of the row in the loop
***********************************/
DECLARE @ID INT= 0;
/**********************
Check if records exist
**********************/
IF EXISTS
(
SELECT
[Id]
FROM @JobsEnabled
)
BEGIN
PRINT 'Loop mode, jobs found enabled.';
/**********
Begin loop
**********/
WHILE(1 = 1)
BEGIN
/***************************************
Grab jobid, scheduleid, and id of rows.
***************************************/
SELECT
@jobid =
(
SELECT TOP 1
[job_id]
FROM @JobsEnabled
ORDER BY
[job_id]
);
SELECT
@scheduleid =
(
SELECT TOP 1
[schedule_id]
FROM @JobsEnabled
ORDER BY
[job_id]
);
SELECT
@ID =
(
SELECT TOP 1
[Id]
FROM @JobsEnabled
ORDER BY
[job_id]
);
/************************************
Re-enable schedule associated to job
************************************/
PRINT 'Disabling schedule_id: '+CAST(@scheduleid AS VARCHAR(255))+' paired to job_id: '+CAST(@jobid AS VARCHAR(255));
EXEC [sp_update_schedule]
@schedule_id = @scheduleid,
@enabled = 0;
/*********************
Removes row from loop
*********************/
DELETE FROM @JobsEnabled
WHERE
[Id] = @ID;
UPDATE [dbo].[JobsEnabledTracker]
SET
[enabled] = 0
WHERE
[job_id] = @jobid
AND [schedule_id] = @scheduleid;
/****************************
No more rows, stops deleting
****************************/
IF
(
SELECT
COUNT(*)
FROM @JobsEnabled
) <= 0
BEGIN
BREAK
END;
/********
End Loop
********/
END;
PRINT 'Exiting loop, disabling schedules paired to jobs complete.';
/**********
End elseif
**********/
END;
ELSE
BEGIN
PRINT 'All done';
END;
END;
ELSE
BEGIN
PRINT 'YOU HAVE JOBS STILL DISABLED, EXITING SCRIPT. PLEASE RUN SCRIPT TWO FIRST.';
END;
スクリプト2
USE MSDB;
/*******************************************************************************
Check for history table. This physical table tells us what jobs we are going to
enable the scheduler for.
*******************************************************************************/
IF OBJECT_ID('dbo.JobsEnabledTracker', 'U') IS NOT NULL
BEGIN
IF EXISTS
(
SELECT 1
FROM [dbo].[JobsEnabledTracker]
WHERE [enabled] = 0
)
BEGIN
PRINT 'Jobs disabled in history table: dbo.JobsEnabledTracker found.';
/**********************************************************************************
Table variable to hold schedules and jobs enabled. This is important for the loop.
**********************************************************************************/
DECLARE @JobsEnabled TABLE
(
[Id] int PRIMARY KEY IDENTITY(1, 1)
, [job_id] uniqueidentifier
, [schedule_id] bigint
, [enabled] bit
);
/*******************************************************************************
Insert schedules that we had disabled that we need to go back in and re-enable.
*******************************************************************************/
INSERT INTO @JobsEnabled( [job_id], [schedule_id], [enabled] )
SELECT [job_id], [schedule_id], [enabled]
FROM [dbo].[JobsEnabledTracker];
/********************************
Holds the job id and schedule id
********************************/
DECLARE @jobid uniqueidentifier;
DECLARE @scheduleid bigint;
/***********************************
Holds the ID of the row in the loop
***********************************/
DECLARE @ID int= 0;
/**********************
Check if records exist
**********************/
IF EXISTS
(
SELECT [Id]
FROM @JobsEnabled
)
BEGIN
PRINT 'Loop mode, jobs found disabled.';
/**********
Begin loop
**********/
WHILE 1 = 1
BEGIN
/***************************************
Grab jobid, scheduleid, and id of rows.
***************************************/
SELECT @jobid =
(
SELECT TOP 1 [job_id]
FROM @JobsEnabled
ORDER BY [job_id]
);
SELECT @scheduleid =
(
SELECT TOP 1 [schedule_id]
FROM @JobsEnabled
ORDER BY [job_id]
);
SELECT @ID =
(
SELECT TOP 1 [Id]
FROM @JobsEnabled
ORDER BY [job_id]
);
/***************************************
Re-enable schedule associated to job
***************************************/
PRINT 'Enabling schedule_id: '+CAST(@scheduleid AS varchar(255))+' paired to job_id: '+CAST(@jobid AS varchar(255));
EXEC [sp_update_schedule] @schedule_id = @scheduleid, @enabled = 1;
/*********************
Removes row from loop
*********************/
DELETE FROM @JobsEnabled
WHERE [Id] = @ID;
/***********************
Set job back to enabled
***********************/
UPDATE [dbo].[JobsEnabledTracker]
SET [enabled] = 1
WHERE [job_id] = @jobid AND
[schedule_id] = @scheduleid;
/****************************
No more rows, stops deleting
****************************/
IF
(
SELECT COUNT(*)
FROM @JobsEnabled
) <= 0
BEGIN
BREAK;
END;
/********
End Loop
********/
END;
PRINT 'Exiting loop, enabling schedules paired to jobs complete.';
/**********
End elseif
**********/
END;
ELSE
BEGIN
PRINT 'All done';
END;
END;
ELSE
BEGIN
PRINT 'dbo.JobsEnabledTracker has no disabled jobs currently.';
END;
END;
ELSE
BEGIN
PRINT 'dbo.JobsEnabledTracker is NULL, you may need to run the first script to create and populate this table.';
END;