diff --git a/SqlAgent/v1/01_Devl/1_Database_Setup/CreateDB.sql b/SqlAgent/v1/01_Devl/1_Database_Setup/CreateDB.sql new file mode 100644 index 0000000..1c8be9f --- /dev/null +++ b/SqlAgent/v1/01_Devl/1_Database_Setup/CreateDB.sql @@ -0,0 +1,62 @@ +-- Create the database +CREATE DATABASE DevlDUTASJobSchedule; +GO + +USE DevlDUTASJobSchedule; +GO + +-- Create the main control table +CREATE TABLE dbo.JobControl ( + JobID INT IDENTITY(1,1) PRIMARY KEY, + JobName VARCHAR(50) NOT NULL UNIQUE, + ScheduledStartTime TIME NOT NULL, + SchedulerAction VARCHAR(10) NOT NULL CHECK (SchedulerAction IN ('CONTINUE', 'STOP')), + IsActive BIT DEFAULT 1, + CreatedDate DATETIME DEFAULT GETDATE() +); +GO + +-- Create job dependencies table +CREATE TABLE dbo.JobDependencies ( + DependencyID INT IDENTITY(1,1) PRIMARY KEY, + JobName VARCHAR(50) NOT NULL, + PredecessorJobName VARCHAR(50) NULL, + FOREIGN KEY (JobName) REFERENCES dbo.JobControl(JobName) +); +GO + +-- Create execution history table +CREATE TABLE dbo.JobExecutionHistory ( + ExecutionID INT IDENTITY(1,1) PRIMARY KEY, + JobName VARCHAR(50) NOT NULL, + RunDate DATE NOT NULL, + ScheduledStartTime TIME NOT NULL, + ActualStartTime DATETIME NULL, + ActualEndTime DATETIME NULL, + Status VARCHAR(20) DEFAULT 'Pending' CHECK (Status IN ('Pending', 'Running', 'Success', 'Failed', 'ForceComplete')), + ErrorMessage VARCHAR(MAX) NULL, + OverrideFlag BIT DEFAULT 0, + OverrideBy VARCHAR(100) NULL, + OverrideDate DATETIME NULL +); +GO + +-- Create holidays table +CREATE TABLE dbo.FederalHolidays ( + HolidayID INT IDENTITY(1,1) PRIMARY KEY, + HolidayDate DATE NOT NULL UNIQUE, + HolidayName VARCHAR(100) NOT NULL, + Year INT NOT NULL +); +GO + +-- Create Exit Code table for PowerShell Script +CREATE TABLE dbo.JobExitCodes +( + JobExecutionID INT IDENTITY(1,1) PRIMARY KEY, -- unique ID per execution + JobName NVARCHAR(128) NOT NULL, -- job name + RunDate DATE NOT NULL, -- date of execution + ExitCode INT NOT NULL, -- exit code from job + RecordedTime DATETIME NOT NULL DEFAULT GETDATE() -- timestamp of execution +); +GO diff --git a/SqlAgent/v1/01_Devl/1_Database_Setup/InsertHolidays.sql b/SqlAgent/v1/01_Devl/1_Database_Setup/InsertHolidays.sql new file mode 100644 index 0000000..2c0331a --- /dev/null +++ b/SqlAgent/v1/01_Devl/1_Database_Setup/InsertHolidays.sql @@ -0,0 +1,31 @@ +-- Clear existing data and insert 2025-2026 holidays (ignoring 0000000000 dates) +INSERT INTO dbo.FederalHolidays (HolidayDate, HolidayName, Year) VALUES +-- 2025 Holidays +('2025-01-01', 'New Years Day', 2025), +('2025-01-20', 'Martin Luther King Day', 2025), +('2025-02-17', 'Presidents Day', 2025), +('2025-05-26', 'Memorial Day', 2025), +('2025-06-19', 'Juneteenth Day', 2025), +('2025-07-04', 'Independence Day', 2025), +('2025-09-01', 'Labor Day', 2025), +('2025-10-13', 'Columbus Day', 2025), +('2025-11-11', 'Veterans Day', 2025), +('2025-11-27', 'Thanksgiving Day', 2025), +('2025-12-25', 'Christmas Day', 2025), + +-- 2026 Holidays +('2026-01-01', 'New Years Day', 2026), +('2026-01-19', 'Martin Luther King Day', 2026), +('2026-02-16', 'Presidents Day', 2026), +('2026-05-25', 'Memorial Day', 2026), +('2026-06-19', 'Juneteenth Day', 2026), +('2026-07-03', 'Independence Day', 2026), -- Note: July 3rd observed since July 4th is Saturday +('2026-09-07', 'Labor Day', 2026), +('2026-10-12', 'Columbus Day', 2026), +('2026-11-11', 'Veterans Day', 2026), +('2026-11-26', 'Thanksgiving Day', 2026), +('2026-12-25', 'Christmas Day', 2026); +GO + +-- Verify the data +SELECT * FROM dbo.FederalHolidays ORDER BY HolidayDate; \ No newline at end of file diff --git a/SqlAgent/v1/01_Devl/1_Database_Setup/InsertJobControl.sql b/SqlAgent/v1/01_Devl/1_Database_Setup/InsertJobControl.sql new file mode 100644 index 0000000..044d29b --- /dev/null +++ b/SqlAgent/v1/01_Devl/1_Database_Setup/InsertJobControl.sql @@ -0,0 +1,79 @@ +USE [DevlDUTASJobSchedule] +GO + +INSERT INTO [dbo].[JobControl] ( + [JobName], + [ScheduledStartTime], + [SchedulerAction], + [IsActive], + [CreatedDate], + [Frequency] +) +VALUES + ('DEVL_DAILY_DTSBX215', '4:00:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSBX305', '4:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSGSID0', '6:00:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_GSIRQ300', '6:05:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSRQ202', '6:10:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSGSID1', '6:15:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSBX202', '7:00:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSFT202', '8:00:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSBX432', '8:30:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSGACHD', '9:00:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSBX303', '10:00:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSGWAGE', '14:00:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSGCHKS', '14:05:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSESDAY', '14:05:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSGPAYT', '14:10:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSDX145', '16:05:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSBX629', '16:15:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSBX630', '16:30:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSFRAUD', '16:30:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSRACHD', '17:00:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSBXACH', '17:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSBXREG', '17:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSBX430', '17:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSBX626', '17:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSBX530', '17:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSBXREL', '17:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSBX450', '17:15:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSBX451', '17:15:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSPACHD', '18:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSPX148', '18:05:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSRQ325', '18:05:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSBX427', '18:07:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSPDAY1', '18:10:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSW4WGE', '18:15:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSGSID2', '18:15:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSGSID9', '18:15:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSMIN01', '18:20:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSMIN02', '18:20:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSRQ459', '19:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSBXPFL', '19:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DESBD427', '19:05:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSBX403', '20:00:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSBE405', '20:15:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSBX405', '20:15:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSRQ335', '21:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('DEVL_DAILY_DTSBX601', '21:25:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('DEVL_WEEKLY_DTSGSID0', '6:00:00', 'CONTINUE', 1, GETDATE(), 'WEEKLY'), + ('DEVL_WEEKLY_DTSGSID1', '6:15:00', 'CONTINUE', 1, GETDATE(), 'WEEKLY'), + ('DEVL_WEEKLY_DTSBX202', '7:00:00', 'CONTINUE', 1, GETDATE(), 'WEEKLY'), + ('DEVL_WEEKLY_DTSFT202', '8:00:00', 'STOP', 1, GETDATE(), 'WEEKLY'), + ('DEVL_WEEKLY_DTSBX470', '7:00:00', 'CONTINUE', 1, GETDATE(), 'WEEKLY'), + ('DEVL_WEEKLY_DTSBXREJ', '17:00:00', 'CONTINUE', 1, GETDATE(), 'WEEKLY'), + ('DEVL_WEEKLY_DTSPDAY7', '19:10:00', 'STOP', 1, GETDATE(), 'WEEKLY'), + ('DEVL_WEEKLY_DTSBX122', '19:14:00', 'CONTINUE', 1, GETDATE(), 'WEEKLY'), + ('DEVL_WEEKLY_DTSRQ511', '19:14:00', 'CONTINUE', 1, GETDATE(), 'WEEKLY'), + ('DEVL_WEEKLY_DTSRQ444', '7:00:00', 'CONTINUE', 1, GETDATE(), 'WEEKLY'), + ('DEVL_WEEKLY_DTSRQ126', '9:00:00', 'CONTINUE', 1, GETDATE(), 'WEEKLY'), + ('DEVL_MONTHLY_DTSRQ414', '18:15:00', 'STOP', 0, GETDATE(), 'MONTHLY'), + ('DEVL_MONTHLY_DTSPMON1', '19:15:00', 'STOP', 0, GETDATE(), 'MONTHLY'), + ('DEVL_MONTHLY_DTSCHGVB', '19:26:00', 'CONTINUE', 0, GETDATE(), 'MONTHLY'), + ('DEVL_MONTHLY_DTSCHGVR', '19:27:00', 'STOP', 0, GETDATE(), 'MONTHLY'), + ('DEVL_MONTHLY_DTSVBKUP', '19:26:00', 'CONTINUE', 0, GETDATE(), 'MONTHLY'), + ('DEVL_MONTHLY_DTSVRSTR', '19:30:00', 'STOP', 0, GETDATE(), 'MONTHLY'), + ('DEVL_MONTHLY_DTSRQ442', '19:37:00', 'CONTINUE', 0, GETDATE(), 'MONTHLY'), + ('DEVL_MONTHLY_DTSBX460', '19:35:00', 'CONTINUE', 0, GETDATE(), 'MONTHLY'), + ('DEVL_MONTHLY_DTSRQ513', '19:37:00', 'CONTINUE', 0, GETDATE(), 'MONTHLY'), + ('DEVL_MONTHLY_DTSCHGDC', '13:00:00', 'CONTINUE', 0, GETDATE(), 'MONTHLY'); \ No newline at end of file diff --git a/SqlAgent/v1/01_Devl/1_Database_Setup/InsertJobDependencies.sql b/SqlAgent/v1/01_Devl/1_Database_Setup/InsertJobDependencies.sql new file mode 100644 index 0000000..cee1845 --- /dev/null +++ b/SqlAgent/v1/01_Devl/1_Database_Setup/InsertJobDependencies.sql @@ -0,0 +1,80 @@ +USE [DevlDUTASJobSchedule] +GO + +TRUNCATE TABLE [dbo].[JobDependencies]; + +INSERT INTO [dbo].[JobDependencies] ( + [JobName], + [PredecessorJobName] +) +VALUES +('DEVL_DAILY_DTSGSID0','DEVL_DAILY_DTSBX305'), +('DEVL_DAILY_GSIRQ300','DEVL_DAILY_DTSBX305'), +('DEVL_DAILY_DTSRQ202','DEVL_DAILY_GSIRQ300'), +('DEVL_DAILY_DTSGSID1','DEVL_DAILY_GSIRQ300'), +('DEVL_DAILY_DTSBX202','DEVL_DAILY_GSIRQ300'), +('DEVL_DAILY_DTSFT202','DEVL_DAILY_GSIRQ300'), +('DEVL_DAILY_DTSBX432','DEVL_DAILY_GSIRQ300'), +('DEVL_DAILY_DTSGACHD','DEVL_DAILY_GSIRQ300'), +('DEVL_DAILY_DTSBX303','DEVL_DAILY_GSIRQ300'), +('DEVL_DAILY_DTSGWAGE','DEVL_DAILY_GSIRQ300'), +('DEVL_DAILY_DTSGCHKS','DEVL_DAILY_GSIRQ300'), +('DEVL_DAILY_DTSESDAY','DEVL_DAILY_GSIRQ300'), +('DEVL_DAILY_DTSGPAYT','DEVL_DAILY_GSIRQ300'), +('DEVL_DAILY_DTSDX145','DEVL_DAILY_GSIRQ300'), +('DEVL_DAILY_DTSBX629','DEVL_DAILY_GSIRQ300'), +('DEVL_DAILY_DTSBX630','DEVL_DAILY_DTSBX629'), +('DEVL_DAILY_DTSFRAUD','DEVL_DAILY_DTSBX629'), +('DEVL_DAILY_DTSRACHD','DEVL_DAILY_DTSFRAUD'), +('DEVL_DAILY_DTSBXACH','DEVL_DAILY_DTSFRAUD'), +('DEVL_DAILY_DTSBXREG','DEVL_DAILY_DTSFRAUD'), +('DEVL_DAILY_DTSBX430','DEVL_DAILY_DTSFRAUD'), +('DEVL_DAILY_DTSBX626','DEVL_DAILY_DTSFRAUD'), +('DEVL_DAILY_DTSBX530','DEVL_DAILY_DTSFRAUD'), +('DEVL_DAILY_DTSBXREL','DEVL_DAILY_DTSFRAUD'), +('DEVL_DAILY_DTSBX450','DEVL_DAILY_DTSBXACH'), +('DEVL_DAILY_DTSBX450','DEVL_DAILY_DTSBXREG'), +('DEVL_DAILY_DTSBX450','DEVL_DAILY_DTSBX430'), +('DEVL_DAILY_DTSBX450','DEVL_DAILY_DTSBX626'), +('DEVL_DAILY_DTSBX450','DEVL_DAILY_DTSBX530'), +('DEVL_DAILY_DTSBX450','DEVL_DAILY_DTSBXREL'), +('DEVL_DAILY_DTSBX451','DEVL_DAILY_DTSBXACH'), +('DEVL_DAILY_DTSBX451','DEVL_DAILY_DTSBXREG'), +('DEVL_DAILY_DTSBX451','DEVL_DAILY_DTSBX430'), +('DEVL_DAILY_DTSBX451','DEVL_DAILY_DTSBX626'), +('DEVL_DAILY_DTSBX451','DEVL_DAILY_DTSBX530'), +('DEVL_DAILY_DTSBX451','DEVL_DAILY_DTSBXREL'), +('DEVL_DAILY_DTSPACHD','DEVL_DAILY_DTSBX450'), +('DEVL_DAILY_DTSPACHD','DEVL_DAILY_DTSBX451'), +('DEVL_DAILY_DTSPX148','DEVL_DAILY_DTSPACHD'), +('DEVL_DAILY_DTSRQ325','DEVL_DAILY_DTSPACHD'), +('DEVL_DAILY_DTSBX427','DEVL_DAILY_DTSPX148'), +('DEVL_DAILY_DTSBX427','DEVL_DAILY_DTSRQ325'), +('DEVL_DAILY_DTSPDAY1','DEVL_DAILY_DTSBX427'), +('DEVL_DAILY_DTSW4WGE','DEVL_DAILY_DTSPDAY1'), +('DEVL_DAILY_DTSGSID2','DEVL_DAILY_DTSPDAY1'), +('DEVL_DAILY_DTSGSID9','DEVL_DAILY_DTSPDAY1'), +('DEVL_DAILY_DTSMIN01','DEVL_DAILY_DTSW4WGE'), +('DEVL_DAILY_DTSMIN01','DEVL_DAILY_DTSGSID2'), +('DEVL_DAILY_DTSMIN01','DEVL_DAILY_DTSGSID9'), +('DEVL_DAILY_DTSMIN02','DEVL_DAILY_DTSW4WGE'), +('DEVL_DAILY_DTSMIN02','DEVL_DAILY_DTSGSID2'), +('DEVL_DAILY_DTSMIN02','DEVL_DAILY_DTSGSID9'), +('DEVL_DAILY_DTSRQ459','DEVL_DAILY_DTSMIN01'), +('DEVL_DAILY_DTSRQ459','DEVL_DAILY_DTSMIN02'), +('DEVL_DAILY_DTSBXPFL','DEVL_DAILY_DTSRQ459'), +('DEVL_DAILY_DESBD427','DEVL_DAILY_DTSBXPFL'), +('DEVL_DAILY_DTSBX403','DEVL_DAILY_DTSBXPFL'), +('DEVL_DAILY_DTSBE405','DEVL_DAILY_DTSBXPFL'), +('DEVL_DAILY_DTSBX405','DEVL_DAILY_DTSBXPFL'), +('DEVL_DAILY_DTSRQ335','DEVL_DAILY_DTSBXPFL'), +('DEVL_DAILY_DTSBX601','DEVL_DAILY_DTSRQ335'), +('DEVL_WEEKLY_DTSBXREJ','DEVL_DAILY_DTSBXREL'), +('DEVL_WEEKLY_DTSBX122','DEVL_WEEKLY_DTSPDAY7'), +('DEVL_WEEKLY_DTSRQ511','DEVL_WEEKLY_DTSPDAY7'), +('DEVL_MONTHLY_DTSRQ414','DEVL_DAILY_DTSPDAY1'), +('DEVL_MONTHLY_DTSCHGVB','DEVL_MONTHLY_DTSPMON1'), +('DEVL_MONTHLY_DTSCHGVR','DEVL_MONTHLY_DTSCHGVB'), +('DEVL_MONTHLY_DTSVBKUP','DEVL_MONTHLY_DTSPMON1'), +('DEVL_MONTHLY_DTSVRSTR','DEVL_MONTHLY_DTSVBKUP'), +('DEVL_MONTHLY_DTSRQ442','DEVL_MONTHLY_DTSRQ513'); \ No newline at end of file diff --git a/SqlAgent/v1/01_Devl/2_Stored_Procedures/usp_CheckJobConditions.sql b/SqlAgent/v1/01_Devl/2_Stored_Procedures/usp_CheckJobConditions.sql new file mode 100644 index 0000000..6711343 Binary files /dev/null and b/SqlAgent/v1/01_Devl/2_Stored_Procedures/usp_CheckJobConditions.sql differ diff --git a/SqlAgent/v1/01_Devl/2_Stored_Procedures/usp_CheckJobConditions_Generic.sql b/SqlAgent/v1/01_Devl/2_Stored_Procedures/usp_CheckJobConditions_Generic.sql new file mode 100644 index 0000000..453879f Binary files /dev/null and b/SqlAgent/v1/01_Devl/2_Stored_Procedures/usp_CheckJobConditions_Generic.sql differ diff --git a/SqlAgent/v1/01_Devl/2_Stored_Procedures/usp_CreateSQLAgentJob.sql b/SqlAgent/v1/01_Devl/2_Stored_Procedures/usp_CreateSQLAgentJob.sql new file mode 100644 index 0000000..f6702a8 Binary files /dev/null and b/SqlAgent/v1/01_Devl/2_Stored_Procedures/usp_CreateSQLAgentJob.sql differ diff --git a/SqlAgent/v1/01_Devl/2_Stored_Procedures/usp_ForceComplete.sql b/SqlAgent/v1/01_Devl/2_Stored_Procedures/usp_ForceComplete.sql new file mode 100644 index 0000000..66a3d0d Binary files /dev/null and b/SqlAgent/v1/01_Devl/2_Stored_Procedures/usp_ForceComplete.sql differ diff --git a/SqlAgent/v1/01_Devl/2_Stored_Procedures/usp_ScheduleMonthlyJob.sql b/SqlAgent/v1/01_Devl/2_Stored_Procedures/usp_ScheduleMonthlyJob.sql new file mode 100644 index 0000000..37709c5 Binary files /dev/null and b/SqlAgent/v1/01_Devl/2_Stored_Procedures/usp_ScheduleMonthlyJob.sql differ diff --git a/SqlAgent/v1/01_Devl/2_Stored_Procedures/usp_TriggerMissedJobs.sql b/SqlAgent/v1/01_Devl/2_Stored_Procedures/usp_TriggerMissedJobs.sql new file mode 100644 index 0000000..0176424 Binary files /dev/null and b/SqlAgent/v1/01_Devl/2_Stored_Procedures/usp_TriggerMissedJobs.sql differ diff --git a/SqlAgent/v1/01_Devl/2_Stored_Procedures/usp_UpdateJobStatus_Generic.sql b/SqlAgent/v1/01_Devl/2_Stored_Procedures/usp_UpdateJobStatus_Generic.sql new file mode 100644 index 0000000..959016b Binary files /dev/null and b/SqlAgent/v1/01_Devl/2_Stored_Procedures/usp_UpdateJobStatus_Generic.sql differ diff --git a/SqlAgent/v1/01_Devl/3_Job_Maintenance/ActivateMonthlyJob.sql b/SqlAgent/v1/01_Devl/3_Job_Maintenance/ActivateMonthlyJob.sql new file mode 100644 index 0000000..087d3fe --- /dev/null +++ b/SqlAgent/v1/01_Devl/3_Job_Maintenance/ActivateMonthlyJob.sql @@ -0,0 +1,65 @@ +USE msdb; +GO + +-- Schedule DEVL Monthly Jobs for October 2025 +------------------------------------------------ +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='DEVL_MONTHLY_DTSRQ414', + @Env='DEVL', + @RunDate='2025-11-03', + @RunTime='18:15:00'; + +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='DEVL_MONTHLY_DTSPMON1', + @Env='DEVL', + @RunDate='2025-10-31', + @RunTime='19:15:00'; + +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='DEVL_MONTHLY_DTSCHGVB', + @Env='DEVL', + @RunDate='2025-10-31', + @RunTime='19:26:00'; + +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='DEVL_MONTHLY_DTSCHGVR', + @Env='DEVL', + @RunDate='2025-10-31', + @RunTime='19:27:00'; + +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='DEVL_MONTHLY_DTSVBKUP', + @Env='DEVL', + @RunDate='2025-10-31', + @RunTime='19:26:00'; + +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='DEVL_MONTHLY_DTSVRSTR', + @Env='DEVL', + @RunDate='2025-10-31', + @RunTime='19:30:00'; + +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='DEVL_MONTHLY_DTSRQ442', + @Env='DEVL', + @RunDate='2025-10-31', + @RunTime='19:37:00'; + +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='DEVL_MONTHLY_DTSBX460', + @Env='DEVL', + @RunDate='2025-10-31', + @RunTime='19:35:00'; + +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='DEVL_MONTHLY_DTSRQ513', + @Env='DEVL', + @RunDate='2025-10-31', + @RunTime='19:37:00'; + +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='DEVL_MONTHLY_DTSCHGDC', + @Env='DEVL', + @RunDate='2025-11-03', + @RunTime='13:00:00'; +GO diff --git a/SqlAgent/v1/01_Devl/3_Job_Maintenance/AddDailyJobs.sql b/SqlAgent/v1/01_Devl/3_Job_Maintenance/AddDailyJobs.sql new file mode 100644 index 0000000..88698c8 --- /dev/null +++ b/SqlAgent/v1/01_Devl/3_Job_Maintenance/AddDailyJobs.sql @@ -0,0 +1,279 @@ +USE [msdb] +GO + +-- Execute the stored procedure for each job +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSBX215', + @StartTimeHHMMSS = 40000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSBX305', + @StartTimeHHMMSS = 40000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSGSID0', + @StartTimeHHMMSS = 60000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_GSIRQ300', + @StartTimeHHMMSS = 60500, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSRQ202', + @StartTimeHHMMSS = 61000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSGSID1', + @StartTimeHHMMSS = 61500, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSBX202', + @StartTimeHHMMSS = 70000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSFT202', + @StartTimeHHMMSS = 80000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSBX432', + @StartTimeHHMMSS = 83000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSGACHD', + @StartTimeHHMMSS = 90000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSBX303', + @StartTimeHHMMSS = 100000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSGWAGE', + @StartTimeHHMMSS = 140000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSGCHKS', + @StartTimeHHMMSS = 140500, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSESDAY', + @StartTimeHHMMSS = 140500, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSGPAYT', + @StartTimeHHMMSS = 141000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSDX145', + @StartTimeHHMMSS = 160500, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSBX629', + @StartTimeHHMMSS = 161500, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSBX630', + @StartTimeHHMMSS = 163000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSFRAUD', + @StartTimeHHMMSS = 163000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSRACHD', + @StartTimeHHMMSS = 170000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSBXACH', + @StartTimeHHMMSS = 170000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSBXREG', + @StartTimeHHMMSS = 170000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSBX430', + @StartTimeHHMMSS = 170000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSBX626', + @StartTimeHHMMSS = 170000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSBX530', + @StartTimeHHMMSS = 170000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSBXREL', + @StartTimeHHMMSS = 170000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSBX450', + @StartTimeHHMMSS = 171500, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSBX451', + @StartTimeHHMMSS = 171500, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSPACHD', + @StartTimeHHMMSS = 180000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSPX148', + @StartTimeHHMMSS = 180500, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSRQ325', + @StartTimeHHMMSS = 180500, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSBX427', + @StartTimeHHMMSS = 180700, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSPDAY1', + @StartTimeHHMMSS = 181000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSW4WGE', + @StartTimeHHMMSS = 181500, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSGSID2', + @StartTimeHHMMSS = 181500, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSGSID9', + @StartTimeHHMMSS = 181500, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSMIN01', + @StartTimeHHMMSS = 182000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSMIN02', + @StartTimeHHMMSS = 182000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSRQ459', + @StartTimeHHMMSS = 190000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSBXPFL', + @StartTimeHHMMSS = 190000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DESBD427', + @StartTimeHHMMSS = 190500, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSBX403', + @StartTimeHHMMSS = 200000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSBE405', + @StartTimeHHMMSS = 201500, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSBX405', + @StartTimeHHMMSS = 201500, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSRQ335', + @StartTimeHHMMSS = 210000, + @Env = 'DEVL', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'DEVL_DAILY_DTSBX601', + @StartTimeHHMMSS = 212500, + @Env = 'DEVL', + @Frequency = 'DAILY'; \ No newline at end of file diff --git a/SqlAgent/v1/01_Devl/3_Job_Maintenance/AddMonthlyJobs.sql b/SqlAgent/v1/01_Devl/3_Job_Maintenance/AddMonthlyJobs.sql new file mode 100644 index 0000000..99d7f1a --- /dev/null +++ b/SqlAgent/v1/01_Devl/3_Job_Maintenance/AddMonthlyJobs.sql @@ -0,0 +1,76 @@ +USE [msdb]; +GO + +-- Note: Frequency here is used only for description (used for category): MONTHLY +-- By Default Job will be scheduled Mon to Fri at specified time. Please change the schedules as per the requirement. + +-- 1. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'DEVL_MONTHLY_DTSRQ414', + @StartTimeHHMMSS = 181500, + @Env = 'DEVL', + @Frequency = 'MONTHLY'; + +-- 2. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'DEVL_MONTHLY_DTSPMON1', + @StartTimeHHMMSS = 191500, + @Env = 'DEVL', + @Frequency = 'MONTHLY'; + +-- 3. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'DEVL_MONTHLY_DTSCHGVB', + @StartTimeHHMMSS = 192600, + @Env = 'DEVL', + @Frequency = 'MONTHLY'; + +-- 4. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'DEVL_MONTHLY_DTSCHGVR', + @StartTimeHHMMSS = 192700, + @Env = 'DEVL', + @Frequency = 'MONTHLY'; + +-- 5. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'DEVL_MONTHLY_DTSVBKUP', + @StartTimeHHMMSS = 192600, + @Env = 'DEVL', + @Frequency = 'MONTHLY'; + +-- 6. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'DEVL_MONTHLY_DTSVRSTR', + @StartTimeHHMMSS = 193000, + @Env = 'DEVL', + @Frequency = 'MONTHLY'; + +-- 7. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'DEVL_MONTHLY_DTSRQ442', + @StartTimeHHMMSS = 193700, + @Env = 'DEVL', + @Frequency = 'MONTHLY'; + +-- 8. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'DEVL_MONTHLY_DTSBX460', + @StartTimeHHMMSS = 193500, + @Env = 'DEVL', + @Frequency = 'MONTHLY'; + +-- 9. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'DEVL_MONTHLY_DTSRQ513', + @StartTimeHHMMSS = 193700, + @Env = 'DEVL', + @Frequency = 'MONTHLY'; + +-- 10. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'DEVL_MONTHLY_DTSCHGDC', + @StartTimeHHMMSS = 130000, + @Env = 'DEVL', + @Frequency = 'MONTHLY'; +GO diff --git a/SqlAgent/v1/01_Devl/3_Job_Maintenance/AddOneJob.sql b/SqlAgent/v1/01_Devl/3_Job_Maintenance/AddOneJob.sql new file mode 100644 index 0000000..a86e6b9 --- /dev/null +++ b/SqlAgent/v1/01_Devl/3_Job_Maintenance/AddOneJob.sql @@ -0,0 +1,9 @@ +USE [msdb] +GO + +-- Create a job that runs Monday-Friday at 4:00 AM +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'DEVL_DAILY_DTSBX215', + @StartTimeHHMMSS = 40000, -- For 4:00:00 AM (143000 for 2:30:00 PM) + @Env = 'DEVL', + @Frequency = 'DAILY'; \ No newline at end of file diff --git a/SqlAgent/v1/01_Devl/3_Job_Maintenance/AddWeeklyJobs.sql b/SqlAgent/v1/01_Devl/3_Job_Maintenance/AddWeeklyJobs.sql new file mode 100644 index 0000000..30a3338 --- /dev/null +++ b/SqlAgent/v1/01_Devl/3_Job_Maintenance/AddWeeklyJobs.sql @@ -0,0 +1,81 @@ +USE [msdb] +GO + +-- Note: Frequency here is used only for description (used for category): DAILY, WEEKLY, etc. +-- By Default Job will be scheduled to run on Mon to Fri at specified time. Please change the schedules as per the requirement. +-- 1. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'DEVL_WEEKLY_DTSGSID0', + @StartTimeHHMMSS = 60000, + @Env = 'DEVL', + @Frequency = 'WEEKLY'; + +-- 2. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'DEVL_WEEKLY_DTSGSID1', + @StartTimeHHMMSS = 61500, + @Env = 'DEVL', + @Frequency = 'WEEKLY'; + +-- 3. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'DEVL_WEEKLY_DTSBX202', + @StartTimeHHMMSS = 70000, + @Env = 'DEVL', + @Frequency = 'WEEKLY'; + +-- 4. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'DEVL_WEEKLY_DTSFT202', + @StartTimeHHMMSS = 80000, + @Env = 'DEVL', + @Frequency = 'WEEKLY'; + +-- 5. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'DEVL_WEEKLY_DTSBX470', + @StartTimeHHMMSS = 70000, + @Env = 'DEVL', + @Frequency = 'WEEKLY'; + +-- 6. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'DEVL_WEEKLY_DTSBXREJ', + @StartTimeHHMMSS = 170000, + @Env = 'DEVL', + @Frequency = 'WEEKLY'; + +-- 7. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'DEVL_WEEKLY_DTSPDAY7', + @StartTimeHHMMSS = 191000, + @Env = 'DEVL', + @Frequency = 'WEEKLY'; + +-- 8. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'DEVL_WEEKLY_DTSBX122', + @StartTimeHHMMSS = 191400, + @Env = 'DEVL', + @Frequency = 'WEEKLY'; + +-- 9. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'DEVL_WEEKLY_DTSRQ511', + @StartTimeHHMMSS = 191400, + @Env = 'DEVL', + @Frequency = 'WEEKLY'; + +-- 10. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'DEVL_WEEKLY_DTSRQ444', + @StartTimeHHMMSS = 70000, + @Env = 'DEVL', + @Frequency = 'WEEKLY'; + +-- 11. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'DEVL_WEEKLY_DTSRQ126', + @StartTimeHHMMSS = 90000, + @Env = 'DEVL', + @Frequency = 'WEEKLY'; \ No newline at end of file diff --git a/SqlAgent/v1/01_Devl/3_Job_Maintenance/DailyJobScheduleLookup.sql b/SqlAgent/v1/01_Devl/3_Job_Maintenance/DailyJobScheduleLookup.sql new file mode 100644 index 0000000..b893457 --- /dev/null +++ b/SqlAgent/v1/01_Devl/3_Job_Maintenance/DailyJobScheduleLookup.sql @@ -0,0 +1,86 @@ +/******************************************************************************************** + Section 1: Daily Job Schedule Lookup + -------------------------------------------------------------------------------------------- + Description: + Returns all SQL Agent jobs scheduled to run on a given date, along with their control + status (IsActive) and configured runtime from JobControl. + + Parameters: + @CheckDate - The date to check job schedules for. + + Notes: + • Uses MSDB’s internal schedule definitions (sysschedules, sysjobschedules). + • Supports One-time, Daily, Weekly, and Monthly schedule types. + • Can easily be adapted for DEVL / TEST / PROD by changing @DbName. + +********************************************************************************************/ +USE msdb; +GO + +DECLARE @CheckDate DATE = CAST(GETDATE() AS DATE); -- Change if needed +DECLARE @CheckWeekday INT = DATEPART(WEEKDAY, @CheckDate); +DECLARE @Env SYSNAME = 'DEVL'; -- Change for TEST or PROD +DECLARE @DbName SYSNAME; + +-- Map environment to the right control DB +SET @DbName = CASE @Env + WHEN 'DEVL' THEN 'DevlDUTASJobSchedule' + WHEN 'TEST' THEN 'TestDUTASJobSchedule' + WHEN 'PROD' THEN 'ProdDUTASJobSchedule' + END; + +DECLARE @Sql NVARCHAR(MAX); +SET @Sql = N' +SELECT + j.name AS SQLAgentJobName, + jc.JobName AS ControlJobName, + jc.ScheduledStartTime, + jc.IsActive, + s.name AS ScheduleName, + s.freq_type, + s.freq_interval, + s.freq_subday_type, + s.freq_subday_interval, + s.active_start_date, + CASE s.freq_type + WHEN 1 THEN ''One-time'' + WHEN 4 THEN ''Daily'' + WHEN 8 THEN ''Weekly'' + WHEN 16 THEN ''Monthly'' + ELSE ''Other'' + END AS FrequencyType, + CASE + WHEN s.freq_type = 1 + AND s.active_start_date = CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112)) + THEN 1 + WHEN s.freq_type = 4 + AND s.active_start_date <= CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112)) + THEN 1 + WHEN s.freq_type = 8 -- Weekly + AND (POWER(2, @CheckWeekdayParam - 1) & s.freq_interval) > 0 + THEN 1 + WHEN s.freq_type = 16 -- Monthly + AND DAY(@CheckDateParam) = s.freq_interval + THEN 1 + ELSE 0 + END AS IsScheduledToday +FROM msdb.dbo.sysjobs j +JOIN msdb.dbo.sysjobschedules js ON j.job_id = js.job_id +JOIN msdb.dbo.sysschedules s ON js.schedule_id = s.schedule_id +LEFT JOIN ' + QUOTENAME(@DbName) + '.dbo.JobControl jc ON jc.JobName = j.name +WHERE jc.IsActive = 1 + AND ( + (s.freq_type = 1 AND s.active_start_date = CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112))) -- One-time + OR (s.freq_type = 4 AND s.active_start_date <= CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112))) -- Daily + OR (s.freq_type = 8 AND (POWER(2, @CheckWeekdayParam - 1) & s.freq_interval) > 0) -- Weekly + OR (s.freq_type = 16 AND DAY(@CheckDateParam) = s.freq_interval) -- Monthly + ) +ORDER BY jc.ScheduledStartTime; +'; + +EXEC sp_executesql + @Sql, + N'@CheckDateParam DATE, @CheckWeekdayParam INT', + @CheckDateParam = @CheckDate, + @CheckWeekdayParam = @CheckWeekday; +GO diff --git a/SqlAgent/v1/01_Devl/3_Job_Maintenance/DeactivateMonthlyJob.sql b/SqlAgent/v1/01_Devl/3_Job_Maintenance/DeactivateMonthlyJob.sql new file mode 100644 index 0000000..3822af3 --- /dev/null +++ b/SqlAgent/v1/01_Devl/3_Job_Maintenance/DeactivateMonthlyJob.sql @@ -0,0 +1,12 @@ +USE DevlDUTASJobSchedule; +GO + +UPDATE dbo.JobControl +SET IsActive = 0 +WHERE Frequency = 'MONTHLY'; +GO + +-- Optional: Verify changes +SELECT JobName, Frequency, IsActive +FROM dbo.JobControl +WHERE Frequency = 'MONTHLY'; diff --git a/SqlAgent/v1/01_Devl/3_Job_Maintenance/DetachDeleteScheduleByName.sql b/SqlAgent/v1/01_Devl/3_Job_Maintenance/DetachDeleteScheduleByName.sql new file mode 100644 index 0000000..c337e5e --- /dev/null +++ b/SqlAgent/v1/01_Devl/3_Job_Maintenance/DetachDeleteScheduleByName.sql @@ -0,0 +1,13 @@ +-- If you know both the job name and schedule name +DECLARE @JobName NVARCHAR(100) = 'DEVL_MONTHLY_DTSCHGDC'; +DECLARE @ScheduleName NVARCHAR(200) = 'DEVL_MONTHLY_DTSCHGDC_MonthlySchedule'; +DECLARE @JobId UNIQUEIDENTIFIER; + +-- Get job ID +SELECT @JobId = job_id FROM msdb.dbo.sysjobs WHERE name = @JobName; + +-- Detach from specific job +EXEC msdb.dbo.sp_detach_schedule @job_id = @JobId, @schedule_name = @ScheduleName; + +-- Then delete +EXEC msdb.dbo.sp_delete_schedule @schedule_name = @ScheduleName; diff --git a/SqlAgent/v1/01_Devl/3_Job_Maintenance/ForceCompleteJob.sql b/SqlAgent/v1/01_Devl/3_Job_Maintenance/ForceCompleteJob.sql new file mode 100644 index 0000000..9add511 --- /dev/null +++ b/SqlAgent/v1/01_Devl/3_Job_Maintenance/ForceCompleteJob.sql @@ -0,0 +1,16 @@ +USE DevlDUTASJobSchedule; +GO + +-- 1. Check today's job status +SELECT JobName, Status, ErrorMessage +FROM dbo.JobExecutionHistory +WHERE RunDate = CAST(GETDATE() AS DATE) +AND JobName = 'DEVL_WEEKLY_DTSGSID1'; + +-- 2. Mark DTSBX305 as manually overridden +EXEC dbo.usp_ForceComplete 'DEVL_WEEKLY_DTSGSID1', 'Neeraj.Kumar'; + +-- 3. Verify the override +SELECT JobName, Status, OverrideBy, OverrideDate +FROM dbo.JobExecutionHistory +WHERE JobName = 'DEVL_WEEKLY_DTSGSID1' AND RunDate = CAST(GETDATE() AS DATE); \ No newline at end of file diff --git a/SqlAgent/v1/01_Devl/3_Job_Maintenance/JobInfo.sql b/SqlAgent/v1/01_Devl/3_Job_Maintenance/JobInfo.sql new file mode 100644 index 0000000..426e047 --- /dev/null +++ b/SqlAgent/v1/01_Devl/3_Job_Maintenance/JobInfo.sql @@ -0,0 +1,47 @@ +USE msdb; +GO + +PRINT '================================================================================'; +PRINT 'SECTION 1: JOB CONTROL INFORMATION'; +PRINT '================================================================================'; +GO + +-- View all active jobs +SELECT JobName, ScheduledStartTime, Frequency, IsActive +FROM DevlDUTASJobSchedule.dbo.JobControl +WHERE IsActive = 1 +ORDER BY Frequency, ScheduledStartTime; +GO + +-- View all inactive jobs +SELECT JobName, Frequency, ScheduledStartTime +FROM DevlDUTASJobSchedule.dbo.JobControl +WHERE IsActive = 0 +ORDER BY Frequency; +GO + +-- Find weekly/monthly jobs +SELECT JobName, Frequency, ScheduledStartTime +FROM DevlDUTASJobSchedule.dbo.JobControl +WHERE Frequency IN ('WEEKLY', 'MONTHLY') +ORDER BY Frequency, ScheduledStartTime; +GO + +PRINT '================================================================================'; +PRINT 'SECTION 2: JOB DEPENDENCIES'; +PRINT '================================================================================'; +GO + +-- Check dependencies for a job +DECLARE @Job NVARCHAR(100) = 'DEVL_MONTHLY_DTSCHGVR'; +SELECT JobName, PredecessorJobName +FROM DevlDUTASJobSchedule.dbo.JobDependencies +WHERE JobName = @Job; +GO + +-- Show dependency chain overview +SELECT d.JobName, d.PredecessorJobName, jc.ScheduledStartTime, jc.Frequency +FROM DevlDUTASJobSchedule.dbo.JobDependencies d +JOIN DevlDUTASJobSchedule.dbo.JobControl jc ON d.JobName = jc.JobName +ORDER BY jc.Frequency, jc.ScheduledStartTime; +GO diff --git a/SqlAgent/v1/01_Devl/3_Job_Maintenance/SQLAgentInfo.sql b/SqlAgent/v1/01_Devl/3_Job_Maintenance/SQLAgentInfo.sql new file mode 100644 index 0000000..d63458e --- /dev/null +++ b/SqlAgent/v1/01_Devl/3_Job_Maintenance/SQLAgentInfo.sql @@ -0,0 +1,42 @@ +USE msdb; +GO + +PRINT '================================================================================'; +PRINT 'SECTION 1: SQL AGENT JOB STATUS'; +PRINT '================================================================================'; +GO + +-- List all jobs in SQL Agent +SELECT name AS JobName, enabled, date_created, date_modified +FROM msdb.dbo.sysjobs +ORDER BY name; +GO + +-- Job schedule summary +SELECT j.name AS JobName, s.name AS ScheduleName, + s.enabled, s.freq_type, s.active_start_date, s.active_start_time +FROM msdb.dbo.sysjobs j +JOIN msdb.dbo.sysjobschedules js ON j.job_id = js.job_id +JOIN msdb.dbo.sysschedules s ON js.schedule_id = s.schedule_id +ORDER BY j.name; +GO + +-- Last job run details +SELECT j.name AS JobName, + h.run_status, + CASE h.run_status + WHEN 0 THEN 'Failed' + WHEN 1 THEN 'Succeeded' + WHEN 2 THEN 'Retry' + WHEN 3 THEN 'Canceled' + WHEN 4 THEN 'In Progress' + END AS StatusDescription, + msdb.dbo.agent_datetime(h.run_date, h.run_time) AS RunDateTime, + h.run_duration +FROM dbo.sysjobs j +LEFT JOIN dbo.sysjobhistory h ON j.job_id = h.job_id +WHERE h.instance_id IN ( + SELECT MAX(instance_id) FROM dbo.sysjobhistory GROUP BY job_id +) +ORDER BY RunDateTime DESC; +GO \ No newline at end of file diff --git a/SqlAgent/v1/01_Devl/3_Job_Maintenance/TodaysExecution.sql b/SqlAgent/v1/01_Devl/3_Job_Maintenance/TodaysExecution.sql new file mode 100644 index 0000000..3480fdd --- /dev/null +++ b/SqlAgent/v1/01_Devl/3_Job_Maintenance/TodaysExecution.sql @@ -0,0 +1,21 @@ +USE DevlDUTASJobSchedule; +GO + +DECLARE @Runday DATE = DATEADD(day, +0, CAST(GETDATE() AS DATE)); -- -1 for Yesterday + +SELECT + jeh.ExecutionID, + jeh.JobName, + jeh.RunDate, + jc.ScheduledStartTime, + jeh.ActualStartTime, + jeh.ActualEndTime, + jeh.Status, + jeh.ErrorMessage, + jeh.OverrideFlag, + jeh.OverrideBy +FROM dbo.JobExecutionHistory jeh +INNER JOIN dbo.JobControl jc + ON jeh.JobName = jc.JobName +WHERE jeh.RunDate = @Runday +ORDER BY jc.ScheduledStartTime, jeh.ActualStartTime; diff --git a/SqlAgent/v1/01_Devl/3_Job_Maintenance/TriggerMissedJob.sql b/SqlAgent/v1/01_Devl/3_Job_Maintenance/TriggerMissedJob.sql new file mode 100644 index 0000000..c2f3e90 --- /dev/null +++ b/SqlAgent/v1/01_Devl/3_Job_Maintenance/TriggerMissedJob.sql @@ -0,0 +1,9 @@ +USE [DevlDUTASJobSchedule] +GO + +-- 1. Preview missed jobs (safe, no run): + EXEC dbo.usp_TriggerMissedJobs @DryRun = 1; + +-- 2. Actually trigger missed jobs: + EXEC dbo.usp_TriggerMissedJobs @DryRun = 0; + diff --git a/SqlAgent/v1/01_Devl/4_PowerShell_Scripts/Backup-SQLAgentJobs.ps1 b/SqlAgent/v1/01_Devl/4_PowerShell_Scripts/Backup-SQLAgentJobs.ps1 new file mode 100644 index 0000000..f858d64 --- /dev/null +++ b/SqlAgent/v1/01_Devl/4_PowerShell_Scripts/Backup-SQLAgentJobs.ps1 @@ -0,0 +1,16 @@ +# Example PowerShell snippet +$Server = "DOES-DUTAS-SQL1" +$BackupPath = "\\DOES-RAINVM-DEV\E$\Neeraj\SqlAgent\Backup\" +$Timestamp = Get-Date -Format "yyyyMMdd_HHmmss" +$ZipFile = "$BackupPath\SQLAgentJobs_$Timestamp.zip" + +# Make backup folder if not exist +if (-not (Test-Path $BackupPath)) { New-Item -ItemType Directory -Path $BackupPath } + +# Export all jobs as SQL files +sqlcmd -S $Server -Q "EXEC msdb.dbo.sp_help_job" -o "$BackupPath\SQLAgentJobs_$Timestamp.txt" + +# Compress to zip +Compress-Archive -Path "$BackupPath\*" -DestinationPath $ZipFile -Force + +Write-Host "✅ Backup complete: $ZipFile" diff --git a/SqlAgent/v1/01_Devl/4_PowerShell_Scripts/Execute-RemoteJob.ps1 b/SqlAgent/v1/01_Devl/4_PowerShell_Scripts/Execute-RemoteJob.ps1 new file mode 100644 index 0000000..eace0e0 --- /dev/null +++ b/SqlAgent/v1/01_Devl/4_PowerShell_Scripts/Execute-RemoteJob.ps1 @@ -0,0 +1,102 @@ +param( + [Parameter(Mandatory = $true)] + [string]$JobName, + + [Parameter(Mandatory = $true)] + [ValidateSet('DEVL', 'TEST', 'PROD')] + [string]$Env +) + +try { + Write-Host "Starting job $JobName in environment $Env at $(Get-Date)" + + # ------------------------------------------------------------ + # Extract JCL from JobName (ENV_FREQUENCY_JOB pattern) + # ------------------------------------------------------------ + $JCL = $JobName -replace '^[A-Z]+_[A-Z]+_', '' + Write-Host "Extracted JCL: $JCL from JobName: $JobName" -ForegroundColor Yellow + + # ------------------------------------------------------------ + # Environment-specific configuration + # ------------------------------------------------------------ + switch ($Env.ToUpper()) { + 'DEVL' { + $ComputerName = '10.57.110.120' + $DatabaseName = 'DevlDUTASJobSchedule' + } + 'TEST' { + $ComputerName = '10.57.110.141' + $DatabaseName = 'TestDUTASJobSchedule' + } + 'PROD' { + $ComputerName = '10.57.111.120' + $DatabaseName = 'ProdDUTASJobSchedule' + } + default { + throw "Invalid environment specified: $Env" + } + } + + # ------------------------------------------------------------ + # Remote credentials + # (recommend moving credentials to secure vault for production) + # ------------------------------------------------------------ + $username = "DUTASSQLAdminP@does.dcgov.priv" + $password = "4ho@3Pr&Xof8" | ConvertTo-SecureString -AsPlainText -Force + $credential = New-Object System.Management.Automation.PSCredential($username, $password) + + # ------------------------------------------------------------ + # Execute job remotely using the extracted JCL + # ------------------------------------------------------------ + Write-Host "Connecting to remote server $ComputerName ..." + $exitCode = Invoke-Command -ComputerName $ComputerName ` + -Credential $credential ` + -Authentication CredSSP ` + -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck) ` + -ArgumentList $JobName, $JCL, $Env ` + -ScriptBlock { + param($JobName, $JCL, $Env) + + Write-Host "Remote execution - JobName: $JobName, JCL: $JCL, Env: $Env" + + $process = Start-Process -FilePath "powershell.exe" ` + -ArgumentList "-ExecutionPolicy Bypass -File `"E:\PSScript\RCSubmit-Job.ps1`" -JobName `"$JCL`" -Env `"$Env`"" ` + -NoNewWindow -Wait -PassThru + return $process.ExitCode + } + + if ($exitCode -eq 0) { + Write-Host "Job $JobName (JCL: $JCL) completed successfully at $(Get-Date)" -ForegroundColor Green + } else { + Write-Error "Job $JobName (JCL: $JCL) failed with exit code: $exitCode" + } +} +catch { + Write-Error "Job $JobName failed with error: $($_.Exception.Message)" + $exitCode = 1 +} +finally { + # ------------------------------------------------------------ + # Log exit code to the appropriate database + # ------------------------------------------------------------ + try { + $connectionString = "Server=localhost;Database=$DatabaseName;Trusted_Connection=true;" + $connection = New-Object System.Data.SqlClient.SqlConnection($connectionString) + $connection.Open() + + $command = $connection.CreateCommand() + $command.CommandText = @" + INSERT INTO dbo.JobExitCodes (JobName, RunDate, ExitCode, RecordedTime) + VALUES ('$JobName', CAST(GETDATE() AS DATE), $exitCode, GETDATE()); +"@ + $command.ExecuteNonQuery() + $connection.Close() + Write-Host "Exit code $exitCode logged to database $DatabaseName for job $JobName" + } + catch { + $errorMsg = $_.Exception.Message + Write-Host "Failed to log exit code to database $DatabaseName`: $errorMsg" + } +} + +exit $exitCode \ No newline at end of file diff --git a/SqlAgent/v1/01_Devl/4_PowerShell_Scripts/RCSubmit-Job.ps1 b/SqlAgent/v1/01_Devl/4_PowerShell_Scripts/RCSubmit-Job.ps1 new file mode 100644 index 0000000..3fb0c57 --- /dev/null +++ b/SqlAgent/v1/01_Devl/4_PowerShell_Scripts/RCSubmit-Job.ps1 @@ -0,0 +1,108 @@ +param( + [string]$JobName, + [string]$Env +) + +# --- Parameter Validation --- +if (-not $JobName) { + Write-Host "JobName parameter is required" -ForegroundColor Red + exit 1 +} +if (-not $Env) { + Write-Host "Environment (Env) parameter is required" -ForegroundColor Red + exit 1 +} + +# --- Execute Job --- +Write-Host "Submitting job: $JobName in environment: $Env" -ForegroundColor Cyan +$output = & "$env:rcbin\submit.exe" -DSN="DOESTAX.$Env.JOBS.BATCH.LIB($JobName)" +$exitCode = [int]$LASTEXITCODE +$isSuccess = 0 + +# --- Parse SYSLOG Path --- +$syslogPath = $null +$syslogFolder = "Not found" +$content = @() +$summary = @() + +try { + $syslogPath = $output | Select-String -Pattern "SYSLOG=\[(.*)\]" | ForEach-Object { $_.Matches.Groups[1].Value } + + if ($syslogPath -and (Test-Path $syslogPath)) { + $syslogFolder = Split-Path $syslogPath -Parent + $content = Get-Content $syslogPath -ErrorAction Stop + $summary = $content | Select-String -Pattern "%Job Overall Stats:" -Context 0,7 | ForEach-Object { + $_.Context.PostContext | Select-Object -Skip 1 -First 5 + } + } else { + Write-Host "SYSLOG path not found or inaccessible: $syslogPath" -ForegroundColor Yellow + $summary = @("SYSLOG file not found in output", "Raw output:", $output -join "`n") + } +} +catch { + Write-Host "Error processing SYSLOG: $($_.Exception.Message)" -ForegroundColor Yellow + $summary = @("Error reading SYSLOG: $($_.Exception.Message)", "Raw output:", $output -join "`n") +} + +# --- Evaluate Return Codes --- +$successConditions = @( + { $JobName -eq "GSIRQ300" -and $exitCode -eq 50 }, + { $JobName -eq "DTSGWAGE" -and $exitCode -eq 8 }, + { $JobName -eq "DTSGCHKS" -and $exitCode -eq 8 }, + { $JobName -eq "DTSGPAYT" -and $exitCode -eq 8 }, + { $JobName -eq "DTSBXACH" -and $exitCode -eq 2 }, + { $JobName -eq "DTSBXREL" -and $exitCode -eq 2 }, + { $JobName -eq "DTSMIN02" -and $exitCode -eq 4 }, + { $JobName -eq "DTSBE405" -and $exitCode -eq 910 }, + { $JobName -eq "DTSBXREJ" -and $exitCode -eq 4 }, + { $JobName -eq "DTSRQ444" -and $exitCode -eq 4 }, + { $exitCode -eq 0 } +) + +if ($successConditions | Where-Object { & $_ }) { + Write-Host "Job $JobName succeeded with code $exitCode" -ForegroundColor Green + $isSuccess = 0 +} else { + Write-Host "Job $JobName failed with code $exitCode" -ForegroundColor Red + $isSuccess = 1 + # Only use error if we don't have a proper summary + if ($summary.Count -eq 0) { + $summary = @($Error[0]) + } +} + +# --- Email Notification --- +$smtpServer = "smtp4.dc.gov" +$fromEmail = "Dutas@dc.gov" +$toEmail = "neerajk@innovaconsulting.com" +$ccEmail = @("neerajk@innovaconsulting.com") + +$emailBody = @" +
+DUTAS Batch Job: $JobName Execution Report
+==========================================
+$($summary -join "`n")
+==========================================
+
+Return Code: $exitCode
+Status: $(if ($isSuccess -eq 0) { "SUCCESS" } else { "FAILED" })
+JOBLOG Path: $syslogFolder
+
+"@ + +try { + Send-MailMessage -SmtpServer $smtpServer -Port 25 ` + -From $fromEmail -To $toEmail -Cc $ccEmail ` + -Subject "DUTAS-[$Env] Job Status: $JobName - $(if ($isSuccess -eq 0) { 'SUCCESS' } else { 'FAILED' })" ` + -Body $emailBody -BodyAsHtml + Write-Host "Email sent successfully to $toEmail" -ForegroundColor Cyan +} +catch { + Write-Host "Failed to send email: $($_.Exception.Message)" -ForegroundColor Yellow +} + +Write-Host "`n---------------------------------------------" +Write-Host "Job: $JobName | ExitCode: $exitCode | Status: $(if ($isSuccess -eq 0) { 'SUCCESS' } else { 'FAILED' })" +Write-Host "---------------------------------------------`n" + +exit $isSuccess \ No newline at end of file diff --git a/SqlAgent/v1/01_Devl/5_Deployment/Deploy_DEVL_to_TEST.sql b/SqlAgent/v1/01_Devl/5_Deployment/Deploy_DEVL_to_TEST.sql new file mode 100644 index 0000000..2cd3fa5 --- /dev/null +++ b/SqlAgent/v1/01_Devl/5_Deployment/Deploy_DEVL_to_TEST.sql @@ -0,0 +1,15 @@ +DECLARE @SrcDB NVARCHAR(128) = 'DevlDUTASJobSchedule'; +DECLARE @NewDB NVARCHAR(128) = 'TestDUTASJobSchedule'; +DECLARE @Backup NVARCHAR(260) = '\\DOES-RAINVM-DEV\E$\Neeraj\SqlAgent\Backup\' + @SrcDB + '.bak'; + +-- Backup Source +BACKUP DATABASE @SrcDB TO DISK = @Backup WITH INIT, COMPRESSION; + +-- Restore as Target +DECLARE @SQL NVARCHAR(MAX) = ' +RESTORE DATABASE [' + @NewDB + '] +FROM DISK = N''' + @Backup + ''' +WITH MOVE N''' + @SrcDB + ''' TO N''\\DOES-RAINVM-DEV\E$\SQLData\' + @NewDB + '.mdf'', + MOVE N''' + @SrcDB + '_log'' TO N''\\DOES-RAINVM-DEV\E$\SQLLogs\' + @NewDB + '_log.ldf'', + REPLACE;'; +EXEC(@SQL); diff --git a/SqlAgent/v1/01_Devl/5_Deployment/Deploy_TEST_to_PROD.sql b/SqlAgent/v1/01_Devl/5_Deployment/Deploy_TEST_to_PROD.sql new file mode 100644 index 0000000..3cd8de6 --- /dev/null +++ b/SqlAgent/v1/01_Devl/5_Deployment/Deploy_TEST_to_PROD.sql @@ -0,0 +1,15 @@ +DECLARE @SrcDB NVARCHAR(128) = 'TestDUTASJobSchedule'; +DECLARE @NewDB NVARCHAR(128) = 'ProdDUTASJobSchedule'; +DECLARE @Backup NVARCHAR(260) = '\\DOES-RAINVM-DEV\E$\Neeraj\SqlAgent\Backup\' + @SrcDB + '.bak'; + +-- Backup Source +BACKUP DATABASE @SrcDB TO DISK = @Backup WITH INIT, COMPRESSION; + +-- Restore as Target +DECLARE @SQL NVARCHAR(MAX) = ' +RESTORE DATABASE [' + @NewDB + '] +FROM DISK = N''' + @Backup + ''' +WITH MOVE N''' + @SrcDB + ''' TO N''\\DOES-RAINVM-DEV\E$\SQLData\' + @NewDB + '.mdf'', + MOVE N''' + @SrcDB + '_log'' TO N''\\DOES-RAINVM-DEV\E$\SQLLogs\' + @NewDB + '_log.ldf'', + REPLACE;'; +EXEC(@SQL); diff --git a/SqlAgent/v1/02_Test/1_Database_Setup/CreateDB.sql b/SqlAgent/v1/02_Test/1_Database_Setup/CreateDB.sql new file mode 100644 index 0000000..5935a4d --- /dev/null +++ b/SqlAgent/v1/02_Test/1_Database_Setup/CreateDB.sql @@ -0,0 +1,63 @@ +-- Create the database +CREATE DATABASE TestDUTASJobSchedule; +GO + +USE TestDUTASJobSchedule; +GO + +-- Create the main control table +CREATE TABLE dbo.JobControl ( + JobID INT IDENTITY(1,1) PRIMARY KEY, + JobName VARCHAR(50) NOT NULL UNIQUE, + ScheduledStartTime TIME NOT NULL, + SchedulerAction VARCHAR(10) NOT NULL CHECK (SchedulerAction IN ('CONTINUE', 'STOP')), + IsActive BIT DEFAULT 1, + CreatedDate DATETIME DEFAULT GETDATE(), + Frequency VARCHAR(20) NOT NULL +); +GO + +-- Create job dependencies table +CREATE TABLE dbo.JobDependencies ( + DependencyID INT IDENTITY(1,1) PRIMARY KEY, + JobName VARCHAR(50) NOT NULL, + PredecessorJobName VARCHAR(50) NULL, + FOREIGN KEY (JobName) REFERENCES dbo.JobControl(JobName) +); +GO + +-- Create execution history table +CREATE TABLE dbo.JobExecutionHistory ( + ExecutionID INT IDENTITY(1,1) PRIMARY KEY, + JobName VARCHAR(50) NOT NULL, + RunDate DATE NOT NULL, + ScheduledStartTime TIME NOT NULL, + ActualStartTime DATETIME NULL, + ActualEndTime DATETIME NULL, + Status VARCHAR(20) DEFAULT 'Pending' CHECK (Status IN ('Pending', 'Running', 'Success', 'Failed', 'ForceComplete')), + ErrorMessage VARCHAR(MAX) NULL, + OverrideFlag BIT DEFAULT 0, + OverrideBy VARCHAR(100) NULL, + OverrideDate DATETIME NULL +); +GO + +-- Create holidays table +CREATE TABLE dbo.FederalHolidays ( + HolidayID INT IDENTITY(1,1) PRIMARY KEY, + HolidayDate DATE NOT NULL UNIQUE, + HolidayName VARCHAR(100) NOT NULL, + Year INT NOT NULL +); +GO + +-- Create Exit Code table for PowerShell Script +CREATE TABLE dbo.JobExitCodes +( + JobExecutionID INT IDENTITY(1,1) PRIMARY KEY, -- unique ID per execution + JobName NVARCHAR(128) NOT NULL, -- job name + RunDate DATE NOT NULL, -- date of execution + ExitCode INT NOT NULL, -- exit code from job + RecordedTime DATETIME NOT NULL DEFAULT GETDATE() -- timestamp of execution +); +GO diff --git a/SqlAgent/v1/02_Test/1_Database_Setup/InsertHolidays.sql b/SqlAgent/v1/02_Test/1_Database_Setup/InsertHolidays.sql new file mode 100644 index 0000000..cca84ee --- /dev/null +++ b/SqlAgent/v1/02_Test/1_Database_Setup/InsertHolidays.sql @@ -0,0 +1,34 @@ +USE TestDUTASJobSchedule; +GO + +-- Clear existing data and insert 2025-2026 holidays (ignoring 0000000000 dates) +INSERT INTO dbo.FederalHolidays (HolidayDate, HolidayName, Year) VALUES +-- 2025 Holidays +('2025-01-01', 'New Years Day', 2025), +('2025-01-20', 'Martin Luther King Day', 2025), +('2025-02-17', 'Presidents Day', 2025), +('2025-05-26', 'Memorial Day', 2025), +('2025-06-19', 'Juneteenth Day', 2025), +('2025-07-04', 'Independence Day', 2025), +('2025-09-01', 'Labor Day', 2025), +('2025-10-13', 'Columbus Day', 2025), +('2025-11-11', 'Veterans Day', 2025), +('2025-11-27', 'Thanksgiving Day', 2025), +('2025-12-25', 'Christmas Day', 2025), + +-- 2026 Holidays +('2026-01-01', 'New Years Day', 2026), +('2026-01-19', 'Martin Luther King Day', 2026), +('2026-02-16', 'Presidents Day', 2026), +('2026-05-25', 'Memorial Day', 2026), +('2026-06-19', 'Juneteenth Day', 2026), +('2026-07-03', 'Independence Day', 2026), -- Note: July 3rd observed since July 4th is Saturday +('2026-09-07', 'Labor Day', 2026), +('2026-10-12', 'Columbus Day', 2026), +('2026-11-11', 'Veterans Day', 2026), +('2026-11-26', 'Thanksgiving Day', 2026), +('2026-12-25', 'Christmas Day', 2026); +GO + +-- Verify the data +SELECT * FROM dbo.FederalHolidays ORDER BY HolidayDate; \ No newline at end of file diff --git a/SqlAgent/v1/02_Test/1_Database_Setup/InsertJobControl.sql b/SqlAgent/v1/02_Test/1_Database_Setup/InsertJobControl.sql new file mode 100644 index 0000000..7207e7c --- /dev/null +++ b/SqlAgent/v1/02_Test/1_Database_Setup/InsertJobControl.sql @@ -0,0 +1,79 @@ +USE [TestDUTASJobSchedule] +GO + +INSERT INTO [dbo].[JobControl] ( + [JobName], + [ScheduledStartTime], + [SchedulerAction], + [IsActive], + [CreatedDate], + [Frequency] +) +VALUES + ('TEST_DAILY_DTSBX215', '4:00:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSBX305', '4:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSGSID0', '6:00:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_GSIRQ300', '6:05:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSRQ202', '6:10:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSGSID1', '6:15:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSBX202', '7:00:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSFT202', '8:00:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSBX432', '8:30:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSGACHD', '9:00:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSBX303', '10:00:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSGWAGE', '14:00:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSGCHKS', '14:05:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSESDAY', '14:05:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSGPAYT', '14:10:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSDX145', '16:05:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSBX629', '16:15:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSBX630', '16:30:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSFRAUD', '16:30:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSRACHD', '17:00:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSBXACH', '17:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSBXREG', '17:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSBX430', '17:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSBX626', '17:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSBX530', '17:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSBXREL', '17:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSBX450', '17:15:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSBX451', '17:15:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSPACHD', '18:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSPX148', '18:05:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSRQ325', '18:05:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSBX427', '18:07:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSPDAY1', '18:10:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSW4WGE', '18:15:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSGSID2', '18:15:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSGSID9', '18:15:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSMIN01', '18:20:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSMIN02', '18:20:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSRQ459', '19:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSBXPFL', '19:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DESBD427', '19:05:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSBX403', '20:00:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSBE405', '20:15:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSBX405', '20:15:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSRQ335', '21:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('TEST_DAILY_DTSBX601', '21:25:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('TEST_WEEKLY_DTSGSID0', '6:00:00', 'CONTINUE', 1, GETDATE(), 'WEEKLY'), + ('TEST_WEEKLY_DTSGSID1', '6:15:00', 'CONTINUE', 1, GETDATE(), 'WEEKLY'), + ('TEST_WEEKLY_DTSBX202', '7:00:00', 'CONTINUE', 1, GETDATE(), 'WEEKLY'), + ('TEST_WEEKLY_DTSFT202', '8:00:00', 'STOP', 1, GETDATE(), 'WEEKLY'), + ('TEST_WEEKLY_DTSBX470', '7:00:00', 'CONTINUE', 1, GETDATE(), 'WEEKLY'), + ('TEST_WEEKLY_DTSBXREJ', '17:00:00', 'CONTINUE', 1, GETDATE(), 'WEEKLY'), + ('TEST_WEEKLY_DTSPDAY7', '19:10:00', 'STOP', 1, GETDATE(), 'WEEKLY'), + ('TEST_WEEKLY_DTSBX122', '19:14:00', 'CONTINUE', 1, GETDATE(), 'WEEKLY'), + ('TEST_WEEKLY_DTSRQ511', '19:14:00', 'CONTINUE', 1, GETDATE(), 'WEEKLY'), + ('TEST_WEEKLY_DTSRQ444', '7:00:00', 'CONTINUE', 1, GETDATE(), 'WEEKLY'), + ('TEST_WEEKLY_DTSRQ126', '9:00:00', 'CONTINUE', 1, GETDATE(), 'WEEKLY'), + ('TEST_MONTHLY_DTSRQ414', '18:15:00', 'STOP', 0, GETDATE(), 'MONTHLY'), + ('TEST_MONTHLY_DTSPMON1', '19:15:00', 'STOP', 0, GETDATE(), 'MONTHLY'), + ('TEST_MONTHLY_DTSCHGVB', '19:26:00', 'CONTINUE', 0, GETDATE(), 'MONTHLY'), + ('TEST_MONTHLY_DTSCHGVR', '19:27:00', 'STOP', 0, GETDATE(), 'MONTHLY'), + ('TEST_MONTHLY_DTSVBKUP', '19:26:00', 'CONTINUE', 0, GETDATE(), 'MONTHLY'), + ('TEST_MONTHLY_DTSVRSTR', '19:30:00', 'STOP', 0, GETDATE(), 'MONTHLY'), + ('TEST_MONTHLY_DTSRQ442', '19:37:00', 'CONTINUE', 0, GETDATE(), 'MONTHLY'), + ('TEST_MONTHLY_DTSBX460', '19:35:00', 'CONTINUE', 0, GETDATE(), 'MONTHLY'), + ('TEST_MONTHLY_DTSRQ513', '19:37:00', 'CONTINUE', 0, GETDATE(), 'MONTHLY'), + ('TEST_MONTHLY_DTSCHGDC', '13:00:00', 'CONTINUE', 0, GETDATE(), 'MONTHLY'); \ No newline at end of file diff --git a/SqlAgent/v1/02_Test/1_Database_Setup/InsertJobDependencies.sql b/SqlAgent/v1/02_Test/1_Database_Setup/InsertJobDependencies.sql new file mode 100644 index 0000000..d59085b --- /dev/null +++ b/SqlAgent/v1/02_Test/1_Database_Setup/InsertJobDependencies.sql @@ -0,0 +1,80 @@ +USE [TestDUTASJobSchedule] +GO + +TRUNCATE TABLE [dbo].[JobDependencies]; + +INSERT INTO [dbo].[JobDependencies] ( + [JobName], + [PredecessorJobName] +) +VALUES +('TEST_DAILY_DTSGSID0','TEST_DAILY_DTSBX305'), +('TEST_DAILY_GSIRQ300','TEST_DAILY_DTSBX305'), +('TEST_DAILY_DTSRQ202','TEST_DAILY_GSIRQ300'), +('TEST_DAILY_DTSGSID1','TEST_DAILY_GSIRQ300'), +('TEST_DAILY_DTSBX202','TEST_DAILY_GSIRQ300'), +('TEST_DAILY_DTSFT202','TEST_DAILY_GSIRQ300'), +('TEST_DAILY_DTSBX432','TEST_DAILY_GSIRQ300'), +('TEST_DAILY_DTSGACHD','TEST_DAILY_GSIRQ300'), +('TEST_DAILY_DTSBX303','TEST_DAILY_GSIRQ300'), +('TEST_DAILY_DTSGWAGE','TEST_DAILY_GSIRQ300'), +('TEST_DAILY_DTSGCHKS','TEST_DAILY_GSIRQ300'), +('TEST_DAILY_DTSESDAY','TEST_DAILY_GSIRQ300'), +('TEST_DAILY_DTSGPAYT','TEST_DAILY_GSIRQ300'), +('TEST_DAILY_DTSDX145','TEST_DAILY_GSIRQ300'), +('TEST_DAILY_DTSBX629','TEST_DAILY_GSIRQ300'), +('TEST_DAILY_DTSBX630','TEST_DAILY_DTSBX629'), +('TEST_DAILY_DTSFRAUD','TEST_DAILY_DTSBX629'), +('TEST_DAILY_DTSRACHD','TEST_DAILY_DTSFRAUD'), +('TEST_DAILY_DTSBXACH','TEST_DAILY_DTSFRAUD'), +('TEST_DAILY_DTSBXREG','TEST_DAILY_DTSFRAUD'), +('TEST_DAILY_DTSBX430','TEST_DAILY_DTSFRAUD'), +('TEST_DAILY_DTSBX626','TEST_DAILY_DTSFRAUD'), +('TEST_DAILY_DTSBX530','TEST_DAILY_DTSFRAUD'), +('TEST_DAILY_DTSBXREL','TEST_DAILY_DTSFRAUD'), +('TEST_DAILY_DTSBX450','TEST_DAILY_DTSBXACH'), +('TEST_DAILY_DTSBX450','TEST_DAILY_DTSBXREG'), +('TEST_DAILY_DTSBX450','TEST_DAILY_DTSBX430'), +('TEST_DAILY_DTSBX450','TEST_DAILY_DTSBX626'), +('TEST_DAILY_DTSBX450','TEST_DAILY_DTSBX530'), +('TEST_DAILY_DTSBX450','TEST_DAILY_DTSBXREL'), +('TEST_DAILY_DTSBX451','TEST_DAILY_DTSBXACH'), +('TEST_DAILY_DTSBX451','TEST_DAILY_DTSBXREG'), +('TEST_DAILY_DTSBX451','TEST_DAILY_DTSBX430'), +('TEST_DAILY_DTSBX451','TEST_DAILY_DTSBX626'), +('TEST_DAILY_DTSBX451','TEST_DAILY_DTSBX530'), +('TEST_DAILY_DTSBX451','TEST_DAILY_DTSBXREL'), +('TEST_DAILY_DTSPACHD','TEST_DAILY_DTSBX450'), +('TEST_DAILY_DTSPACHD','TEST_DAILY_DTSBX451'), +('TEST_DAILY_DTSPX148','TEST_DAILY_DTSPACHD'), +('TEST_DAILY_DTSRQ325','TEST_DAILY_DTSPACHD'), +('TEST_DAILY_DTSBX427','TEST_DAILY_DTSPX148'), +('TEST_DAILY_DTSBX427','TEST_DAILY_DTSRQ325'), +('TEST_DAILY_DTSPDAY1','TEST_DAILY_DTSBX427'), +('TEST_DAILY_DTSW4WGE','TEST_DAILY_DTSPDAY1'), +('TEST_DAILY_DTSGSID2','TEST_DAILY_DTSPDAY1'), +('TEST_DAILY_DTSGSID9','TEST_DAILY_DTSPDAY1'), +('TEST_DAILY_DTSMIN01','TEST_DAILY_DTSW4WGE'), +('TEST_DAILY_DTSMIN01','TEST_DAILY_DTSGSID2'), +('TEST_DAILY_DTSMIN01','TEST_DAILY_DTSGSID9'), +('TEST_DAILY_DTSMIN02','TEST_DAILY_DTSW4WGE'), +('TEST_DAILY_DTSMIN02','TEST_DAILY_DTSGSID2'), +('TEST_DAILY_DTSMIN02','TEST_DAILY_DTSGSID9'), +('TEST_DAILY_DTSRQ459','TEST_DAILY_DTSMIN01'), +('TEST_DAILY_DTSRQ459','TEST_DAILY_DTSMIN02'), +('TEST_DAILY_DTSBXPFL','TEST_DAILY_DTSRQ459'), +('TEST_DAILY_DESBD427','TEST_DAILY_DTSBXPFL'), +('TEST_DAILY_DTSBX403','TEST_DAILY_DTSBXPFL'), +('TEST_DAILY_DTSBE405','TEST_DAILY_DTSBXPFL'), +('TEST_DAILY_DTSBX405','TEST_DAILY_DTSBXPFL'), +('TEST_DAILY_DTSRQ335','TEST_DAILY_DTSBXPFL'), +('TEST_DAILY_DTSBX601','TEST_DAILY_DTSRQ335'), +('TEST_WEEKLY_DTSBXREJ','TEST_DAILY_DTSBXREL'), +('TEST_WEEKLY_DTSBX122','TEST_WEEKLY_DTSPDAY7'), +('TEST_WEEKLY_DTSRQ511','TEST_WEEKLY_DTSPDAY7'), +('TEST_MONTHLY_DTSRQ414','TEST_DAILY_DTSPDAY1'), +('TEST_MONTHLY_DTSCHGVB','TEST_MONTHLY_DTSPMON1'), +('TEST_MONTHLY_DTSCHGVR','TEST_MONTHLY_DTSCHGVB'), +('TEST_MONTHLY_DTSVBKUP','TEST_MONTHLY_DTSPMON1'), +('TEST_MONTHLY_DTSVRSTR','TEST_MONTHLY_DTSVBKUP'), +('TEST_MONTHLY_DTSRQ442','TEST_MONTHLY_DTSRQ513'); \ No newline at end of file diff --git a/SqlAgent/v1/02_Test/2_Stored_Procedures/usp_CheckJobConditions.sql b/SqlAgent/v1/02_Test/2_Stored_Procedures/usp_CheckJobConditions.sql new file mode 100644 index 0000000..42f3b01 Binary files /dev/null and b/SqlAgent/v1/02_Test/2_Stored_Procedures/usp_CheckJobConditions.sql differ diff --git a/SqlAgent/v1/02_Test/2_Stored_Procedures/usp_CheckJobConditions_Generic.sql b/SqlAgent/v1/02_Test/2_Stored_Procedures/usp_CheckJobConditions_Generic.sql new file mode 100644 index 0000000..d009605 Binary files /dev/null and b/SqlAgent/v1/02_Test/2_Stored_Procedures/usp_CheckJobConditions_Generic.sql differ diff --git a/SqlAgent/v1/02_Test/2_Stored_Procedures/usp_CreateSQLAgentJob.sql b/SqlAgent/v1/02_Test/2_Stored_Procedures/usp_CreateSQLAgentJob.sql new file mode 100644 index 0000000..f6702a8 Binary files /dev/null and b/SqlAgent/v1/02_Test/2_Stored_Procedures/usp_CreateSQLAgentJob.sql differ diff --git a/SqlAgent/v1/02_Test/2_Stored_Procedures/usp_ForceComplete.sql b/SqlAgent/v1/02_Test/2_Stored_Procedures/usp_ForceComplete.sql new file mode 100644 index 0000000..3b107b2 Binary files /dev/null and b/SqlAgent/v1/02_Test/2_Stored_Procedures/usp_ForceComplete.sql differ diff --git a/SqlAgent/v1/02_Test/2_Stored_Procedures/usp_ScheduleMonthlyJob.sql b/SqlAgent/v1/02_Test/2_Stored_Procedures/usp_ScheduleMonthlyJob.sql new file mode 100644 index 0000000..37709c5 Binary files /dev/null and b/SqlAgent/v1/02_Test/2_Stored_Procedures/usp_ScheduleMonthlyJob.sql differ diff --git a/SqlAgent/v1/02_Test/2_Stored_Procedures/usp_TriggerMissedJobs.sql b/SqlAgent/v1/02_Test/2_Stored_Procedures/usp_TriggerMissedJobs.sql new file mode 100644 index 0000000..53496ac Binary files /dev/null and b/SqlAgent/v1/02_Test/2_Stored_Procedures/usp_TriggerMissedJobs.sql differ diff --git a/SqlAgent/v1/02_Test/2_Stored_Procedures/usp_UpdateJobStatus_Generic.sql b/SqlAgent/v1/02_Test/2_Stored_Procedures/usp_UpdateJobStatus_Generic.sql new file mode 100644 index 0000000..6057d6e Binary files /dev/null and b/SqlAgent/v1/02_Test/2_Stored_Procedures/usp_UpdateJobStatus_Generic.sql differ diff --git a/SqlAgent/v1/02_Test/3_Job_Maintenance/ActivateMonthlyJob.sql b/SqlAgent/v1/02_Test/3_Job_Maintenance/ActivateMonthlyJob.sql new file mode 100644 index 0000000..9dede8c --- /dev/null +++ b/SqlAgent/v1/02_Test/3_Job_Maintenance/ActivateMonthlyJob.sql @@ -0,0 +1,65 @@ +USE msdb; +GO + +-- Schedule TEST Monthly Jobs for October 2025 +------------------------------------------------ +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='TEST_MONTHLY_DTSRQ414', + @Env='TEST', + @RunDate='2025-11-03', + @RunTime='18:15:00'; + +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='TEST_MONTHLY_DTSPMON1', + @Env='TEST', + @RunDate='2025-10-31', + @RunTime='19:15:00'; + +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='TEST_MONTHLY_DTSCHGVB', + @Env='TEST', + @RunDate='2025-10-31', + @RunTime='19:26:00'; + +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='TEST_MONTHLY_DTSCHGVR', + @Env='TEST', + @RunDate='2025-10-31', + @RunTime='19:27:00'; + +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='TEST_MONTHLY_DTSVBKUP', + @Env='TEST', + @RunDate='2025-10-31', + @RunTime='19:26:00'; + +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='TEST_MONTHLY_DTSVRSTR', + @Env='TEST', + @RunDate='2025-10-31', + @RunTime='19:30:00'; + +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='TEST_MONTHLY_DTSRQ442', + @Env='TEST', + @RunDate='2025-10-31', + @RunTime='19:37:00'; + +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='TEST_MONTHLY_DTSBX460', + @Env='TEST', + @RunDate='2025-10-31', + @RunTime='19:35:00'; + +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='TEST_MONTHLY_DTSRQ513', + @Env='TEST', + @RunDate='2025-10-31', + @RunTime='19:37:00'; + +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='TEST_MONTHLY_DTSCHGDC', + @Env='TEST', + @RunDate='2025-11-03', + @RunTime='13:00:00'; +GO diff --git a/SqlAgent/v1/02_Test/3_Job_Maintenance/AddDailyJobs.sql b/SqlAgent/v1/02_Test/3_Job_Maintenance/AddDailyJobs.sql new file mode 100644 index 0000000..61174d5 --- /dev/null +++ b/SqlAgent/v1/02_Test/3_Job_Maintenance/AddDailyJobs.sql @@ -0,0 +1,279 @@ +USE [msdb] +GO + +-- Execute the stored procedure for each job +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSBX215', + @StartTimeHHMMSS = 40000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSBX305', + @StartTimeHHMMSS = 40000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSGSID0', + @StartTimeHHMMSS = 60000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_GSIRQ300', + @StartTimeHHMMSS = 60500, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSRQ202', + @StartTimeHHMMSS = 61000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSGSID1', + @StartTimeHHMMSS = 61500, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSBX202', + @StartTimeHHMMSS = 70000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSFT202', + @StartTimeHHMMSS = 80000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSBX432', + @StartTimeHHMMSS = 83000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSGACHD', + @StartTimeHHMMSS = 90000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSBX303', + @StartTimeHHMMSS = 100000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSGWAGE', + @StartTimeHHMMSS = 140000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSGCHKS', + @StartTimeHHMMSS = 140500, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSESDAY', + @StartTimeHHMMSS = 140500, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSGPAYT', + @StartTimeHHMMSS = 141000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSDX145', + @StartTimeHHMMSS = 160500, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSBX629', + @StartTimeHHMMSS = 161500, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSBX630', + @StartTimeHHMMSS = 163000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSFRAUD', + @StartTimeHHMMSS = 163000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSRACHD', + @StartTimeHHMMSS = 170000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSBXACH', + @StartTimeHHMMSS = 170000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSBXREG', + @StartTimeHHMMSS = 170000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSBX430', + @StartTimeHHMMSS = 170000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSBX626', + @StartTimeHHMMSS = 170000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSBX530', + @StartTimeHHMMSS = 170000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSBXREL', + @StartTimeHHMMSS = 170000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSBX450', + @StartTimeHHMMSS = 171500, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSBX451', + @StartTimeHHMMSS = 171500, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSPACHD', + @StartTimeHHMMSS = 180000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSPX148', + @StartTimeHHMMSS = 180500, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSRQ325', + @StartTimeHHMMSS = 180500, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSBX427', + @StartTimeHHMMSS = 180700, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSPDAY1', + @StartTimeHHMMSS = 181000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSW4WGE', + @StartTimeHHMMSS = 181500, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSGSID2', + @StartTimeHHMMSS = 181500, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSGSID9', + @StartTimeHHMMSS = 181500, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSMIN01', + @StartTimeHHMMSS = 182000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSMIN02', + @StartTimeHHMMSS = 182000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSRQ459', + @StartTimeHHMMSS = 190000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSBXPFL', + @StartTimeHHMMSS = 190000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DESBD427', + @StartTimeHHMMSS = 190500, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSBX403', + @StartTimeHHMMSS = 200000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSBE405', + @StartTimeHHMMSS = 201500, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSBX405', + @StartTimeHHMMSS = 201500, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSRQ335', + @StartTimeHHMMSS = 210000, + @Env = 'TEST', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'TEST_DAILY_DTSBX601', + @StartTimeHHMMSS = 212500, + @Env = 'TEST', + @Frequency = 'DAILY'; \ No newline at end of file diff --git a/SqlAgent/v1/02_Test/3_Job_Maintenance/AddMonthlyJobs.sql b/SqlAgent/v1/02_Test/3_Job_Maintenance/AddMonthlyJobs.sql new file mode 100644 index 0000000..9840c8d --- /dev/null +++ b/SqlAgent/v1/02_Test/3_Job_Maintenance/AddMonthlyJobs.sql @@ -0,0 +1,76 @@ +USE [msdb]; +GO + +-- Note: Frequency here is used only for description (used for category): MONTHLY +-- By Default Job will be scheduled Mon to Fri at specified time. Please change the schedules as per the requirement. + +-- 1. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'TEST_MONTHLY_DTSRQ414', + @StartTimeHHMMSS = 181500, + @Env = 'TEST', + @Frequency = 'MONTHLY'; + +-- 2. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'TEST_MONTHLY_DTSPMON1', + @StartTimeHHMMSS = 191500, + @Env = 'TEST', + @Frequency = 'MONTHLY'; + +-- 3. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'TEST_MONTHLY_DTSCHGVB', + @StartTimeHHMMSS = 192600, + @Env = 'TEST', + @Frequency = 'MONTHLY'; + +-- 4. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'TEST_MONTHLY_DTSCHGVR', + @StartTimeHHMMSS = 192700, + @Env = 'TEST', + @Frequency = 'MONTHLY'; + +-- 5. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'TEST_MONTHLY_DTSVBKUP', + @StartTimeHHMMSS = 192600, + @Env = 'TEST', + @Frequency = 'MONTHLY'; + +-- 6. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'TEST_MONTHLY_DTSVRSTR', + @StartTimeHHMMSS = 193000, + @Env = 'TEST', + @Frequency = 'MONTHLY'; + +-- 7. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'TEST_MONTHLY_DTSRQ442', + @StartTimeHHMMSS = 193700, + @Env = 'TEST', + @Frequency = 'MONTHLY'; + +-- 8. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'TEST_MONTHLY_DTSBX460', + @StartTimeHHMMSS = 193500, + @Env = 'TEST', + @Frequency = 'MONTHLY'; + +-- 9. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'TEST_MONTHLY_DTSRQ513', + @StartTimeHHMMSS = 193700, + @Env = 'TEST', + @Frequency = 'MONTHLY'; + +-- 10. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'TEST_MONTHLY_DTSCHGDC', + @StartTimeHHMMSS = 130000, + @Env = 'TEST', + @Frequency = 'MONTHLY'; +GO diff --git a/SqlAgent/v1/02_Test/3_Job_Maintenance/AddOneJob.sql b/SqlAgent/v1/02_Test/3_Job_Maintenance/AddOneJob.sql new file mode 100644 index 0000000..e28ade8 --- /dev/null +++ b/SqlAgent/v1/02_Test/3_Job_Maintenance/AddOneJob.sql @@ -0,0 +1,9 @@ +USE [msdb] +GO + +-- Create a job that runs Monday-Friday at 4:00 AM +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'TEST_DAILY_DTSBX215', + @StartTimeHHMMSS = 40000, -- For 4:00:00 AM (143000 for 2:30:00 PM) + @Env = 'TEST', + @Frequency = 'DAILY'; \ No newline at end of file diff --git a/SqlAgent/v1/02_Test/3_Job_Maintenance/AddWeeklyJobs.sql b/SqlAgent/v1/02_Test/3_Job_Maintenance/AddWeeklyJobs.sql new file mode 100644 index 0000000..48fa74d --- /dev/null +++ b/SqlAgent/v1/02_Test/3_Job_Maintenance/AddWeeklyJobs.sql @@ -0,0 +1,81 @@ +USE [msdb] +GO + +-- Note: Frequency here is used only for description (used for category): DAILY, WEEKLY, etc. +-- By Default Job will be scheduled to run on Mon to Fri at specified time. Please change the schedules as per the requirement. +-- 1. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'TEST_WEEKLY_DTSGSID0', + @StartTimeHHMMSS = 60000, + @Env = 'TEST', + @Frequency = 'WEEKLY'; + +-- 2. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'TEST_WEEKLY_DTSGSID1', + @StartTimeHHMMSS = 61500, + @Env = 'TEST', + @Frequency = 'WEEKLY'; + +-- 3. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'TEST_WEEKLY_DTSBX202', + @StartTimeHHMMSS = 70000, + @Env = 'TEST', + @Frequency = 'WEEKLY'; + +-- 4. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'TEST_WEEKLY_DTSFT202', + @StartTimeHHMMSS = 80000, + @Env = 'TEST', + @Frequency = 'WEEKLY'; + +-- 5. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'TEST_WEEKLY_DTSBX470', + @StartTimeHHMMSS = 70000, + @Env = 'TEST', + @Frequency = 'WEEKLY'; + +-- 6. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'TEST_WEEKLY_DTSBXREJ', + @StartTimeHHMMSS = 170000, + @Env = 'TEST', + @Frequency = 'WEEKLY'; + +-- 7. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'TEST_WEEKLY_DTSPDAY7', + @StartTimeHHMMSS = 191000, + @Env = 'TEST', + @Frequency = 'WEEKLY'; + +-- 8. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'TEST_WEEKLY_DTSBX122', + @StartTimeHHMMSS = 191400, + @Env = 'TEST', + @Frequency = 'WEEKLY'; + +-- 9. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'TEST_WEEKLY_DTSRQ511', + @StartTimeHHMMSS = 191400, + @Env = 'TEST', + @Frequency = 'WEEKLY'; + +-- 10. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'TEST_WEEKLY_DTSRQ444', + @StartTimeHHMMSS = 70000, + @Env = 'TEST', + @Frequency = 'WEEKLY'; + +-- 11. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'TEST_WEEKLY_DTSRQ126', + @StartTimeHHMMSS = 90000, + @Env = 'TEST', + @Frequency = 'WEEKLY'; \ No newline at end of file diff --git a/SqlAgent/v1/02_Test/3_Job_Maintenance/DailyJobScheduleLookup.sql b/SqlAgent/v1/02_Test/3_Job_Maintenance/DailyJobScheduleLookup.sql new file mode 100644 index 0000000..94af6b1 --- /dev/null +++ b/SqlAgent/v1/02_Test/3_Job_Maintenance/DailyJobScheduleLookup.sql @@ -0,0 +1,86 @@ +/******************************************************************************************** + Section 1: Daily Job Schedule Lookup + -------------------------------------------------------------------------------------------- + Description: + Returns all SQL Agent jobs scheduled to run on a given date, along with their control + status (IsActive) and configured runtime from JobControl. + + Parameters: + @CheckDate - The date to check job schedules for. + + Notes: + • Uses MSDB’s internal schedule definitions (sysschedules, sysjobschedules). + • Supports One-time, Daily, Weekly, and Monthly schedule types. + • Can easily be adapted for DEVL / TEST / PROD by changing @DbName. + +********************************************************************************************/ +USE msdb; +GO + +DECLARE @CheckDate DATE = CAST(GETDATE() AS DATE); -- Change if needed +DECLARE @CheckWeekday INT = DATEPART(WEEKDAY, @CheckDate); +DECLARE @Env SYSNAME = 'TEST'; -- Change for DEVL or PROD +DECLARE @DbName SYSNAME; + +-- Map environment to the right control DB +SET @DbName = CASE @Env + WHEN 'DEVL' THEN 'DevlDUTASJobSchedule' + WHEN 'TEST' THEN 'TestDUTASJobSchedule' + WHEN 'PROD' THEN 'ProdDUTASJobSchedule' + END; + +DECLARE @Sql NVARCHAR(MAX); +SET @Sql = N' +SELECT + j.name AS SQLAgentJobName, + jc.JobName AS ControlJobName, + jc.ScheduledStartTime, + jc.IsActive, + s.name AS ScheduleName, + s.freq_type, + s.freq_interval, + s.freq_subday_type, + s.freq_subday_interval, + s.active_start_date, + CASE s.freq_type + WHEN 1 THEN ''One-time'' + WHEN 4 THEN ''Daily'' + WHEN 8 THEN ''Weekly'' + WHEN 16 THEN ''Monthly'' + ELSE ''Other'' + END AS FrequencyType, + CASE + WHEN s.freq_type = 1 + AND s.active_start_date = CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112)) + THEN 1 + WHEN s.freq_type = 4 + AND s.active_start_date <= CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112)) + THEN 1 + WHEN s.freq_type = 8 -- Weekly + AND (POWER(2, @CheckWeekdayParam - 1) & s.freq_interval) > 0 + THEN 1 + WHEN s.freq_type = 16 -- Monthly + AND DAY(@CheckDateParam) = s.freq_interval + THEN 1 + ELSE 0 + END AS IsScheduledToday +FROM msdb.dbo.sysjobs j +JOIN msdb.dbo.sysjobschedules js ON j.job_id = js.job_id +JOIN msdb.dbo.sysschedules s ON js.schedule_id = s.schedule_id +LEFT JOIN ' + QUOTENAME(@DbName) + '.dbo.JobControl jc ON jc.JobName = j.name +WHERE jc.IsActive = 1 + AND ( + (s.freq_type = 1 AND s.active_start_date = CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112))) -- One-time + OR (s.freq_type = 4 AND s.active_start_date <= CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112))) -- Daily + OR (s.freq_type = 8 AND (POWER(2, @CheckWeekdayParam - 1) & s.freq_interval) > 0) -- Weekly + OR (s.freq_type = 16 AND DAY(@CheckDateParam) = s.freq_interval) -- Monthly + ) +ORDER BY jc.ScheduledStartTime; +'; + +EXEC sp_executesql + @Sql, + N'@CheckDateParam DATE, @CheckWeekdayParam INT', + @CheckDateParam = @CheckDate, + @CheckWeekdayParam = @CheckWeekday; +GO diff --git a/SqlAgent/v1/02_Test/3_Job_Maintenance/DeactivateMonthlyJob.sql b/SqlAgent/v1/02_Test/3_Job_Maintenance/DeactivateMonthlyJob.sql new file mode 100644 index 0000000..e72bae5 --- /dev/null +++ b/SqlAgent/v1/02_Test/3_Job_Maintenance/DeactivateMonthlyJob.sql @@ -0,0 +1,12 @@ +USE TestDUTASJobSchedule; +GO + +UPDATE dbo.JobControl +SET IsActive = 0 +WHERE Frequency = 'MONTHLY'; +GO + +-- Optional: Verify changes +SELECT JobName, Frequency, IsActive +FROM dbo.JobControl +WHERE Frequency = 'MONTHLY'; diff --git a/SqlAgent/v1/02_Test/3_Job_Maintenance/DetachDeleteScheduleByName.sql b/SqlAgent/v1/02_Test/3_Job_Maintenance/DetachDeleteScheduleByName.sql new file mode 100644 index 0000000..d646072 --- /dev/null +++ b/SqlAgent/v1/02_Test/3_Job_Maintenance/DetachDeleteScheduleByName.sql @@ -0,0 +1,13 @@ +-- If you know both the job name and schedule name +DECLARE @JobName NVARCHAR(100) = 'TEST_MONTHLY_DTSCHGDC'; +DECLARE @ScheduleName NVARCHAR(200) = 'TEST_MONTHLY_DTSCHGDC_MonthlySchedule'; +DECLARE @JobId UNIQUEIDENTIFIER; + +-- Get job ID +SELECT @JobId = job_id FROM msdb.dbo.sysjobs WHERE name = @JobName; + +-- Detach from specific job +EXEC msdb.dbo.sp_detach_schedule @job_id = @JobId, @schedule_name = @ScheduleName; + +-- Then delete +EXEC msdb.dbo.sp_delete_schedule @schedule_name = @ScheduleName; diff --git a/SqlAgent/v1/02_Test/3_Job_Maintenance/ForceCompleteJob.sql b/SqlAgent/v1/02_Test/3_Job_Maintenance/ForceCompleteJob.sql new file mode 100644 index 0000000..8577849 --- /dev/null +++ b/SqlAgent/v1/02_Test/3_Job_Maintenance/ForceCompleteJob.sql @@ -0,0 +1,16 @@ +USE TestDUTASJobSchedule; +GO + +-- 1. Check today's job status +SELECT JobName, Status, ErrorMessage +FROM dbo.JobExecutionHistory +WHERE RunDate = CAST(GETDATE() AS DATE) +AND JobName = 'DEVL_WEEKLY_DTSGSID1'; + +-- 2. Mark DTSBX305 as manually overridden +EXEC dbo.usp_ForceComplete 'DEVL_WEEKLY_DTSGSID1', 'Neeraj.Kumar'; + +-- 3. Verify the override +SELECT JobName, Status, OverrideBy, OverrideDate +FROM dbo.JobExecutionHistory +WHERE JobName = 'DEVL_WEEKLY_DTSGSID1' AND RunDate = CAST(GETDATE() AS DATE); \ No newline at end of file diff --git a/SqlAgent/v1/02_Test/3_Job_Maintenance/JobInfo.sql b/SqlAgent/v1/02_Test/3_Job_Maintenance/JobInfo.sql new file mode 100644 index 0000000..4cd23e4 --- /dev/null +++ b/SqlAgent/v1/02_Test/3_Job_Maintenance/JobInfo.sql @@ -0,0 +1,47 @@ +USE msdb; +GO + +PRINT '================================================================================'; +PRINT 'SECTION 1: JOB CONTROL INFORMATION'; +PRINT '================================================================================'; +GO + +-- View all active jobs +SELECT JobName, ScheduledStartTime, Frequency, IsActive +FROM TestDUTASJobSchedule.dbo.JobControl +WHERE IsActive = 1 +ORDER BY Frequency, ScheduledStartTime; +GO + +-- View all inactive jobs +SELECT JobName, Frequency, ScheduledStartTime +FROM TestDUTASJobSchedule.dbo.JobControl +WHERE IsActive = 0 +ORDER BY Frequency; +GO + +-- Find weekly/monthly jobs +SELECT JobName, Frequency, ScheduledStartTime +FROM TestDUTASJobSchedule.dbo.JobControl +WHERE Frequency IN ('WEEKLY', 'MONTHLY') +ORDER BY Frequency, ScheduledStartTime; +GO + +PRINT '================================================================================'; +PRINT 'SECTION 2: JOB DEPENDENCIES'; +PRINT '================================================================================'; +GO + +-- Check dependencies for a job +DECLARE @Job NVARCHAR(100) = 'TEST_MONTHLY_DTSCHGVR'; +SELECT JobName, PredecessorJobName +FROM TestDUTASJobSchedule.dbo.JobDependencies +WHERE JobName = @Job; +GO + +-- Show dependency chain overview +SELECT d.JobName, d.PredecessorJobName, jc.ScheduledStartTime, jc.Frequency +FROM TestDUTASJobSchedule.dbo.JobDependencies d +JOIN TestDUTASJobSchedule.dbo.JobControl jc ON d.JobName = jc.JobName +ORDER BY jc.Frequency, jc.ScheduledStartTime; +GO diff --git a/SqlAgent/v1/02_Test/3_Job_Maintenance/SQLAgentInfo.sql b/SqlAgent/v1/02_Test/3_Job_Maintenance/SQLAgentInfo.sql new file mode 100644 index 0000000..d63458e --- /dev/null +++ b/SqlAgent/v1/02_Test/3_Job_Maintenance/SQLAgentInfo.sql @@ -0,0 +1,42 @@ +USE msdb; +GO + +PRINT '================================================================================'; +PRINT 'SECTION 1: SQL AGENT JOB STATUS'; +PRINT '================================================================================'; +GO + +-- List all jobs in SQL Agent +SELECT name AS JobName, enabled, date_created, date_modified +FROM msdb.dbo.sysjobs +ORDER BY name; +GO + +-- Job schedule summary +SELECT j.name AS JobName, s.name AS ScheduleName, + s.enabled, s.freq_type, s.active_start_date, s.active_start_time +FROM msdb.dbo.sysjobs j +JOIN msdb.dbo.sysjobschedules js ON j.job_id = js.job_id +JOIN msdb.dbo.sysschedules s ON js.schedule_id = s.schedule_id +ORDER BY j.name; +GO + +-- Last job run details +SELECT j.name AS JobName, + h.run_status, + CASE h.run_status + WHEN 0 THEN 'Failed' + WHEN 1 THEN 'Succeeded' + WHEN 2 THEN 'Retry' + WHEN 3 THEN 'Canceled' + WHEN 4 THEN 'In Progress' + END AS StatusDescription, + msdb.dbo.agent_datetime(h.run_date, h.run_time) AS RunDateTime, + h.run_duration +FROM dbo.sysjobs j +LEFT JOIN dbo.sysjobhistory h ON j.job_id = h.job_id +WHERE h.instance_id IN ( + SELECT MAX(instance_id) FROM dbo.sysjobhistory GROUP BY job_id +) +ORDER BY RunDateTime DESC; +GO \ No newline at end of file diff --git a/SqlAgent/v1/02_Test/3_Job_Maintenance/TodaysExecution.sql b/SqlAgent/v1/02_Test/3_Job_Maintenance/TodaysExecution.sql new file mode 100644 index 0000000..7509ac0 --- /dev/null +++ b/SqlAgent/v1/02_Test/3_Job_Maintenance/TodaysExecution.sql @@ -0,0 +1,21 @@ +USE TestDUTASJobSchedule; +GO + +DECLARE @Runday DATE = DATEADD(day, +0, CAST(GETDATE() AS DATE)); -- -1 for Yesterday + +SELECT + jeh.ExecutionID, + jeh.JobName, + jeh.RunDate, + jc.ScheduledStartTime, + jeh.ActualStartTime, + jeh.ActualEndTime, + jeh.Status, + jeh.ErrorMessage, + jeh.OverrideFlag, + jeh.OverrideBy +FROM dbo.JobExecutionHistory jeh +INNER JOIN dbo.JobControl jc + ON jeh.JobName = jc.JobName +WHERE jeh.RunDate = @Runday +ORDER BY jc.ScheduledStartTime, jeh.ActualStartTime; diff --git a/SqlAgent/v1/02_Test/3_Job_Maintenance/TriggerMissedJob.sql b/SqlAgent/v1/02_Test/3_Job_Maintenance/TriggerMissedJob.sql new file mode 100644 index 0000000..5899713 --- /dev/null +++ b/SqlAgent/v1/02_Test/3_Job_Maintenance/TriggerMissedJob.sql @@ -0,0 +1,9 @@ +USE [TestDUTASJobSchedule] +GO + +-- 1. Preview missed jobs (safe, no run): + EXEC dbo.usp_TriggerMissedJobs @DryRun = 1; + +-- 2. Actually trigger missed jobs: + EXEC dbo.usp_TriggerMissedJobs @DryRun = 0; + diff --git a/SqlAgent/v1/02_Test/4_PowerShell_Scripts/Backup-SQLAgentJobs.ps1 b/SqlAgent/v1/02_Test/4_PowerShell_Scripts/Backup-SQLAgentJobs.ps1 new file mode 100644 index 0000000..f858d64 --- /dev/null +++ b/SqlAgent/v1/02_Test/4_PowerShell_Scripts/Backup-SQLAgentJobs.ps1 @@ -0,0 +1,16 @@ +# Example PowerShell snippet +$Server = "DOES-DUTAS-SQL1" +$BackupPath = "\\DOES-RAINVM-DEV\E$\Neeraj\SqlAgent\Backup\" +$Timestamp = Get-Date -Format "yyyyMMdd_HHmmss" +$ZipFile = "$BackupPath\SQLAgentJobs_$Timestamp.zip" + +# Make backup folder if not exist +if (-not (Test-Path $BackupPath)) { New-Item -ItemType Directory -Path $BackupPath } + +# Export all jobs as SQL files +sqlcmd -S $Server -Q "EXEC msdb.dbo.sp_help_job" -o "$BackupPath\SQLAgentJobs_$Timestamp.txt" + +# Compress to zip +Compress-Archive -Path "$BackupPath\*" -DestinationPath $ZipFile -Force + +Write-Host "✅ Backup complete: $ZipFile" diff --git a/SqlAgent/v1/02_Test/4_PowerShell_Scripts/Execute-RemoteJob.ps1 b/SqlAgent/v1/02_Test/4_PowerShell_Scripts/Execute-RemoteJob.ps1 new file mode 100644 index 0000000..eace0e0 --- /dev/null +++ b/SqlAgent/v1/02_Test/4_PowerShell_Scripts/Execute-RemoteJob.ps1 @@ -0,0 +1,102 @@ +param( + [Parameter(Mandatory = $true)] + [string]$JobName, + + [Parameter(Mandatory = $true)] + [ValidateSet('DEVL', 'TEST', 'PROD')] + [string]$Env +) + +try { + Write-Host "Starting job $JobName in environment $Env at $(Get-Date)" + + # ------------------------------------------------------------ + # Extract JCL from JobName (ENV_FREQUENCY_JOB pattern) + # ------------------------------------------------------------ + $JCL = $JobName -replace '^[A-Z]+_[A-Z]+_', '' + Write-Host "Extracted JCL: $JCL from JobName: $JobName" -ForegroundColor Yellow + + # ------------------------------------------------------------ + # Environment-specific configuration + # ------------------------------------------------------------ + switch ($Env.ToUpper()) { + 'DEVL' { + $ComputerName = '10.57.110.120' + $DatabaseName = 'DevlDUTASJobSchedule' + } + 'TEST' { + $ComputerName = '10.57.110.141' + $DatabaseName = 'TestDUTASJobSchedule' + } + 'PROD' { + $ComputerName = '10.57.111.120' + $DatabaseName = 'ProdDUTASJobSchedule' + } + default { + throw "Invalid environment specified: $Env" + } + } + + # ------------------------------------------------------------ + # Remote credentials + # (recommend moving credentials to secure vault for production) + # ------------------------------------------------------------ + $username = "DUTASSQLAdminP@does.dcgov.priv" + $password = "4ho@3Pr&Xof8" | ConvertTo-SecureString -AsPlainText -Force + $credential = New-Object System.Management.Automation.PSCredential($username, $password) + + # ------------------------------------------------------------ + # Execute job remotely using the extracted JCL + # ------------------------------------------------------------ + Write-Host "Connecting to remote server $ComputerName ..." + $exitCode = Invoke-Command -ComputerName $ComputerName ` + -Credential $credential ` + -Authentication CredSSP ` + -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck) ` + -ArgumentList $JobName, $JCL, $Env ` + -ScriptBlock { + param($JobName, $JCL, $Env) + + Write-Host "Remote execution - JobName: $JobName, JCL: $JCL, Env: $Env" + + $process = Start-Process -FilePath "powershell.exe" ` + -ArgumentList "-ExecutionPolicy Bypass -File `"E:\PSScript\RCSubmit-Job.ps1`" -JobName `"$JCL`" -Env `"$Env`"" ` + -NoNewWindow -Wait -PassThru + return $process.ExitCode + } + + if ($exitCode -eq 0) { + Write-Host "Job $JobName (JCL: $JCL) completed successfully at $(Get-Date)" -ForegroundColor Green + } else { + Write-Error "Job $JobName (JCL: $JCL) failed with exit code: $exitCode" + } +} +catch { + Write-Error "Job $JobName failed with error: $($_.Exception.Message)" + $exitCode = 1 +} +finally { + # ------------------------------------------------------------ + # Log exit code to the appropriate database + # ------------------------------------------------------------ + try { + $connectionString = "Server=localhost;Database=$DatabaseName;Trusted_Connection=true;" + $connection = New-Object System.Data.SqlClient.SqlConnection($connectionString) + $connection.Open() + + $command = $connection.CreateCommand() + $command.CommandText = @" + INSERT INTO dbo.JobExitCodes (JobName, RunDate, ExitCode, RecordedTime) + VALUES ('$JobName', CAST(GETDATE() AS DATE), $exitCode, GETDATE()); +"@ + $command.ExecuteNonQuery() + $connection.Close() + Write-Host "Exit code $exitCode logged to database $DatabaseName for job $JobName" + } + catch { + $errorMsg = $_.Exception.Message + Write-Host "Failed to log exit code to database $DatabaseName`: $errorMsg" + } +} + +exit $exitCode \ No newline at end of file diff --git a/SqlAgent/v1/02_Test/4_PowerShell_Scripts/RCSubmit-Job.ps1 b/SqlAgent/v1/02_Test/4_PowerShell_Scripts/RCSubmit-Job.ps1 new file mode 100644 index 0000000..3fb0c57 --- /dev/null +++ b/SqlAgent/v1/02_Test/4_PowerShell_Scripts/RCSubmit-Job.ps1 @@ -0,0 +1,108 @@ +param( + [string]$JobName, + [string]$Env +) + +# --- Parameter Validation --- +if (-not $JobName) { + Write-Host "JobName parameter is required" -ForegroundColor Red + exit 1 +} +if (-not $Env) { + Write-Host "Environment (Env) parameter is required" -ForegroundColor Red + exit 1 +} + +# --- Execute Job --- +Write-Host "Submitting job: $JobName in environment: $Env" -ForegroundColor Cyan +$output = & "$env:rcbin\submit.exe" -DSN="DOESTAX.$Env.JOBS.BATCH.LIB($JobName)" +$exitCode = [int]$LASTEXITCODE +$isSuccess = 0 + +# --- Parse SYSLOG Path --- +$syslogPath = $null +$syslogFolder = "Not found" +$content = @() +$summary = @() + +try { + $syslogPath = $output | Select-String -Pattern "SYSLOG=\[(.*)\]" | ForEach-Object { $_.Matches.Groups[1].Value } + + if ($syslogPath -and (Test-Path $syslogPath)) { + $syslogFolder = Split-Path $syslogPath -Parent + $content = Get-Content $syslogPath -ErrorAction Stop + $summary = $content | Select-String -Pattern "%Job Overall Stats:" -Context 0,7 | ForEach-Object { + $_.Context.PostContext | Select-Object -Skip 1 -First 5 + } + } else { + Write-Host "SYSLOG path not found or inaccessible: $syslogPath" -ForegroundColor Yellow + $summary = @("SYSLOG file not found in output", "Raw output:", $output -join "`n") + } +} +catch { + Write-Host "Error processing SYSLOG: $($_.Exception.Message)" -ForegroundColor Yellow + $summary = @("Error reading SYSLOG: $($_.Exception.Message)", "Raw output:", $output -join "`n") +} + +# --- Evaluate Return Codes --- +$successConditions = @( + { $JobName -eq "GSIRQ300" -and $exitCode -eq 50 }, + { $JobName -eq "DTSGWAGE" -and $exitCode -eq 8 }, + { $JobName -eq "DTSGCHKS" -and $exitCode -eq 8 }, + { $JobName -eq "DTSGPAYT" -and $exitCode -eq 8 }, + { $JobName -eq "DTSBXACH" -and $exitCode -eq 2 }, + { $JobName -eq "DTSBXREL" -and $exitCode -eq 2 }, + { $JobName -eq "DTSMIN02" -and $exitCode -eq 4 }, + { $JobName -eq "DTSBE405" -and $exitCode -eq 910 }, + { $JobName -eq "DTSBXREJ" -and $exitCode -eq 4 }, + { $JobName -eq "DTSRQ444" -and $exitCode -eq 4 }, + { $exitCode -eq 0 } +) + +if ($successConditions | Where-Object { & $_ }) { + Write-Host "Job $JobName succeeded with code $exitCode" -ForegroundColor Green + $isSuccess = 0 +} else { + Write-Host "Job $JobName failed with code $exitCode" -ForegroundColor Red + $isSuccess = 1 + # Only use error if we don't have a proper summary + if ($summary.Count -eq 0) { + $summary = @($Error[0]) + } +} + +# --- Email Notification --- +$smtpServer = "smtp4.dc.gov" +$fromEmail = "Dutas@dc.gov" +$toEmail = "neerajk@innovaconsulting.com" +$ccEmail = @("neerajk@innovaconsulting.com") + +$emailBody = @" +
+DUTAS Batch Job: $JobName Execution Report
+==========================================
+$($summary -join "`n")
+==========================================
+
+Return Code: $exitCode
+Status: $(if ($isSuccess -eq 0) { "SUCCESS" } else { "FAILED" })
+JOBLOG Path: $syslogFolder
+
+"@ + +try { + Send-MailMessage -SmtpServer $smtpServer -Port 25 ` + -From $fromEmail -To $toEmail -Cc $ccEmail ` + -Subject "DUTAS-[$Env] Job Status: $JobName - $(if ($isSuccess -eq 0) { 'SUCCESS' } else { 'FAILED' })" ` + -Body $emailBody -BodyAsHtml + Write-Host "Email sent successfully to $toEmail" -ForegroundColor Cyan +} +catch { + Write-Host "Failed to send email: $($_.Exception.Message)" -ForegroundColor Yellow +} + +Write-Host "`n---------------------------------------------" +Write-Host "Job: $JobName | ExitCode: $exitCode | Status: $(if ($isSuccess -eq 0) { 'SUCCESS' } else { 'FAILED' })" +Write-Host "---------------------------------------------`n" + +exit $isSuccess \ No newline at end of file diff --git a/SqlAgent/v1/02_Test/5_Deployment/Deploy_DEVL_to_TEST.sql b/SqlAgent/v1/02_Test/5_Deployment/Deploy_DEVL_to_TEST.sql new file mode 100644 index 0000000..2cd3fa5 --- /dev/null +++ b/SqlAgent/v1/02_Test/5_Deployment/Deploy_DEVL_to_TEST.sql @@ -0,0 +1,15 @@ +DECLARE @SrcDB NVARCHAR(128) = 'DevlDUTASJobSchedule'; +DECLARE @NewDB NVARCHAR(128) = 'TestDUTASJobSchedule'; +DECLARE @Backup NVARCHAR(260) = '\\DOES-RAINVM-DEV\E$\Neeraj\SqlAgent\Backup\' + @SrcDB + '.bak'; + +-- Backup Source +BACKUP DATABASE @SrcDB TO DISK = @Backup WITH INIT, COMPRESSION; + +-- Restore as Target +DECLARE @SQL NVARCHAR(MAX) = ' +RESTORE DATABASE [' + @NewDB + '] +FROM DISK = N''' + @Backup + ''' +WITH MOVE N''' + @SrcDB + ''' TO N''\\DOES-RAINVM-DEV\E$\SQLData\' + @NewDB + '.mdf'', + MOVE N''' + @SrcDB + '_log'' TO N''\\DOES-RAINVM-DEV\E$\SQLLogs\' + @NewDB + '_log.ldf'', + REPLACE;'; +EXEC(@SQL); diff --git a/SqlAgent/v1/02_Test/5_Deployment/Deploy_TEST_to_PROD.sql b/SqlAgent/v1/02_Test/5_Deployment/Deploy_TEST_to_PROD.sql new file mode 100644 index 0000000..3cd8de6 --- /dev/null +++ b/SqlAgent/v1/02_Test/5_Deployment/Deploy_TEST_to_PROD.sql @@ -0,0 +1,15 @@ +DECLARE @SrcDB NVARCHAR(128) = 'TestDUTASJobSchedule'; +DECLARE @NewDB NVARCHAR(128) = 'ProdDUTASJobSchedule'; +DECLARE @Backup NVARCHAR(260) = '\\DOES-RAINVM-DEV\E$\Neeraj\SqlAgent\Backup\' + @SrcDB + '.bak'; + +-- Backup Source +BACKUP DATABASE @SrcDB TO DISK = @Backup WITH INIT, COMPRESSION; + +-- Restore as Target +DECLARE @SQL NVARCHAR(MAX) = ' +RESTORE DATABASE [' + @NewDB + '] +FROM DISK = N''' + @Backup + ''' +WITH MOVE N''' + @SrcDB + ''' TO N''\\DOES-RAINVM-DEV\E$\SQLData\' + @NewDB + '.mdf'', + MOVE N''' + @SrcDB + '_log'' TO N''\\DOES-RAINVM-DEV\E$\SQLLogs\' + @NewDB + '_log.ldf'', + REPLACE;'; +EXEC(@SQL); diff --git a/SqlAgent/v1/03_Prod/1_Database_Setup/CreateDB.sql b/SqlAgent/v1/03_Prod/1_Database_Setup/CreateDB.sql new file mode 100644 index 0000000..3a4d713 --- /dev/null +++ b/SqlAgent/v1/03_Prod/1_Database_Setup/CreateDB.sql @@ -0,0 +1,63 @@ +-- Create the database +CREATE DATABASE ProdDUTASJobSchedule; +GO + +USE ProdDUTASJobSchedule; +GO + +-- Create the main control table +CREATE TABLE dbo.JobControl ( + JobID INT IDENTITY(1,1) PRIMARY KEY, + JobName VARCHAR(50) NOT NULL UNIQUE, + ScheduledStartTime TIME NOT NULL, + SchedulerAction VARCHAR(10) NOT NULL CHECK (SchedulerAction IN ('CONTINUE', 'STOP')), + IsActive BIT DEFAULT 1, + CreatedDate DATETIME DEFAULT GETDATE(), + Frequency VARCHAR(20) NOT NULL +); +GO + +-- Create job dependencies table +CREATE TABLE dbo.JobDependencies ( + DependencyID INT IDENTITY(1,1) PRIMARY KEY, + JobName VARCHAR(50) NOT NULL, + PredecessorJobName VARCHAR(50) NULL, + FOREIGN KEY (JobName) REFERENCES dbo.JobControl(JobName) +); +GO + +-- Create execution history table +CREATE TABLE dbo.JobExecutionHistory ( + ExecutionID INT IDENTITY(1,1) PRIMARY KEY, + JobName VARCHAR(50) NOT NULL, + RunDate DATE NOT NULL, + ScheduledStartTime TIME NOT NULL, + ActualStartTime DATETIME NULL, + ActualEndTime DATETIME NULL, + Status VARCHAR(20) DEFAULT 'Pending' CHECK (Status IN ('Pending', 'Running', 'Success', 'Failed', 'ForceComplete')), + ErrorMessage VARCHAR(MAX) NULL, + OverrideFlag BIT DEFAULT 0, + OverrideBy VARCHAR(100) NULL, + OverrideDate DATETIME NULL +); +GO + +-- Create holidays table +CREATE TABLE dbo.FederalHolidays ( + HolidayID INT IDENTITY(1,1) PRIMARY KEY, + HolidayDate DATE NOT NULL UNIQUE, + HolidayName VARCHAR(100) NOT NULL, + Year INT NOT NULL +); +GO + +-- Create Exit Code table for PowerShell Script +CREATE TABLE dbo.JobExitCodes +( + JobExecutionID INT IDENTITY(1,1) PRIMARY KEY, -- unique ID per execution + JobName NVARCHAR(128) NOT NULL, -- job name + RunDate DATE NOT NULL, -- date of execution + ExitCode INT NOT NULL, -- exit code from job + RecordedTime DATETIME NOT NULL DEFAULT GETDATE() -- timestamp of execution +); +GO diff --git a/SqlAgent/v1/03_Prod/1_Database_Setup/InsertHolidays.sql b/SqlAgent/v1/03_Prod/1_Database_Setup/InsertHolidays.sql new file mode 100644 index 0000000..a21ffaa --- /dev/null +++ b/SqlAgent/v1/03_Prod/1_Database_Setup/InsertHolidays.sql @@ -0,0 +1,34 @@ +USE ProdDUTASJobSchedule; +GO + +-- Clear existing data and insert 2025-2026 holidays (ignoring 0000000000 dates) +INSERT INTO dbo.FederalHolidays (HolidayDate, HolidayName, Year) VALUES +-- 2025 Holidays +('2025-01-01', 'New Years Day', 2025), +('2025-01-20', 'Martin Luther King Day', 2025), +('2025-02-17', 'Presidents Day', 2025), +('2025-05-26', 'Memorial Day', 2025), +('2025-06-19', 'Juneteenth Day', 2025), +('2025-07-04', 'Independence Day', 2025), +('2025-09-01', 'Labor Day', 2025), +('2025-10-13', 'Columbus Day', 2025), +('2025-11-11', 'Veterans Day', 2025), +('2025-11-27', 'Thanksgiving Day', 2025), +('2025-12-25', 'Christmas Day', 2025), + +-- 2026 Holidays +('2026-01-01', 'New Years Day', 2026), +('2026-01-19', 'Martin Luther King Day', 2026), +('2026-02-16', 'Presidents Day', 2026), +('2026-05-25', 'Memorial Day', 2026), +('2026-06-19', 'Juneteenth Day', 2026), +('2026-07-03', 'Independence Day', 2026), -- Note: July 3rd observed since July 4th is Saturday +('2026-09-07', 'Labor Day', 2026), +('2026-10-12', 'Columbus Day', 2026), +('2026-11-11', 'Veterans Day', 2026), +('2026-11-26', 'Thanksgiving Day', 2026), +('2026-12-25', 'Christmas Day', 2026); +GO + +-- Verify the data +SELECT * FROM dbo.FederalHolidays ORDER BY HolidayDate; \ No newline at end of file diff --git a/SqlAgent/v1/03_Prod/1_Database_Setup/InsertJobControl.sql b/SqlAgent/v1/03_Prod/1_Database_Setup/InsertJobControl.sql new file mode 100644 index 0000000..f6f6471 --- /dev/null +++ b/SqlAgent/v1/03_Prod/1_Database_Setup/InsertJobControl.sql @@ -0,0 +1,79 @@ +USE [ProdDUTASJobSchedule] +GO + +INSERT INTO [dbo].[JobControl] ( + [JobName], + [ScheduledStartTime], + [SchedulerAction], + [IsActive], + [CreatedDate], + [Frequency] +) +VALUES + ('PROD_DAILY_DTSBX215', '4:00:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSBX305', '4:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSGSID0', '6:00:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_GSIRQ300', '6:05:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSRQ202', '6:10:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSGSID1', '6:15:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSBX202', '7:00:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSFT202', '8:00:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSBX432', '8:30:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSGACHD', '9:00:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSBX303', '10:00:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSGWAGE', '14:00:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSGCHKS', '14:05:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSESDAY', '14:05:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSGPAYT', '14:10:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSDX145', '16:05:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSBX629', '16:15:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSBX630', '16:30:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSFRAUD', '16:30:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSRACHD', '17:00:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSBXACH', '17:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSBXREG', '17:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSBX430', '17:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSBX626', '17:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSBX530', '17:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSBXREL', '17:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSBX450', '17:15:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSBX451', '17:15:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSPACHD', '18:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSPX148', '18:05:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSRQ325', '18:05:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSBX427', '18:07:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSPDAY1', '18:10:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSW4WGE', '18:15:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSGSID2', '18:15:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSGSID9', '18:15:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSMIN01', '18:20:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSMIN02', '18:20:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSRQ459', '19:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSBXPFL', '19:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DESBD427', '19:05:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSBX403', '20:00:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSBE405', '20:15:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSBX405', '20:15:00', 'CONTINUE', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSRQ335', '21:00:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('PROD_DAILY_DTSBX601', '21:25:00', 'STOP', 1, GETDATE(), 'DAILY'), + ('PROD_WEEKLY_DTSGSID0', '6:00:00', 'CONTINUE', 1, GETDATE(), 'WEEKLY'), + ('PROD_WEEKLY_DTSGSID1', '6:15:00', 'CONTINUE', 1, GETDATE(), 'WEEKLY'), + ('PROD_WEEKLY_DTSBX202', '7:00:00', 'CONTINUE', 1, GETDATE(), 'WEEKLY'), + ('PROD_WEEKLY_DTSFT202', '8:00:00', 'STOP', 1, GETDATE(), 'WEEKLY'), + ('PROD_WEEKLY_DTSBX470', '7:00:00', 'CONTINUE', 1, GETDATE(), 'WEEKLY'), + ('PROD_WEEKLY_DTSBXREJ', '17:00:00', 'CONTINUE', 1, GETDATE(), 'WEEKLY'), + ('PROD_WEEKLY_DTSPDAY7', '19:10:00', 'STOP', 1, GETDATE(), 'WEEKLY'), + ('PROD_WEEKLY_DTSBX122', '19:14:00', 'CONTINUE', 1, GETDATE(), 'WEEKLY'), + ('PROD_WEEKLY_DTSRQ511', '19:14:00', 'CONTINUE', 1, GETDATE(), 'WEEKLY'), + ('PROD_WEEKLY_DTSRQ444', '7:00:00', 'CONTINUE', 1, GETDATE(), 'WEEKLY'), + ('PROD_WEEKLY_DTSRQ126', '9:00:00', 'CONTINUE', 1, GETDATE(), 'WEEKLY'), + ('PROD_MONTHLY_DTSRQ414', '18:15:00', 'STOP', 0, GETDATE(), 'MONTHLY'), + ('PROD_MONTHLY_DTSPMON1', '19:15:00', 'STOP', 0, GETDATE(), 'MONTHLY'), + ('PROD_MONTHLY_DTSCHGVB', '19:26:00', 'CONTINUE', 0, GETDATE(), 'MONTHLY'), + ('PROD_MONTHLY_DTSCHGVR', '19:27:00', 'STOP', 0, GETDATE(), 'MONTHLY'), + ('PROD_MONTHLY_DTSVBKUP', '19:26:00', 'CONTINUE', 0, GETDATE(), 'MONTHLY'), + ('PROD_MONTHLY_DTSVRSTR', '19:30:00', 'STOP', 0, GETDATE(), 'MONTHLY'), + ('PROD_MONTHLY_DTSRQ442', '19:37:00', 'CONTINUE', 0, GETDATE(), 'MONTHLY'), + ('PROD_MONTHLY_DTSBX460', '19:35:00', 'CONTINUE', 0, GETDATE(), 'MONTHLY'), + ('PROD_MONTHLY_DTSRQ513', '19:37:00', 'CONTINUE', 0, GETDATE(), 'MONTHLY'), + ('PROD_MONTHLY_DTSCHGDC', '13:00:00', 'CONTINUE', 0, GETDATE(), 'MONTHLY'); \ No newline at end of file diff --git a/SqlAgent/v1/03_Prod/1_Database_Setup/InsertJobDependencies.sql b/SqlAgent/v1/03_Prod/1_Database_Setup/InsertJobDependencies.sql new file mode 100644 index 0000000..a938248 --- /dev/null +++ b/SqlAgent/v1/03_Prod/1_Database_Setup/InsertJobDependencies.sql @@ -0,0 +1,80 @@ +USE [ProdDUTASJobSchedule] +GO + +TRUNCATE TABLE [dbo].[JobDependencies]; + +INSERT INTO [dbo].[JobDependencies] ( + [JobName], + [PredecessorJobName] +) +VALUES +('PROD_DAILY_DTSGSID0','PROD_DAILY_DTSBX305'), +('PROD_DAILY_GSIRQ300','PROD_DAILY_DTSBX305'), +('PROD_DAILY_DTSRQ202','PROD_DAILY_GSIRQ300'), +('PROD_DAILY_DTSGSID1','PROD_DAILY_GSIRQ300'), +('PROD_DAILY_DTSBX202','PROD_DAILY_GSIRQ300'), +('PROD_DAILY_DTSFT202','PROD_DAILY_GSIRQ300'), +('PROD_DAILY_DTSBX432','PROD_DAILY_GSIRQ300'), +('PROD_DAILY_DTSGACHD','PROD_DAILY_GSIRQ300'), +('PROD_DAILY_DTSBX303','PROD_DAILY_GSIRQ300'), +('PROD_DAILY_DTSGWAGE','PROD_DAILY_GSIRQ300'), +('PROD_DAILY_DTSGCHKS','PROD_DAILY_GSIRQ300'), +('PROD_DAILY_DTSESDAY','PROD_DAILY_GSIRQ300'), +('PROD_DAILY_DTSGPAYT','PROD_DAILY_GSIRQ300'), +('PROD_DAILY_DTSDX145','PROD_DAILY_GSIRQ300'), +('PROD_DAILY_DTSBX629','PROD_DAILY_GSIRQ300'), +('PROD_DAILY_DTSBX630','PROD_DAILY_DTSBX629'), +('PROD_DAILY_DTSFRAUD','PROD_DAILY_DTSBX629'), +('PROD_DAILY_DTSRACHD','PROD_DAILY_DTSFRAUD'), +('PROD_DAILY_DTSBXACH','PROD_DAILY_DTSFRAUD'), +('PROD_DAILY_DTSBXREG','PROD_DAILY_DTSFRAUD'), +('PROD_DAILY_DTSBX430','PROD_DAILY_DTSFRAUD'), +('PROD_DAILY_DTSBX626','PROD_DAILY_DTSFRAUD'), +('PROD_DAILY_DTSBX530','PROD_DAILY_DTSFRAUD'), +('PROD_DAILY_DTSBXREL','PROD_DAILY_DTSFRAUD'), +('PROD_DAILY_DTSBX450','PROD_DAILY_DTSBXACH'), +('PROD_DAILY_DTSBX450','PROD_DAILY_DTSBXREG'), +('PROD_DAILY_DTSBX450','PROD_DAILY_DTSBX430'), +('PROD_DAILY_DTSBX450','PROD_DAILY_DTSBX626'), +('PROD_DAILY_DTSBX450','PROD_DAILY_DTSBX530'), +('PROD_DAILY_DTSBX450','PROD_DAILY_DTSBXREL'), +('PROD_DAILY_DTSBX451','PROD_DAILY_DTSBXACH'), +('PROD_DAILY_DTSBX451','PROD_DAILY_DTSBXREG'), +('PROD_DAILY_DTSBX451','PROD_DAILY_DTSBX430'), +('PROD_DAILY_DTSBX451','PROD_DAILY_DTSBX626'), +('PROD_DAILY_DTSBX451','PROD_DAILY_DTSBX530'), +('PROD_DAILY_DTSBX451','PROD_DAILY_DTSBXREL'), +('PROD_DAILY_DTSPACHD','PROD_DAILY_DTSBX450'), +('PROD_DAILY_DTSPACHD','PROD_DAILY_DTSBX451'), +('PROD_DAILY_DTSPX148','PROD_DAILY_DTSPACHD'), +('PROD_DAILY_DTSRQ325','PROD_DAILY_DTSPACHD'), +('PROD_DAILY_DTSBX427','PROD_DAILY_DTSPX148'), +('PROD_DAILY_DTSBX427','PROD_DAILY_DTSRQ325'), +('PROD_DAILY_DTSPDAY1','PROD_DAILY_DTSBX427'), +('PROD_DAILY_DTSW4WGE','PROD_DAILY_DTSPDAY1'), +('PROD_DAILY_DTSGSID2','PROD_DAILY_DTSPDAY1'), +('PROD_DAILY_DTSGSID9','PROD_DAILY_DTSPDAY1'), +('PROD_DAILY_DTSMIN01','PROD_DAILY_DTSW4WGE'), +('PROD_DAILY_DTSMIN01','PROD_DAILY_DTSGSID2'), +('PROD_DAILY_DTSMIN01','PROD_DAILY_DTSGSID9'), +('PROD_DAILY_DTSMIN02','PROD_DAILY_DTSW4WGE'), +('PROD_DAILY_DTSMIN02','PROD_DAILY_DTSGSID2'), +('PROD_DAILY_DTSMIN02','PROD_DAILY_DTSGSID9'), +('PROD_DAILY_DTSRQ459','PROD_DAILY_DTSMIN01'), +('PROD_DAILY_DTSRQ459','PROD_DAILY_DTSMIN02'), +('PROD_DAILY_DTSBXPFL','PROD_DAILY_DTSRQ459'), +('PROD_DAILY_DESBD427','PROD_DAILY_DTSBXPFL'), +('PROD_DAILY_DTSBX403','PROD_DAILY_DTSBXPFL'), +('PROD_DAILY_DTSBE405','PROD_DAILY_DTSBXPFL'), +('PROD_DAILY_DTSBX405','PROD_DAILY_DTSBXPFL'), +('PROD_DAILY_DTSRQ335','PROD_DAILY_DTSBXPFL'), +('PROD_DAILY_DTSBX601','PROD_DAILY_DTSRQ335'), +('PROD_WEEKLY_DTSBXREJ','PROD_DAILY_DTSBXREL'), +('PROD_WEEKLY_DTSBX122','PROD_WEEKLY_DTSPDAY7'), +('PROD_WEEKLY_DTSRQ511','PROD_WEEKLY_DTSPDAY7'), +('PROD_MONTHLY_DTSRQ414','PROD_DAILY_DTSPDAY1'), +('PROD_MONTHLY_DTSCHGVB','PROD_MONTHLY_DTSPMON1'), +('PROD_MONTHLY_DTSCHGVR','PROD_MONTHLY_DTSCHGVB'), +('PROD_MONTHLY_DTSVBKUP','PROD_MONTHLY_DTSPMON1'), +('PROD_MONTHLY_DTSVRSTR','PROD_MONTHLY_DTSVBKUP'), +('PROD_MONTHLY_DTSRQ442','PROD_MONTHLY_DTSRQ513'); \ No newline at end of file diff --git a/SqlAgent/v1/03_Prod/2_Stored_Procedures/usp_CheckJobConditions.sql b/SqlAgent/v1/03_Prod/2_Stored_Procedures/usp_CheckJobConditions.sql new file mode 100644 index 0000000..60e8414 Binary files /dev/null and b/SqlAgent/v1/03_Prod/2_Stored_Procedures/usp_CheckJobConditions.sql differ diff --git a/SqlAgent/v1/03_Prod/2_Stored_Procedures/usp_CheckJobConditions_Generic.sql b/SqlAgent/v1/03_Prod/2_Stored_Procedures/usp_CheckJobConditions_Generic.sql new file mode 100644 index 0000000..c0ef0d1 Binary files /dev/null and b/SqlAgent/v1/03_Prod/2_Stored_Procedures/usp_CheckJobConditions_Generic.sql differ diff --git a/SqlAgent/v1/03_Prod/2_Stored_Procedures/usp_CreateSQLAgentJob.sql b/SqlAgent/v1/03_Prod/2_Stored_Procedures/usp_CreateSQLAgentJob.sql new file mode 100644 index 0000000..f6702a8 Binary files /dev/null and b/SqlAgent/v1/03_Prod/2_Stored_Procedures/usp_CreateSQLAgentJob.sql differ diff --git a/SqlAgent/v1/03_Prod/2_Stored_Procedures/usp_ForceComplete.sql b/SqlAgent/v1/03_Prod/2_Stored_Procedures/usp_ForceComplete.sql new file mode 100644 index 0000000..cbd4142 Binary files /dev/null and b/SqlAgent/v1/03_Prod/2_Stored_Procedures/usp_ForceComplete.sql differ diff --git a/SqlAgent/v1/03_Prod/2_Stored_Procedures/usp_ScheduleMonthlyJob.sql b/SqlAgent/v1/03_Prod/2_Stored_Procedures/usp_ScheduleMonthlyJob.sql new file mode 100644 index 0000000..37709c5 Binary files /dev/null and b/SqlAgent/v1/03_Prod/2_Stored_Procedures/usp_ScheduleMonthlyJob.sql differ diff --git a/SqlAgent/v1/03_Prod/2_Stored_Procedures/usp_TriggerMissedJobs.sql b/SqlAgent/v1/03_Prod/2_Stored_Procedures/usp_TriggerMissedJobs.sql new file mode 100644 index 0000000..c5fd42f Binary files /dev/null and b/SqlAgent/v1/03_Prod/2_Stored_Procedures/usp_TriggerMissedJobs.sql differ diff --git a/SqlAgent/v1/03_Prod/2_Stored_Procedures/usp_UpdateJobStatus_Generic.sql b/SqlAgent/v1/03_Prod/2_Stored_Procedures/usp_UpdateJobStatus_Generic.sql new file mode 100644 index 0000000..20c3f41 Binary files /dev/null and b/SqlAgent/v1/03_Prod/2_Stored_Procedures/usp_UpdateJobStatus_Generic.sql differ diff --git a/SqlAgent/v1/03_Prod/3_Job_Maintenance/ActivateMonthlyJob.sql b/SqlAgent/v1/03_Prod/3_Job_Maintenance/ActivateMonthlyJob.sql new file mode 100644 index 0000000..16d0920 --- /dev/null +++ b/SqlAgent/v1/03_Prod/3_Job_Maintenance/ActivateMonthlyJob.sql @@ -0,0 +1,65 @@ +USE msdb; +GO + +-- Schedule PROD Monthly Jobs for October 2025 +------------------------------------------------ +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='PROD_MONTHLY_DTSRQ414', + @Env='PROD', + @RunDate='2025-11-03', + @RunTime='18:15:00'; + +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='PROD_MONTHLY_DTSPMON1', + @Env='PROD', + @RunDate='2025-10-31', + @RunTime='19:15:00'; + +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='PROD_MONTHLY_DTSCHGVB', + @Env='PROD', + @RunDate='2025-10-31', + @RunTime='19:26:00'; + +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='PROD_MONTHLY_DTSCHGVR', + @Env='PROD', + @RunDate='2025-10-31', + @RunTime='19:27:00'; + +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='PROD_MONTHLY_DTSVBKUP', + @Env='PROD', + @RunDate='2025-10-31', + @RunTime='19:26:00'; + +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='PROD_MONTHLY_DTSVRSTR', + @Env='PROD', + @RunDate='2025-10-31', + @RunTime='19:30:00'; + +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='PROD_MONTHLY_DTSRQ442', + @Env='PROD', + @RunDate='2025-10-31', + @RunTime='19:37:00'; + +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='PROD_MONTHLY_DTSBX460', + @Env='PROD', + @RunDate='2025-10-31', + @RunTime='19:35:00'; + +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='PROD_MONTHLY_DTSRQ513', + @Env='PROD', + @RunDate='2025-10-31', + @RunTime='19:37:00'; + +EXEC dbo.usp_ScheduleMonthlyJob + @JobName='PROD_MONTHLY_DTSCHGDC', + @Env='PROD', + @RunDate='2025-11-03', + @RunTime='13:00:00'; +GO diff --git a/SqlAgent/v1/03_Prod/3_Job_Maintenance/AddDailyJobs.sql b/SqlAgent/v1/03_Prod/3_Job_Maintenance/AddDailyJobs.sql new file mode 100644 index 0000000..d0c9796 --- /dev/null +++ b/SqlAgent/v1/03_Prod/3_Job_Maintenance/AddDailyJobs.sql @@ -0,0 +1,279 @@ +USE [msdb] +GO + +-- Execute the stored procedure for each job +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSBX215', + @StartTimeHHMMSS = 40000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSBX305', + @StartTimeHHMMSS = 40000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSGSID0', + @StartTimeHHMMSS = 60000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_GSIRQ300', + @StartTimeHHMMSS = 60500, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSRQ202', + @StartTimeHHMMSS = 61000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSGSID1', + @StartTimeHHMMSS = 61500, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSBX202', + @StartTimeHHMMSS = 70000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSFT202', + @StartTimeHHMMSS = 80000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSBX432', + @StartTimeHHMMSS = 83000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSGACHD', + @StartTimeHHMMSS = 90000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSBX303', + @StartTimeHHMMSS = 100000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSGWAGE', + @StartTimeHHMMSS = 140000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSGCHKS', + @StartTimeHHMMSS = 140500, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSESDAY', + @StartTimeHHMMSS = 140500, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSGPAYT', + @StartTimeHHMMSS = 141000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSDX145', + @StartTimeHHMMSS = 160500, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSBX629', + @StartTimeHHMMSS = 161500, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSBX630', + @StartTimeHHMMSS = 163000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSFRAUD', + @StartTimeHHMMSS = 163000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSRACHD', + @StartTimeHHMMSS = 170000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSBXACH', + @StartTimeHHMMSS = 170000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSBXREG', + @StartTimeHHMMSS = 170000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSBX430', + @StartTimeHHMMSS = 170000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSBX626', + @StartTimeHHMMSS = 170000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSBX530', + @StartTimeHHMMSS = 170000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSBXREL', + @StartTimeHHMMSS = 170000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSBX450', + @StartTimeHHMMSS = 171500, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSBX451', + @StartTimeHHMMSS = 171500, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSPACHD', + @StartTimeHHMMSS = 180000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSPX148', + @StartTimeHHMMSS = 180500, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSRQ325', + @StartTimeHHMMSS = 180500, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSBX427', + @StartTimeHHMMSS = 180700, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSPDAY1', + @StartTimeHHMMSS = 181000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSW4WGE', + @StartTimeHHMMSS = 181500, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSGSID2', + @StartTimeHHMMSS = 181500, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSGSID9', + @StartTimeHHMMSS = 181500, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSMIN01', + @StartTimeHHMMSS = 182000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSMIN02', + @StartTimeHHMMSS = 182000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSRQ459', + @StartTimeHHMMSS = 190000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSBXPFL', + @StartTimeHHMMSS = 190000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DESBD427', + @StartTimeHHMMSS = 190500, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSBX403', + @StartTimeHHMMSS = 200000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSBE405', + @StartTimeHHMMSS = 201500, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSBX405', + @StartTimeHHMMSS = 201500, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSRQ335', + @StartTimeHHMMSS = 210000, + @Env = 'PROD', + @Frequency = 'DAILY'; + +EXEC [dbo].[usp_CreateSQLAgentJob] + @JobName = 'PROD_DAILY_DTSBX601', + @StartTimeHHMMSS = 212500, + @Env = 'PROD', + @Frequency = 'DAILY'; \ No newline at end of file diff --git a/SqlAgent/v1/03_Prod/3_Job_Maintenance/AddMonthlyJobs.sql b/SqlAgent/v1/03_Prod/3_Job_Maintenance/AddMonthlyJobs.sql new file mode 100644 index 0000000..857bd74 --- /dev/null +++ b/SqlAgent/v1/03_Prod/3_Job_Maintenance/AddMonthlyJobs.sql @@ -0,0 +1,76 @@ +USE [msdb]; +GO + +-- Note: Frequency here is used only for description (used for category): MONTHLY +-- By Default Job will be scheduled Mon to Fri at specified time. Please change the schedules as per the requirement. + +-- 1. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'PROD_MONTHLY_DTSRQ414', + @StartTimeHHMMSS = 181500, + @Env = 'PROD', + @Frequency = 'MONTHLY'; + +-- 2. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'PROD_MONTHLY_DTSPMON1', + @StartTimeHHMMSS = 191500, + @Env = 'PROD', + @Frequency = 'MONTHLY'; + +-- 3. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'PROD_MONTHLY_DTSCHGVB', + @StartTimeHHMMSS = 192600, + @Env = 'PROD', + @Frequency = 'MONTHLY'; + +-- 4. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'PROD_MONTHLY_DTSCHGVR', + @StartTimeHHMMSS = 192700, + @Env = 'PROD', + @Frequency = 'MONTHLY'; + +-- 5. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'PROD_MONTHLY_DTSVBKUP', + @StartTimeHHMMSS = 192600, + @Env = 'PROD', + @Frequency = 'MONTHLY'; + +-- 6. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'PROD_MONTHLY_DTSVRSTR', + @StartTimeHHMMSS = 193000, + @Env = 'PROD', + @Frequency = 'MONTHLY'; + +-- 7. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'PROD_MONTHLY_DTSRQ442', + @StartTimeHHMMSS = 193700, + @Env = 'PROD', + @Frequency = 'MONTHLY'; + +-- 8. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'PROD_MONTHLY_DTSBX460', + @StartTimeHHMMSS = 193500, + @Env = 'PROD', + @Frequency = 'MONTHLY'; + +-- 9. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'PROD_MONTHLY_DTSRQ513', + @StartTimeHHMMSS = 193700, + @Env = 'PROD', + @Frequency = 'MONTHLY'; + +-- 10. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'PROD_MONTHLY_DTSCHGDC', + @StartTimeHHMMSS = 130000, + @Env = 'PROD', + @Frequency = 'MONTHLY'; +GO diff --git a/SqlAgent/v1/03_Prod/3_Job_Maintenance/AddOneJob.sql b/SqlAgent/v1/03_Prod/3_Job_Maintenance/AddOneJob.sql new file mode 100644 index 0000000..68cd75b --- /dev/null +++ b/SqlAgent/v1/03_Prod/3_Job_Maintenance/AddOneJob.sql @@ -0,0 +1,9 @@ +USE [msdb] +GO + +-- Create a job that runs Monday-Friday at 4:00 AM +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'PROD_DAILY_DTSBX215', + @StartTimeHHMMSS = 40000, -- For 4:00:00 AM (143000 for 2:30:00 PM) + @Env = 'PROD', + @Frequency = 'DAILY'; \ No newline at end of file diff --git a/SqlAgent/v1/03_Prod/3_Job_Maintenance/AddWeeklyJobs.sql b/SqlAgent/v1/03_Prod/3_Job_Maintenance/AddWeeklyJobs.sql new file mode 100644 index 0000000..409647f --- /dev/null +++ b/SqlAgent/v1/03_Prod/3_Job_Maintenance/AddWeeklyJobs.sql @@ -0,0 +1,81 @@ +USE [msdb] +GO + +-- Note: Frequency here is used only for description (used for category): DAILY, WEEKLY, etc. +-- By Default Job will be scheduled to run on Mon to Fri at specified time. Please change the schedules as per the requirement. +-- 1. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'PROD_WEEKLY_DTSGSID0', + @StartTimeHHMMSS = 60000, + @Env = 'PROD', + @Frequency = 'WEEKLY'; + +-- 2. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'PROD_WEEKLY_DTSGSID1', + @StartTimeHHMMSS = 61500, + @Env = 'PROD', + @Frequency = 'WEEKLY'; + +-- 3. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'PROD_WEEKLY_DTSBX202', + @StartTimeHHMMSS = 70000, + @Env = 'PROD', + @Frequency = 'WEEKLY'; + +-- 4. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'PROD_WEEKLY_DTSFT202', + @StartTimeHHMMSS = 80000, + @Env = 'PROD', + @Frequency = 'WEEKLY'; + +-- 5. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'PROD_WEEKLY_DTSBX470', + @StartTimeHHMMSS = 70000, + @Env = 'PROD', + @Frequency = 'WEEKLY'; + +-- 6. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'PROD_WEEKLY_DTSBXREJ', + @StartTimeHHMMSS = 170000, + @Env = 'PROD', + @Frequency = 'WEEKLY'; + +-- 7. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'PROD_WEEKLY_DTSPDAY7', + @StartTimeHHMMSS = 191000, + @Env = 'PROD', + @Frequency = 'WEEKLY'; + +-- 8. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'PROD_WEEKLY_DTSBX122', + @StartTimeHHMMSS = 191400, + @Env = 'PROD', + @Frequency = 'WEEKLY'; + +-- 9. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'PROD_WEEKLY_DTSRQ511', + @StartTimeHHMMSS = 191400, + @Env = 'PROD', + @Frequency = 'WEEKLY'; + +-- 10. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'PROD_WEEKLY_DTSRQ444', + @StartTimeHHMMSS = 70000, + @Env = 'PROD', + @Frequency = 'WEEKLY'; + +-- 11. +EXEC dbo.usp_CreateSQLAgentJob + @JobName = 'PROD_WEEKLY_DTSRQ126', + @StartTimeHHMMSS = 90000, + @Env = 'PROD', + @Frequency = 'WEEKLY'; \ No newline at end of file diff --git a/SqlAgent/v1/03_Prod/3_Job_Maintenance/DailyJobScheduleLookup.sql b/SqlAgent/v1/03_Prod/3_Job_Maintenance/DailyJobScheduleLookup.sql new file mode 100644 index 0000000..6cfa29c --- /dev/null +++ b/SqlAgent/v1/03_Prod/3_Job_Maintenance/DailyJobScheduleLookup.sql @@ -0,0 +1,86 @@ +/******************************************************************************************** + Section 1: Daily Job Schedule Lookup + -------------------------------------------------------------------------------------------- + Description: + Returns all SQL Agent jobs scheduled to run on a given date, along with their control + status (IsActive) and configured runtime from JobControl. + + Parameters: + @CheckDate - The date to check job schedules for. + + Notes: + • Uses MSDB’s internal schedule definitions (sysschedules, sysjobschedules). + • Supports One-time, Daily, Weekly, and Monthly schedule types. + • Can easily be adapted for DEVL / TEST / PROD by changing @DbName. + +********************************************************************************************/ +USE msdb; +GO + +DECLARE @CheckDate DATE = CAST(GETDATE() AS DATE); -- Change if needed +DECLARE @CheckWeekday INT = DATEPART(WEEKDAY, @CheckDate); +DECLARE @Env SYSNAME = 'PROD'; -- Change for DEVL or TEST +DECLARE @DbName SYSNAME; + +-- Map environment to the right control DB +SET @DbName = CASE @Env + WHEN 'DEVL' THEN 'DevlDUTASJobSchedule' + WHEN 'TEST' THEN 'TestDUTASJobSchedule' + WHEN 'PROD' THEN 'ProdDUTASJobSchedule' + END; + +DECLARE @Sql NVARCHAR(MAX); +SET @Sql = N' +SELECT + j.name AS SQLAgentJobName, + jc.JobName AS ControlJobName, + jc.ScheduledStartTime, + jc.IsActive, + s.name AS ScheduleName, + s.freq_type, + s.freq_interval, + s.freq_subday_type, + s.freq_subday_interval, + s.active_start_date, + CASE s.freq_type + WHEN 1 THEN ''One-time'' + WHEN 4 THEN ''Daily'' + WHEN 8 THEN ''Weekly'' + WHEN 16 THEN ''Monthly'' + ELSE ''Other'' + END AS FrequencyType, + CASE + WHEN s.freq_type = 1 + AND s.active_start_date = CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112)) + THEN 1 + WHEN s.freq_type = 4 + AND s.active_start_date <= CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112)) + THEN 1 + WHEN s.freq_type = 8 -- Weekly + AND (POWER(2, @CheckWeekdayParam - 1) & s.freq_interval) > 0 + THEN 1 + WHEN s.freq_type = 16 -- Monthly + AND DAY(@CheckDateParam) = s.freq_interval + THEN 1 + ELSE 0 + END AS IsScheduledToday +FROM msdb.dbo.sysjobs j +JOIN msdb.dbo.sysjobschedules js ON j.job_id = js.job_id +JOIN msdb.dbo.sysschedules s ON js.schedule_id = s.schedule_id +LEFT JOIN ' + QUOTENAME(@DbName) + '.dbo.JobControl jc ON jc.JobName = j.name +WHERE jc.IsActive = 1 + AND ( + (s.freq_type = 1 AND s.active_start_date = CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112))) -- One-time + OR (s.freq_type = 4 AND s.active_start_date <= CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112))) -- Daily + OR (s.freq_type = 8 AND (POWER(2, @CheckWeekdayParam - 1) & s.freq_interval) > 0) -- Weekly + OR (s.freq_type = 16 AND DAY(@CheckDateParam) = s.freq_interval) -- Monthly + ) +ORDER BY jc.ScheduledStartTime; +'; + +EXEC sp_executesql + @Sql, + N'@CheckDateParam DATE, @CheckWeekdayParam INT', + @CheckDateParam = @CheckDate, + @CheckWeekdayParam = @CheckWeekday; +GO diff --git a/SqlAgent/v1/03_Prod/3_Job_Maintenance/DeactivateMonthlyJob.sql b/SqlAgent/v1/03_Prod/3_Job_Maintenance/DeactivateMonthlyJob.sql new file mode 100644 index 0000000..57c1e61 --- /dev/null +++ b/SqlAgent/v1/03_Prod/3_Job_Maintenance/DeactivateMonthlyJob.sql @@ -0,0 +1,12 @@ +USE ProdDUTASJobSchedule; +GO + +UPDATE dbo.JobControl +SET IsActive = 0 +WHERE Frequency = 'MONTHLY'; +GO + +-- Optional: Verify changes +SELECT JobName, Frequency, IsActive +FROM dbo.JobControl +WHERE Frequency = 'MONTHLY'; diff --git a/SqlAgent/v1/03_Prod/3_Job_Maintenance/DetachDeleteScheduleByName.sql b/SqlAgent/v1/03_Prod/3_Job_Maintenance/DetachDeleteScheduleByName.sql new file mode 100644 index 0000000..c6ddedc --- /dev/null +++ b/SqlAgent/v1/03_Prod/3_Job_Maintenance/DetachDeleteScheduleByName.sql @@ -0,0 +1,13 @@ +-- If you know both the job name and schedule name +DECLARE @JobName NVARCHAR(100) = 'PROD_MONTHLY_DTSCHGDC'; +DECLARE @ScheduleName NVARCHAR(200) = 'PROD_MONTHLY_DTSCHGDC_MonthlySchedule'; +DECLARE @JobId UNIQUEIDENTIFIER; + +-- Get job ID +SELECT @JobId = job_id FROM msdb.dbo.sysjobs WHERE name = @JobName; + +-- Detach from specific job +EXEC msdb.dbo.sp_detach_schedule @job_id = @JobId, @schedule_name = @ScheduleName; + +-- Then delete +EXEC msdb.dbo.sp_delete_schedule @schedule_name = @ScheduleName; diff --git a/SqlAgent/v1/03_Prod/3_Job_Maintenance/ForceCompleteJob.sql b/SqlAgent/v1/03_Prod/3_Job_Maintenance/ForceCompleteJob.sql new file mode 100644 index 0000000..4d12daa --- /dev/null +++ b/SqlAgent/v1/03_Prod/3_Job_Maintenance/ForceCompleteJob.sql @@ -0,0 +1,16 @@ +USE ProdDUTASJobSchedule; +GO + +-- 1. Check today's job status +SELECT JobName, Status, ErrorMessage +FROM dbo.JobExecutionHistory +WHERE RunDate = CAST(GETDATE() AS DATE) +AND JobName = 'DEVL_WEEKLY_DTSGSID1'; + +-- 2. Mark DTSBX305 as manually overridden +EXEC dbo.usp_ForceComplete 'DEVL_WEEKLY_DTSGSID1', 'Neeraj.Kumar'; + +-- 3. Verify the override +SELECT JobName, Status, OverrideBy, OverrideDate +FROM dbo.JobExecutionHistory +WHERE JobName = 'DEVL_WEEKLY_DTSGSID1' AND RunDate = CAST(GETDATE() AS DATE); \ No newline at end of file diff --git a/SqlAgent/v1/03_Prod/3_Job_Maintenance/JobInfo.sql b/SqlAgent/v1/03_Prod/3_Job_Maintenance/JobInfo.sql new file mode 100644 index 0000000..b4a0514 --- /dev/null +++ b/SqlAgent/v1/03_Prod/3_Job_Maintenance/JobInfo.sql @@ -0,0 +1,47 @@ +USE msdb; +GO + +PRINT '================================================================================'; +PRINT 'SECTION 1: JOB CONTROL INFORMATION'; +PRINT '================================================================================'; +GO + +-- View all active jobs +SELECT JobName, ScheduledStartTime, Frequency, IsActive +FROM ProdDUTASJobSchedule.dbo.JobControl +WHERE IsActive = 1 +ORDER BY Frequency, ScheduledStartTime; +GO + +-- View all inactive jobs +SELECT JobName, Frequency, ScheduledStartTime +FROM ProdDUTASJobSchedule.dbo.JobControl +WHERE IsActive = 0 +ORDER BY Frequency; +GO + +-- Find weekly/monthly jobs +SELECT JobName, Frequency, ScheduledStartTime +FROM ProdDUTASJobSchedule.dbo.JobControl +WHERE Frequency IN ('WEEKLY', 'MONTHLY') +ORDER BY Frequency, ScheduledStartTime; +GO + +PRINT '================================================================================'; +PRINT 'SECTION 2: JOB DEPENDENCIES'; +PRINT '================================================================================'; +GO + +-- Check dependencies for a job +DECLARE @Job NVARCHAR(100) = 'PROD_MONTHLY_DTSCHGVR'; +SELECT JobName, PredecessorJobName +FROM ProdDUTASJobSchedule.dbo.JobDependencies +WHERE JobName = @Job; +GO + +-- Show dependency chain overview +SELECT d.JobName, d.PredecessorJobName, jc.ScheduledStartTime, jc.Frequency +FROM ProdDUTASJobSchedule.dbo.JobDependencies d +JOIN ProdDUTASJobSchedule.dbo.JobControl jc ON d.JobName = jc.JobName +ORDER BY jc.Frequency, jc.ScheduledStartTime; +GO diff --git a/SqlAgent/v1/03_Prod/3_Job_Maintenance/SQLAgentInfo.sql b/SqlAgent/v1/03_Prod/3_Job_Maintenance/SQLAgentInfo.sql new file mode 100644 index 0000000..d63458e --- /dev/null +++ b/SqlAgent/v1/03_Prod/3_Job_Maintenance/SQLAgentInfo.sql @@ -0,0 +1,42 @@ +USE msdb; +GO + +PRINT '================================================================================'; +PRINT 'SECTION 1: SQL AGENT JOB STATUS'; +PRINT '================================================================================'; +GO + +-- List all jobs in SQL Agent +SELECT name AS JobName, enabled, date_created, date_modified +FROM msdb.dbo.sysjobs +ORDER BY name; +GO + +-- Job schedule summary +SELECT j.name AS JobName, s.name AS ScheduleName, + s.enabled, s.freq_type, s.active_start_date, s.active_start_time +FROM msdb.dbo.sysjobs j +JOIN msdb.dbo.sysjobschedules js ON j.job_id = js.job_id +JOIN msdb.dbo.sysschedules s ON js.schedule_id = s.schedule_id +ORDER BY j.name; +GO + +-- Last job run details +SELECT j.name AS JobName, + h.run_status, + CASE h.run_status + WHEN 0 THEN 'Failed' + WHEN 1 THEN 'Succeeded' + WHEN 2 THEN 'Retry' + WHEN 3 THEN 'Canceled' + WHEN 4 THEN 'In Progress' + END AS StatusDescription, + msdb.dbo.agent_datetime(h.run_date, h.run_time) AS RunDateTime, + h.run_duration +FROM dbo.sysjobs j +LEFT JOIN dbo.sysjobhistory h ON j.job_id = h.job_id +WHERE h.instance_id IN ( + SELECT MAX(instance_id) FROM dbo.sysjobhistory GROUP BY job_id +) +ORDER BY RunDateTime DESC; +GO \ No newline at end of file diff --git a/SqlAgent/v1/03_Prod/3_Job_Maintenance/TodaysExecution.sql b/SqlAgent/v1/03_Prod/3_Job_Maintenance/TodaysExecution.sql new file mode 100644 index 0000000..e116c74 --- /dev/null +++ b/SqlAgent/v1/03_Prod/3_Job_Maintenance/TodaysExecution.sql @@ -0,0 +1,21 @@ +USE ProdDUTASJobSchedule; +GO + +DECLARE @Runday DATE = DATEADD(day, +0, CAST(GETDATE() AS DATE)); -- -1 for Yesterday + +SELECT + jeh.ExecutionID, + jeh.JobName, + jeh.RunDate, + jc.ScheduledStartTime, + jeh.ActualStartTime, + jeh.ActualEndTime, + jeh.Status, + jeh.ErrorMessage, + jeh.OverrideFlag, + jeh.OverrideBy +FROM dbo.JobExecutionHistory jeh +INNER JOIN dbo.JobControl jc + ON jeh.JobName = jc.JobName +WHERE jeh.RunDate = @Runday +ORDER BY jc.ScheduledStartTime, jeh.ActualStartTime; diff --git a/SqlAgent/v1/03_Prod/3_Job_Maintenance/TriggerMissedJob.sql b/SqlAgent/v1/03_Prod/3_Job_Maintenance/TriggerMissedJob.sql new file mode 100644 index 0000000..950d722 --- /dev/null +++ b/SqlAgent/v1/03_Prod/3_Job_Maintenance/TriggerMissedJob.sql @@ -0,0 +1,9 @@ +USE [ProdDUTASJobSchedule] +GO + +-- 1. Preview missed jobs (safe, no run): + EXEC dbo.usp_TriggerMissedJobs @DryRun = 1; + +-- 2. Actually trigger missed jobs: + EXEC dbo.usp_TriggerMissedJobs @DryRun = 0; + diff --git a/SqlAgent/v1/03_Prod/4_PowerShell_Scripts/Backup-SQLAgentJobs.ps1 b/SqlAgent/v1/03_Prod/4_PowerShell_Scripts/Backup-SQLAgentJobs.ps1 new file mode 100644 index 0000000..f858d64 --- /dev/null +++ b/SqlAgent/v1/03_Prod/4_PowerShell_Scripts/Backup-SQLAgentJobs.ps1 @@ -0,0 +1,16 @@ +# Example PowerShell snippet +$Server = "DOES-DUTAS-SQL1" +$BackupPath = "\\DOES-RAINVM-DEV\E$\Neeraj\SqlAgent\Backup\" +$Timestamp = Get-Date -Format "yyyyMMdd_HHmmss" +$ZipFile = "$BackupPath\SQLAgentJobs_$Timestamp.zip" + +# Make backup folder if not exist +if (-not (Test-Path $BackupPath)) { New-Item -ItemType Directory -Path $BackupPath } + +# Export all jobs as SQL files +sqlcmd -S $Server -Q "EXEC msdb.dbo.sp_help_job" -o "$BackupPath\SQLAgentJobs_$Timestamp.txt" + +# Compress to zip +Compress-Archive -Path "$BackupPath\*" -DestinationPath $ZipFile -Force + +Write-Host "✅ Backup complete: $ZipFile" diff --git a/SqlAgent/v1/03_Prod/4_PowerShell_Scripts/Execute-RemoteJob.ps1 b/SqlAgent/v1/03_Prod/4_PowerShell_Scripts/Execute-RemoteJob.ps1 new file mode 100644 index 0000000..eace0e0 --- /dev/null +++ b/SqlAgent/v1/03_Prod/4_PowerShell_Scripts/Execute-RemoteJob.ps1 @@ -0,0 +1,102 @@ +param( + [Parameter(Mandatory = $true)] + [string]$JobName, + + [Parameter(Mandatory = $true)] + [ValidateSet('DEVL', 'TEST', 'PROD')] + [string]$Env +) + +try { + Write-Host "Starting job $JobName in environment $Env at $(Get-Date)" + + # ------------------------------------------------------------ + # Extract JCL from JobName (ENV_FREQUENCY_JOB pattern) + # ------------------------------------------------------------ + $JCL = $JobName -replace '^[A-Z]+_[A-Z]+_', '' + Write-Host "Extracted JCL: $JCL from JobName: $JobName" -ForegroundColor Yellow + + # ------------------------------------------------------------ + # Environment-specific configuration + # ------------------------------------------------------------ + switch ($Env.ToUpper()) { + 'DEVL' { + $ComputerName = '10.57.110.120' + $DatabaseName = 'DevlDUTASJobSchedule' + } + 'TEST' { + $ComputerName = '10.57.110.141' + $DatabaseName = 'TestDUTASJobSchedule' + } + 'PROD' { + $ComputerName = '10.57.111.120' + $DatabaseName = 'ProdDUTASJobSchedule' + } + default { + throw "Invalid environment specified: $Env" + } + } + + # ------------------------------------------------------------ + # Remote credentials + # (recommend moving credentials to secure vault for production) + # ------------------------------------------------------------ + $username = "DUTASSQLAdminP@does.dcgov.priv" + $password = "4ho@3Pr&Xof8" | ConvertTo-SecureString -AsPlainText -Force + $credential = New-Object System.Management.Automation.PSCredential($username, $password) + + # ------------------------------------------------------------ + # Execute job remotely using the extracted JCL + # ------------------------------------------------------------ + Write-Host "Connecting to remote server $ComputerName ..." + $exitCode = Invoke-Command -ComputerName $ComputerName ` + -Credential $credential ` + -Authentication CredSSP ` + -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck) ` + -ArgumentList $JobName, $JCL, $Env ` + -ScriptBlock { + param($JobName, $JCL, $Env) + + Write-Host "Remote execution - JobName: $JobName, JCL: $JCL, Env: $Env" + + $process = Start-Process -FilePath "powershell.exe" ` + -ArgumentList "-ExecutionPolicy Bypass -File `"E:\PSScript\RCSubmit-Job.ps1`" -JobName `"$JCL`" -Env `"$Env`"" ` + -NoNewWindow -Wait -PassThru + return $process.ExitCode + } + + if ($exitCode -eq 0) { + Write-Host "Job $JobName (JCL: $JCL) completed successfully at $(Get-Date)" -ForegroundColor Green + } else { + Write-Error "Job $JobName (JCL: $JCL) failed with exit code: $exitCode" + } +} +catch { + Write-Error "Job $JobName failed with error: $($_.Exception.Message)" + $exitCode = 1 +} +finally { + # ------------------------------------------------------------ + # Log exit code to the appropriate database + # ------------------------------------------------------------ + try { + $connectionString = "Server=localhost;Database=$DatabaseName;Trusted_Connection=true;" + $connection = New-Object System.Data.SqlClient.SqlConnection($connectionString) + $connection.Open() + + $command = $connection.CreateCommand() + $command.CommandText = @" + INSERT INTO dbo.JobExitCodes (JobName, RunDate, ExitCode, RecordedTime) + VALUES ('$JobName', CAST(GETDATE() AS DATE), $exitCode, GETDATE()); +"@ + $command.ExecuteNonQuery() + $connection.Close() + Write-Host "Exit code $exitCode logged to database $DatabaseName for job $JobName" + } + catch { + $errorMsg = $_.Exception.Message + Write-Host "Failed to log exit code to database $DatabaseName`: $errorMsg" + } +} + +exit $exitCode \ No newline at end of file diff --git a/SqlAgent/v1/03_Prod/4_PowerShell_Scripts/RCSubmit-Job.ps1 b/SqlAgent/v1/03_Prod/4_PowerShell_Scripts/RCSubmit-Job.ps1 new file mode 100644 index 0000000..3fb0c57 --- /dev/null +++ b/SqlAgent/v1/03_Prod/4_PowerShell_Scripts/RCSubmit-Job.ps1 @@ -0,0 +1,108 @@ +param( + [string]$JobName, + [string]$Env +) + +# --- Parameter Validation --- +if (-not $JobName) { + Write-Host "JobName parameter is required" -ForegroundColor Red + exit 1 +} +if (-not $Env) { + Write-Host "Environment (Env) parameter is required" -ForegroundColor Red + exit 1 +} + +# --- Execute Job --- +Write-Host "Submitting job: $JobName in environment: $Env" -ForegroundColor Cyan +$output = & "$env:rcbin\submit.exe" -DSN="DOESTAX.$Env.JOBS.BATCH.LIB($JobName)" +$exitCode = [int]$LASTEXITCODE +$isSuccess = 0 + +# --- Parse SYSLOG Path --- +$syslogPath = $null +$syslogFolder = "Not found" +$content = @() +$summary = @() + +try { + $syslogPath = $output | Select-String -Pattern "SYSLOG=\[(.*)\]" | ForEach-Object { $_.Matches.Groups[1].Value } + + if ($syslogPath -and (Test-Path $syslogPath)) { + $syslogFolder = Split-Path $syslogPath -Parent + $content = Get-Content $syslogPath -ErrorAction Stop + $summary = $content | Select-String -Pattern "%Job Overall Stats:" -Context 0,7 | ForEach-Object { + $_.Context.PostContext | Select-Object -Skip 1 -First 5 + } + } else { + Write-Host "SYSLOG path not found or inaccessible: $syslogPath" -ForegroundColor Yellow + $summary = @("SYSLOG file not found in output", "Raw output:", $output -join "`n") + } +} +catch { + Write-Host "Error processing SYSLOG: $($_.Exception.Message)" -ForegroundColor Yellow + $summary = @("Error reading SYSLOG: $($_.Exception.Message)", "Raw output:", $output -join "`n") +} + +# --- Evaluate Return Codes --- +$successConditions = @( + { $JobName -eq "GSIRQ300" -and $exitCode -eq 50 }, + { $JobName -eq "DTSGWAGE" -and $exitCode -eq 8 }, + { $JobName -eq "DTSGCHKS" -and $exitCode -eq 8 }, + { $JobName -eq "DTSGPAYT" -and $exitCode -eq 8 }, + { $JobName -eq "DTSBXACH" -and $exitCode -eq 2 }, + { $JobName -eq "DTSBXREL" -and $exitCode -eq 2 }, + { $JobName -eq "DTSMIN02" -and $exitCode -eq 4 }, + { $JobName -eq "DTSBE405" -and $exitCode -eq 910 }, + { $JobName -eq "DTSBXREJ" -and $exitCode -eq 4 }, + { $JobName -eq "DTSRQ444" -and $exitCode -eq 4 }, + { $exitCode -eq 0 } +) + +if ($successConditions | Where-Object { & $_ }) { + Write-Host "Job $JobName succeeded with code $exitCode" -ForegroundColor Green + $isSuccess = 0 +} else { + Write-Host "Job $JobName failed with code $exitCode" -ForegroundColor Red + $isSuccess = 1 + # Only use error if we don't have a proper summary + if ($summary.Count -eq 0) { + $summary = @($Error[0]) + } +} + +# --- Email Notification --- +$smtpServer = "smtp4.dc.gov" +$fromEmail = "Dutas@dc.gov" +$toEmail = "neerajk@innovaconsulting.com" +$ccEmail = @("neerajk@innovaconsulting.com") + +$emailBody = @" +
+DUTAS Batch Job: $JobName Execution Report
+==========================================
+$($summary -join "`n")
+==========================================
+
+Return Code: $exitCode
+Status: $(if ($isSuccess -eq 0) { "SUCCESS" } else { "FAILED" })
+JOBLOG Path: $syslogFolder
+
+"@ + +try { + Send-MailMessage -SmtpServer $smtpServer -Port 25 ` + -From $fromEmail -To $toEmail -Cc $ccEmail ` + -Subject "DUTAS-[$Env] Job Status: $JobName - $(if ($isSuccess -eq 0) { 'SUCCESS' } else { 'FAILED' })" ` + -Body $emailBody -BodyAsHtml + Write-Host "Email sent successfully to $toEmail" -ForegroundColor Cyan +} +catch { + Write-Host "Failed to send email: $($_.Exception.Message)" -ForegroundColor Yellow +} + +Write-Host "`n---------------------------------------------" +Write-Host "Job: $JobName | ExitCode: $exitCode | Status: $(if ($isSuccess -eq 0) { 'SUCCESS' } else { 'FAILED' })" +Write-Host "---------------------------------------------`n" + +exit $isSuccess \ No newline at end of file diff --git a/SqlAgent/v1/03_Prod/5_Deployment/Deploy_DEVL_to_TEST.sql b/SqlAgent/v1/03_Prod/5_Deployment/Deploy_DEVL_to_TEST.sql new file mode 100644 index 0000000..2cd3fa5 --- /dev/null +++ b/SqlAgent/v1/03_Prod/5_Deployment/Deploy_DEVL_to_TEST.sql @@ -0,0 +1,15 @@ +DECLARE @SrcDB NVARCHAR(128) = 'DevlDUTASJobSchedule'; +DECLARE @NewDB NVARCHAR(128) = 'TestDUTASJobSchedule'; +DECLARE @Backup NVARCHAR(260) = '\\DOES-RAINVM-DEV\E$\Neeraj\SqlAgent\Backup\' + @SrcDB + '.bak'; + +-- Backup Source +BACKUP DATABASE @SrcDB TO DISK = @Backup WITH INIT, COMPRESSION; + +-- Restore as Target +DECLARE @SQL NVARCHAR(MAX) = ' +RESTORE DATABASE [' + @NewDB + '] +FROM DISK = N''' + @Backup + ''' +WITH MOVE N''' + @SrcDB + ''' TO N''\\DOES-RAINVM-DEV\E$\SQLData\' + @NewDB + '.mdf'', + MOVE N''' + @SrcDB + '_log'' TO N''\\DOES-RAINVM-DEV\E$\SQLLogs\' + @NewDB + '_log.ldf'', + REPLACE;'; +EXEC(@SQL); diff --git a/SqlAgent/v1/03_Prod/5_Deployment/Deploy_TEST_to_PROD.sql b/SqlAgent/v1/03_Prod/5_Deployment/Deploy_TEST_to_PROD.sql new file mode 100644 index 0000000..3cd8de6 --- /dev/null +++ b/SqlAgent/v1/03_Prod/5_Deployment/Deploy_TEST_to_PROD.sql @@ -0,0 +1,15 @@ +DECLARE @SrcDB NVARCHAR(128) = 'TestDUTASJobSchedule'; +DECLARE @NewDB NVARCHAR(128) = 'ProdDUTASJobSchedule'; +DECLARE @Backup NVARCHAR(260) = '\\DOES-RAINVM-DEV\E$\Neeraj\SqlAgent\Backup\' + @SrcDB + '.bak'; + +-- Backup Source +BACKUP DATABASE @SrcDB TO DISK = @Backup WITH INIT, COMPRESSION; + +-- Restore as Target +DECLARE @SQL NVARCHAR(MAX) = ' +RESTORE DATABASE [' + @NewDB + '] +FROM DISK = N''' + @Backup + ''' +WITH MOVE N''' + @SrcDB + ''' TO N''\\DOES-RAINVM-DEV\E$\SQLData\' + @NewDB + '.mdf'', + MOVE N''' + @SrcDB + '_log'' TO N''\\DOES-RAINVM-DEV\E$\SQLLogs\' + @NewDB + '_log.ldf'', + REPLACE;'; +EXEC(@SQL); diff --git a/SqlAgent/v1/Backup/DevlDUTASJobSchedule.bak b/SqlAgent/v1/Backup/DevlDUTASJobSchedule.bak new file mode 100644 index 0000000..dae1376 Binary files /dev/null and b/SqlAgent/v1/Backup/DevlDUTASJobSchedule.bak differ diff --git a/SqlAgent/v1/Backup/ProdDUTASJobSchedule.bak b/SqlAgent/v1/Backup/ProdDUTASJobSchedule.bak new file mode 100644 index 0000000..5fb6c76 Binary files /dev/null and b/SqlAgent/v1/Backup/ProdDUTASJobSchedule.bak differ diff --git a/SqlAgent/v1/Backup/SQLAgentJobs_20251005_111105.txt b/SqlAgent/v1/Backup/SQLAgentJobs_20251005_111105.txt new file mode 100644 index 0000000..fb8eece --- /dev/null +++ b/SqlAgent/v1/Backup/SQLAgentJobs_20251005_111105.txt @@ -0,0 +1,204 @@ +job_id originating_server name enabled description start_step_id category owner notify_level_eventlog notify_level_email notify_level_netsend notify_level_page notify_email_operator notify_netsend_operator notify_page_operator delete_level date_created date_modified version_number last_run_date last_run_time last_run_outcome next_run_date next_run_time next_run_schedule_id current_execution_status current_execution_step current_retry_attempt has_step has_schedule has_target type +------------------------------------ -------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- ------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------- -------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- --------------------- ------------------ -------------------- ----------------- -------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- ------------ ----------------------- ----------------------- -------------- ------------- ------------- ---------------- ------------- ------------- -------------------- ------------------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------- ----------- ------------ ----------- ----------- +C5285419-16D3-4308-8B43-0438F600AF69 DOES-DUTAS-SQL1 DEVL_WEEKLY_DTSBX470 1 Auto-generated DUTAS job. 1 DEVL_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 03:29:29.843 2025-10-05 03:29:29.853 5 0 0 5 20251010 70000 126 4 0 (unknown) 0 3 1 1 1 +F41BDB19-561A-4F5B-A6A1-04EB6367E497 DOES-DUTAS-SQL1 TEST_DAILY_DTSFRAUD 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.023 2025-10-05 10:00:27.037 5 0 0 5 20251006 163000 185 4 0 (unknown) 0 3 1 1 1 +46559055-DE56-4D5B-8CF0-05175ADDD10D DOES-DUTAS-SQL1 TEST_WEEKLY_DTSGSID0 1 Auto-generated DUTAS job. 1 TEST_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:02:05.777 2025-10-05 10:02:05.783 5 0 0 5 20251011 60000 213 4 0 (unknown) 0 3 1 1 1 +7B375D13-EB25-4EDF-B4D4-06287B51C648 DOES-DUTAS-SQL1 DEVL_DAILY_DTSGCHKS 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.467 2025-10-04 14:22:42.473 5 0 0 5 20251006 140500 88 4 0 (unknown) 0 3 1 1 1 +B8DC1ED8-5D9A-4520-B32F-066E3A5BD575 DOES-DUTAS-SQL1 TEST_WEEKLY_DTSBX202 1 Auto-generated DUTAS job. 1 TEST_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:02:05.813 2025-10-05 10:02:05.820 5 0 0 5 20251011 70000 215 4 0 (unknown) 0 3 1 1 1 +36036DFD-68AA-437B-A515-06770374836E DOES-DUTAS-SQL1 PROD_DAILY_DTSBX303 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:53.913 2025-10-05 10:20:53.923 5 0 0 5 20251006 100000 254 4 0 (unknown) 0 3 1 1 1 +10640615-EDDC-4B35-B02C-06C55D26061F DOES-DUTAS-SQL1 DEVL_MONTHLY_DTSBX460 1 Auto-generated DUTAS job. 1 DEVL_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 03:45:28.520 2025-10-05 06:20:09.923 7 0 0 5 20251031 193500 163 4 0 (unknown) 0 3 1 1 1 +9FAC1A72-B0C8-489C-B5D5-07217CD147DE DOES-DUTAS-SQL1 TEST_DAILY_DTSBX432 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:26.843 2025-10-05 10:00:26.853 5 0 0 5 20251006 83000 175 4 0 (unknown) 0 3 1 1 1 +9A1FAB25-31E6-4DA2-99D8-0869AA87CD71 DOES-DUTAS-SQL1 PROD_DAILY_DTSBXREG 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.100 2025-10-05 10:20:54.107 5 0 0 5 20251006 170000 265 4 0 (unknown) 0 3 1 1 1 +FC42676D-FF59-4407-9700-096ACC1FC9D6 DOES-DUTAS-SQL1 PROD_DAILY_DESBD427 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.400 2025-10-05 10:20:54.410 5 0 0 5 20251006 190500 284 4 0 (unknown) 0 3 1 1 1 +75D0C974-87E8-47D9-8117-0D3ECEE17C92 DOES-DUTAS-SQL1 DEVL_DAILY_DTSBE405 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:43.107 2025-10-04 14:22:43.120 5 0 0 5 20251006 201500 118 4 0 (unknown) 0 3 1 1 1 +4166D5ED-0C89-430E-8E7C-0E4F6BBD2B92 DOES-DUTAS-SQL1 DEVL_MONTHLY_DTSRQ442 1 Auto-generated DUTAS job. 1 DEVL_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 03:45:28.500 2025-10-05 06:20:09.910 7 0 0 5 20251031 193700 162 4 0 (unknown) 0 3 1 1 1 +4151B361-8298-429F-B5F2-0EA8586AFCED DOES-DUTAS-SQL1 DEVL_WEEKLY_DTSGSID1 1 Auto-generated DUTAS job. 1 DEVL_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 03:29:29.780 2025-10-05 03:29:29.790 5 20251005 61500 1 20251011 61500 123 4 0 (unknown) 0 3 1 1 1 +BD836BC8-62AC-4843-9AF4-10668B37079D DOES-DUTAS-SQL1 DEVL_DAILY_DTSMIN01 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.983 2025-10-04 14:22:42.993 5 0 0 5 20251006 182000 112 4 0 (unknown) 0 3 1 1 1 +A1FF7B17-B5C5-4650-B3CC-12760723DD75 DOES-DUTAS-SQL1 DEVL_DAILY_DTSFRAUD 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.580 2025-10-04 14:22:42.590 5 0 0 5 20251006 163000 94 4 0 (unknown) 0 3 1 1 1 +877006E2-1CCE-4BF4-8540-129047A1445A DOES-DUTAS-SQL1 PROD_DAILY_DTSW4WGE 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.290 2025-10-05 10:20:54.297 5 0 0 5 20251006 181500 277 4 0 (unknown) 0 3 1 1 1 +10D59D09-F520-401B-AB55-12E471D9EB65 DOES-DUTAS-SQL1 PROD_DAILY_DTSRACHD 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.067 2025-10-05 10:20:54.073 5 0 0 5 20251006 170000 263 4 0 (unknown) 0 3 1 1 1 +A5E7B125-A9DC-4519-8CEC-1334892572E7 DOES-DUTAS-SQL1 TEST_DAILY_DTSDX145 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:26.973 2025-10-05 10:00:26.980 5 0 0 5 20251006 160500 182 4 0 (unknown) 0 3 1 1 1 +952F9F6E-AF2F-4249-899E-1389F391B2EA DOES-DUTAS-SQL1 PROD_DAILY_DTSGACHD 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:53.897 2025-10-05 10:20:53.903 5 0 0 5 20251006 90000 253 4 0 (unknown) 0 3 1 1 1 +B3A717E6-40E5-4F00-8285-150A033977ED DOES-DUTAS-SQL1 PROD_DAILY_DTSPX148 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.227 2025-10-05 10:20:54.233 5 0 0 5 20251006 180500 273 4 0 (unknown) 0 3 1 1 1 +88FE1C54-AD30-4D15-8999-16607FC59625 DOES-DUTAS-SQL1 DEVL_WEEKLY_DTSRQ444 1 Auto-generated DUTAS job. 1 DEVL_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 03:29:29.950 2025-10-05 03:29:29.963 5 0 0 5 20251006 70000 131 4 0 (unknown) 0 3 1 1 1 +156CE1A0-80A6-409A-BE02-169899F5BFB5 DOES-DUTAS-SQL1 PROD_WEEKLY_DTSPDAY7 1 Auto-generated DUTAS job. 1 PROD_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:23:57.500 2025-10-05 10:23:57.510 5 0 0 5 20251010 191000 296 4 0 (unknown) 0 3 1 1 1 +B732745C-2D18-46AF-BA03-170972AED63E DOES-DUTAS-SQL1 DEVL_DAILY_DTSBX215 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.237 2025-10-04 14:22:42.243 5 0 0 5 20251006 40000 76 4 0 (unknown) 0 3 1 1 1 +AA1F0502-FFE6-488C-9554-177E7A8CF368 DOES-DUTAS-SQL1 TEST_DAILY_DTSGSID0 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:26.760 2025-10-05 10:00:26.770 5 0 0 5 20251006 60000 169 4 0 (unknown) 0 3 1 1 1 +41B61ECC-2E31-49D7-BB5B-1890929AF707 DOES-DUTAS-SQL1 PROD_MONTHLY_DTSCHGDC 1 Auto-generated DUTAS job. 1 PROD_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:24:16.440 2025-10-05 10:25:24.447 6 0 0 5 20251103 130000 320 4 0 (unknown) 0 3 1 1 1 +1D2F731D-A86A-4D95-B699-191D1073DF7F DOES-DUTAS-SQL1 PROD_DAILY_DTSGSID9 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.320 2025-10-05 10:20:54.327 5 0 0 5 20251006 181500 279 4 0 (unknown) 0 3 1 1 1 +4A62252E-DB9A-457A-B844-19FBFB47820C DOES-DUTAS-SQL1 TEST_DAILY_DTSPACHD 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.220 2025-10-05 10:00:27.227 5 0 0 5 20251006 180000 195 4 0 (unknown) 0 3 1 1 1 +6FF64E7A-C9A7-49DF-9DD1-1A7996133746 DOES-DUTAS-SQL1 PROD_DAILY_DTSBX430 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.117 2025-10-05 10:20:54.123 5 0 0 5 20251006 170000 266 4 0 (unknown) 0 3 1 1 1 +D67FFB42-D7E6-47D0-BD0D-2077460E0447 DOES-DUTAS-SQL1 DEVL_DAILY_DTSBX451 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.757 2025-10-04 14:22:42.767 5 0 0 5 20251006 171500 103 4 0 (unknown) 0 3 1 1 1 +90235ECB-9DA9-45B6-899E-22983BBAD136 DOES-DUTAS-SQL1 TEST_MONTHLY_DTSCHGDC 1 Auto-generated DUTAS job. 1 TEST_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:03:08.100 2025-10-05 10:04:57.593 6 0 0 5 20251103 130000 243 4 0 (unknown) 0 3 1 1 1 +A7DD02D5-6437-4B89-8BF8-26A7D59E70EE DOES-DUTAS-SQL1 TEST_MONTHLY_DTSVRSTR 1 Auto-generated DUTAS job. 1 TEST_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:03:08.027 2025-10-05 10:04:57.530 6 0 0 5 20251031 193000 239 4 0 (unknown) 0 3 1 1 1 +615267B0-16EC-4E71-B37B-27594609F693 DOES-DUTAS-SQL1 TEST_WEEKLY_DTSGSID1 1 Auto-generated DUTAS job. 1 TEST_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:02:05.793 2025-10-05 10:02:05.803 5 0 0 5 20251011 61500 214 4 0 (unknown) 0 3 1 1 1 +C714EDC5-85B3-4ADA-A31A-2BABC83C2D7E DOES-DUTAS-SQL1 PROD_DAILY_DTSBX450 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.180 2025-10-05 10:20:54.187 5 0 0 5 20251006 171500 270 4 0 (unknown) 0 3 1 1 1 +97BBB790-5D35-4C88-AFDB-2BCF2AD2696D DOES-DUTAS-SQL1 DEVL_MONTHLY_DTSVBKUP 1 Auto-generated DUTAS job. 1 DEVL_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 03:45:28.460 2025-10-05 06:20:09.890 7 0 0 5 20251031 192600 160 4 0 (unknown) 0 3 1 1 1 +A1243350-764D-4658-B624-305D2C1D18DD DOES-DUTAS-SQL1 DEVL_DAILY_DTSGACHD 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.407 2025-10-04 14:22:42.417 5 0 0 5 20251006 90000 85 4 0 (unknown) 0 3 1 1 1 +2CFD84FC-3C83-4440-9BED-305F9ED14F83 DOES-DUTAS-SQL1 DEVL_DAILY_DTSBX430 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.660 2025-10-04 14:22:42.670 5 0 0 5 20251006 170000 98 4 0 (unknown) 0 3 1 1 1 +EBC21AEE-1002-40E5-A075-345FE3CB639E DOES-DUTAS-SQL1 DEVL_DAILY_DTSPX148 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.797 2025-10-04 14:22:42.807 5 0 0 5 20251006 180500 105 4 0 (unknown) 0 3 1 1 1 +3E9963DC-1E32-480E-860A-3517B5624FB1 DOES-DUTAS-SQL1 TEST_DAILY_DTSW4WGE 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.303 2025-10-05 10:00:27.310 5 0 0 5 20251006 181500 200 4 0 (unknown) 0 3 1 1 1 +6E95D0CC-02DB-4102-9696-35F215A41A17 DOES-DUTAS-SQL1 PROD_MONTHLY_DTSCHGVB 1 Auto-generated DUTAS job. 1 PROD_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:24:16.310 2025-10-05 10:25:24.360 6 0 0 5 20251031 192600 313 4 0 (unknown) 0 3 1 1 1 +2A9CF2A5-A9F1-49E6-BE2A-35F3B9D76F4E DOES-DUTAS-SQL1 DEVL_DAILY_DTSGSID9 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.940 2025-10-04 14:22:42.957 5 0 0 5 20251006 181500 111 4 0 (unknown) 0 3 1 1 1 +064444A3-32FA-4614-9FB6-3606A62CCBAA DOES-DUTAS-SQL1 TEST_MONTHLY_DTSRQ442 1 Auto-generated DUTAS job. 1 TEST_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:03:08.043 2025-10-05 10:04:57.547 6 0 0 5 20251031 193700 240 4 0 (unknown) 0 3 1 1 1 +536C71EC-0A27-4248-944B-3997574FB1B1 DOES-DUTAS-SQL1 PROD_WEEKLY_DTSBXREJ 1 Auto-generated DUTAS job. 1 PROD_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:23:57.487 2025-10-05 10:23:57.493 5 0 0 5 20251007 170000 295 4 0 (unknown) 0 3 1 1 1 +550FC0D7-8C25-427E-97C9-3A005F043A11 DOES-DUTAS-SQL1 DEVL_DAILY_DTSBXREL 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.717 2025-10-04 14:22:42.727 5 0 0 5 20251006 170000 101 4 0 (unknown) 0 3 1 1 1 +B7FF8420-ABFB-4780-8152-3B4FF66F551A DOES-DUTAS-SQL1 TEST_MONTHLY_DTSVBKUP 1 Auto-generated DUTAS job. 1 TEST_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:03:08.007 2025-10-05 10:04:57.517 6 0 0 5 20251031 192600 238 4 0 (unknown) 0 3 1 1 1 +6C41D627-1772-4F91-BB1E-3B6941E07C59 DOES-DUTAS-SQL1 TEST_DAILY_DTSBX215 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:26.727 2025-10-05 10:00:26.733 5 0 0 5 20251006 40000 167 4 0 (unknown) 0 3 1 1 1 +F1C6A0CF-EB0E-4A92-980C-3C0A2995D2D9 DOES-DUTAS-SQL1 PROD_WEEKLY_DTSBX122 1 Auto-generated DUTAS job. 1 PROD_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:23:57.517 2025-10-05 10:23:57.523 5 0 0 5 20251010 191400 297 4 0 (unknown) 0 3 1 1 1 +BFAB8693-5290-4893-8BC5-3DD7C801A568 DOES-DUTAS-SQL1 TEST_WEEKLY_DTSFT202 1 Auto-generated DUTAS job. 1 TEST_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:02:05.830 2025-10-05 10:02:05.840 5 0 0 5 20251011 80000 216 4 0 (unknown) 0 3 1 1 1 +AA32CF9E-1DF8-4601-A4B7-4264EB2CC986 DOES-DUTAS-SQL1 TEST_DAILY_DTSBXACH 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.067 2025-10-05 10:00:27.077 5 0 0 5 20251006 170000 187 4 0 (unknown) 0 3 1 1 1 +0598CC66-AB07-4516-9F95-441543A5902F DOES-DUTAS-SQL1 TEST_DAILY_DTSMIN02 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.370 2025-10-05 10:00:27.377 5 0 0 5 20251006 182000 204 4 0 (unknown) 0 3 1 1 1 +F099041E-0708-4E9C-B0B0-44584AFFDC18 DOES-DUTAS-SQL1 DEVL_DAILY_DTSBX202 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.350 2025-10-04 14:22:42.360 5 0 0 5 20251006 70000 82 4 0 (unknown) 0 3 1 1 1 +9CBDDBEB-7079-46D9-8500-45D457D24233 DOES-DUTAS-SQL1 DEVL_DAILY_DTSGPAYT 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.503 2025-10-04 14:22:42.513 5 0 0 5 20251006 141000 90 4 0 (unknown) 0 3 1 1 1 +CDDA1572-745A-41FA-8FB6-4667D12A48E1 DOES-DUTAS-SQL1 TEST_DAILY_DTSRQ335 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.487 2025-10-05 10:00:27.493 5 0 0 5 20251006 210000 211 4 0 (unknown) 0 3 1 1 1 +B6E610CB-68DB-45BC-958F-46FFBE272859 DOES-DUTAS-SQL1 TEST_DAILY_DTSBX626 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.123 2025-10-05 10:00:27.133 5 0 0 5 20251006 170000 190 4 0 (unknown) 0 3 1 1 1 +A9E3475E-6FD2-4878-980B-480B2E11AD0F DOES-DUTAS-SQL1 PROD_MONTHLY_DTSCHGVR 1 Auto-generated DUTAS job. 1 PROD_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:24:16.327 2025-10-05 10:25:24.370 6 0 0 5 20251031 192700 314 4 0 (unknown) 0 3 1 1 1 +2071BF6E-B59B-45DA-9022-48B9184B15F9 DOES-DUTAS-SQL1 TEST_DAILY_DTSGACHD 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:26.863 2025-10-05 10:00:26.870 5 0 0 5 20251006 90000 176 4 0 (unknown) 0 3 1 1 1 +75E64E53-3DB8-4F41-A4BA-48F06C1F6AC4 DOES-DUTAS-SQL1 TEST_WEEKLY_DTSRQ511 1 Auto-generated DUTAS job. 1 TEST_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:02:05.930 2025-10-05 10:02:05.937 5 0 0 5 20251010 191400 221 4 0 (unknown) 0 3 1 1 1 +728A27E6-B743-4AB4-973C-49EDD1241C32 DOES-DUTAS-SQL1 DEVL_MONTHLY_DTSVRSTR 1 Auto-generated DUTAS job. 1 DEVL_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 03:45:28.480 2025-10-05 06:20:09.900 7 0 0 5 20251031 193000 161 4 0 (unknown) 0 3 1 1 1 +5FC8680E-4487-4624-B58A-4C53F10FE239 DOES-DUTAS-SQL1 TEST_DAILY_DTSRQ202 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:26.793 2025-10-05 10:00:26.803 5 0 0 5 20251006 61000 171 4 0 (unknown) 0 3 1 1 1 +53C2E3E1-0310-4F34-9C1E-4EB22327659A DOES-DUTAS-SQL1 DEVL_WEEKLY_DTSBX122 1 Auto-generated DUTAS job. 1 DEVL_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 03:29:29.907 2025-10-05 03:29:29.917 5 0 0 5 20251010 191400 129 4 0 (unknown) 0 3 1 1 1 +BF3153E4-0BB7-45EC-BA76-4F127C85C39B DOES-DUTAS-SQL1 DEVL_DAILY_DTSGSID0 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.273 2025-10-04 14:22:42.283 5 0 0 5 20251006 60000 78 4 0 (unknown) 0 3 1 1 1 +B8E98EBF-3E3E-4852-BC6B-4F4A5482B8D6 DOES-DUTAS-SQL1 DEVL_WEEKLY_DTSBX202 1 Auto-generated DUTAS job. 1 DEVL_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 03:29:29.803 2025-10-05 03:29:29.813 5 20251005 70000 1 20251011 70000 124 4 0 (unknown) 0 3 1 1 1 +AB80935A-7923-4884-BB42-4F6C2694E2CB DOES-DUTAS-SQL1 PROD_WEEKLY_DTSBX202 1 Auto-generated DUTAS job. 1 PROD_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:23:57.440 2025-10-05 10:23:57.447 5 0 0 5 20251011 70000 292 4 0 (unknown) 0 3 1 1 1 +86BF9853-335A-42E9-91E8-4F72DA5EC27E DOES-DUTAS-SQL1 TEST_MONTHLY_DTSBX460 1 Auto-generated DUTAS job. 1 TEST_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:03:08.060 2025-10-05 10:04:57.563 6 0 0 5 20251031 193500 241 4 0 (unknown) 0 3 1 1 1 +FA885530-0AA4-4880-BE06-50E74FB7BA37 DOES-DUTAS-SQL1 DEVL_MONTHLY_DTSPMON1 1 Auto-generated DUTAS job. 1 DEVL_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 03:45:28.400 2025-10-05 06:20:09.850 7 0 0 5 20251031 191500 157 4 0 (unknown) 0 3 1 1 1 +B5451A59-1B3E-4C64-B025-51537E38ED7B DOES-DUTAS-SQL1 DEVL_DAILY_DTSBX405 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:43.130 2025-10-04 14:22:43.140 5 0 0 5 20251006 201500 119 4 0 (unknown) 0 3 1 1 1 +E71803B2-EC19-4463-9D79-5298F6031950 DOES-DUTAS-SQL1 TEST_WEEKLY_DTSBX470 1 Auto-generated DUTAS job. 1 TEST_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:02:05.847 2025-10-05 10:02:05.857 5 0 0 5 20251010 70000 217 4 0 (unknown) 0 3 1 1 1 +11033AFE-6BED-4A1C-9C9B-54103274B43E DOES-DUTAS-SQL1 DEVL_DAILY_DTSBXREG 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.640 2025-10-04 14:22:42.650 5 0 0 5 20251006 170000 97 4 0 (unknown) 0 3 1 1 1 +C7E9FDB1-AF13-4805-87B3-5424CD84B125 DOES-DUTAS-SQL1 TEST_DAILY_DTSPDAY1 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.287 2025-10-05 10:00:27.293 5 0 0 5 20251006 181000 199 4 0 (unknown) 0 3 1 1 1 +34381A3E-ECB3-4476-ADF5-54E116E629EA DOES-DUTAS-SQL1 PROD_DAILY_DTSBXPFL 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.383 2025-10-05 10:20:54.393 5 0 0 5 20251006 190000 283 4 0 (unknown) 0 3 1 1 1 +C6CE495A-578E-456E-8B5E-5766D858F384 DOES-DUTAS-SQL1 TEST_DAILY_DTSBXPFL 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.400 2025-10-05 10:00:27.410 5 0 0 5 20251006 190000 206 4 0 (unknown) 0 3 1 1 1 +0B30D674-265B-4514-A18C-57EDD73D4BEC DOES-DUTAS-SQL1 TEST_MONTHLY_DTSCHGVB 1 Auto-generated DUTAS job. 1 TEST_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:03:07.970 2025-10-05 10:04:57.487 6 0 0 5 20251031 192600 236 4 0 (unknown) 0 3 1 1 1 +83A7137E-908C-45C4-B174-58EB82001E0B DOES-DUTAS-SQL1 TEST_DAILY_DTSBX305 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:26.743 2025-10-05 10:00:26.753 5 0 0 5 20251006 40000 168 4 0 (unknown) 0 3 1 1 1 +2434F3D8-8C81-4E94-B339-5AF863371935 DOES-DUTAS-SQL1 DEVL_MONTHLY_DTSCHGVB 1 Auto-generated DUTAS job. 1 DEVL_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 03:45:28.420 2025-10-05 06:20:09.863 7 0 0 5 20251031 192600 158 4 0 (unknown) 0 3 1 1 1 +56C1727F-85ED-4FE0-87E3-5D1E9CCA6591 DOES-DUTAS-SQL1 PROD_DAILY_DTSGPAYT 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:53.980 2025-10-05 10:20:53.990 5 0 0 5 20251006 141000 258 4 0 (unknown) 0 3 1 1 1 +BC170C37-D12A-4904-9CB1-5DB22222B102 DOES-DUTAS-SQL1 PROD_WEEKLY_DTSRQ444 1 Auto-generated DUTAS job. 1 PROD_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:23:57.550 2025-10-05 10:23:57.557 5 0 0 5 20251006 70000 299 4 0 (unknown) 0 3 1 1 1 +A5B2D39C-8510-4C5E-8739-607974BA4CBB DOES-DUTAS-SQL1 PROD_DAILY_DTSBX427 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.260 2025-10-05 10:20:54.267 5 0 0 5 20251006 180700 275 4 0 (unknown) 0 3 1 1 1 +876ABBCE-EE90-47EB-ACC5-61F1D5FD0519 DOES-DUTAS-SQL1 TEST_DAILY_DTSBX430 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.107 2025-10-05 10:00:27.113 5 0 0 5 20251006 170000 189 4 0 (unknown) 0 3 1 1 1 +C8C3E42A-0243-492D-A783-6653A08A0368 DOES-DUTAS-SQL1 PROD_DAILY_DTSRQ202 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:53.790 2025-10-05 10:20:53.800 5 0 0 5 20251006 61000 248 4 0 (unknown) 0 3 1 1 1 +7933F217-74B9-4C4A-8AF3-67839C7EDF84 DOES-DUTAS-SQL1 TEST_MONTHLY_DTSPMON1 1 Auto-generated DUTAS job. 1 TEST_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:03:07.953 2025-10-05 10:04:57.470 6 0 0 5 20251031 191500 235 4 0 (unknown) 0 3 1 1 1 +F4A097BF-AC22-492A-9A37-6909EC1DA463 DOES-DUTAS-SQL1 TEST_DAILY_DTSGCHKS 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:26.923 2025-10-05 10:00:26.930 5 0 0 5 20251006 140500 179 4 0 (unknown) 0 3 1 1 1 +8B309837-1895-4100-A4E2-6988EC28E14E DOES-DUTAS-SQL1 DEVL_WEEKLY_DTSFT202 1 Auto-generated DUTAS job. 1 DEVL_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 03:29:29.823 2025-10-05 03:29:29.833 5 20251005 80000 1 20251011 80000 125 4 0 (unknown) 0 3 1 1 1 +36EC258B-A54D-4125-966F-6A2A0F823CF4 DOES-DUTAS-SQL1 DEVL_DAILY_DTSBX629 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.543 2025-10-04 14:22:42.553 5 0 0 5 20251006 161500 92 4 0 (unknown) 0 3 1 1 1 +BA19B6C7-E468-4CD9-ABF0-6A87CCB1F812 DOES-DUTAS-SQL1 PROD_DAILY_DTSPACHD 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.210 2025-10-05 10:20:54.220 5 0 0 5 20251006 180000 272 4 0 (unknown) 0 3 1 1 1 +460B5F6E-510A-47AB-9A94-6D41D2DF1A82 DOES-DUTAS-SQL1 PROD_DAILY_DTSBX215 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:53.737 2025-10-05 10:20:53.747 5 0 0 5 20251006 40000 244 4 0 (unknown) 0 3 1 1 1 +099E2E67-96C4-4B6C-989E-6D55BAD75880 DOES-DUTAS-SQL1 DEVL_DAILY_DTSRQ202 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.310 2025-10-04 14:22:42.320 5 0 0 5 20251006 61000 80 4 0 (unknown) 0 3 1 1 1 +A7459ABA-5B05-4516-80B5-6D8EFEDDF734 DOES-DUTAS-SQL1 TEST_MONTHLY_DTSCHGVR 1 Auto-generated DUTAS job. 1 TEST_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:03:07.987 2025-10-05 10:04:57.503 6 0 0 5 20251031 192700 237 4 0 (unknown) 0 3 1 1 1 +283A4108-D148-4EE2-A32D-6E056D95E07A DOES-DUTAS-SQL1 TEST_MONTHLY_DTSRQ513 1 Auto-generated DUTAS job. 1 TEST_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:03:08.080 2025-10-05 10:04:57.580 6 0 0 5 20251031 193700 242 4 0 (unknown) 0 3 1 1 1 +7AA2F36D-54E4-4A0A-83AE-6F42A5C8A975 DOES-DUTAS-SQL1 PROD_DAILY_DTSGSID1 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:53.807 2025-10-05 10:20:53.817 5 0 0 5 20251006 61500 249 4 0 (unknown) 0 3 1 1 1 +63DA7119-1F6D-4F10-B353-7461EB072124 DOES-DUTAS-SQL1 DEVL_DAILY_DTSRQ459 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:43.023 2025-10-04 14:22:43.033 5 0 0 5 20251006 190000 114 4 0 (unknown) 0 3 1 1 1 +1AF63AA4-31A1-4A2D-A428-7533078BD5B3 DOES-DUTAS-SQL1 DEVL_WEEKLY_DTSPDAY7 1 Auto-generated DUTAS job. 1 DEVL_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 03:29:29.887 2025-10-05 03:29:29.897 5 0 0 5 20251010 191000 128 4 0 (unknown) 0 3 1 1 1 +67A5BAB9-29F5-4CA7-A921-755495947167 DOES-DUTAS-SQL1 DEVL_WEEKLY_DTSBXREJ 1 Auto-generated DUTAS job. 1 DEVL_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 03:29:29.867 2025-10-05 03:29:29.877 5 0 0 5 20251007 170000 127 4 0 (unknown) 0 3 1 1 1 +0D2FF6AC-B6E2-4EF7-82D6-75F10FB791C9 DOES-DUTAS-SQL1 DEVL_DAILY_DTSPACHD 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.777 2025-10-04 14:22:42.787 5 0 0 5 20251006 180000 104 4 0 (unknown) 0 3 1 1 1 +59776EAA-3C33-4921-BD61-7B16DFB938FD DOES-DUTAS-SQL1 TEST_DAILY_DTSBX601 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.507 2025-10-05 10:00:27.513 5 0 0 5 20251006 212500 212 4 0 (unknown) 0 3 1 1 1 +9D9FA4F9-AB12-4CF8-9999-7BCC6D59B9A6 DOES-DUTAS-SQL1 DEVL_DAILY_DTSDX145 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.523 2025-10-04 14:22:42.533 5 0 0 5 20251006 160500 91 4 0 (unknown) 0 3 1 1 1 +930FECCB-BCF3-4539-94B1-7CCD8B6F77CD DOES-DUTAS-SQL1 DEVL_MONTHLY_DTSRQ414 1 Auto-generated DUTAS job. 1 DEVL_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 03:45:28.383 2025-10-05 06:20:09.837 7 0 0 5 20251103 181500 156 4 0 (unknown) 0 3 1 1 1 +5294869A-9D5E-4BEB-B3A5-8021B1199292 DOES-DUTAS-SQL1 PROD_DAILY_DTSRQ325 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.243 2025-10-05 10:20:54.250 5 0 0 5 20251006 180500 274 4 0 (unknown) 0 3 1 1 1 +C7FFBAB4-B6A1-4A9A-A656-8413086F4376 DOES-DUTAS-SQL1 PROD_DAILY_DTSBX432 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:53.860 2025-10-05 10:20:53.867 5 0 0 5 20251006 83000 252 4 0 (unknown) 0 3 1 1 1 +73DBC82A-143E-4758-B974-84C0C3629C72 DOES-DUTAS-SQL1 DEVL_MONTHLY_DTSRQ513 1 Auto-generated DUTAS job. 1 DEVL_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 03:45:28.537 2025-10-05 06:20:09.933 7 0 0 5 20251031 193700 164 4 0 (unknown) 0 3 1 1 1 +F7E9BFCE-5129-4E96-9877-856DD8FE093B DOES-DUTAS-SQL1 TEST_DAILY_DTSBX202 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:26.827 2025-10-05 10:00:26.837 5 0 0 5 20251006 70000 173 4 0 (unknown) 0 3 1 1 1 +C84E56C2-29D2-493F-86FC-87B4FF6E4C9F DOES-DUTAS-SQL1 PROD_DAILY_DTSFT202 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:53.843 2025-10-05 10:20:53.850 5 0 0 5 20251006 80000 251 4 0 (unknown) 0 3 1 1 1 +499AC167-D34E-42C0-AA2E-88A0CC6609A9 DOES-DUTAS-SQL1 TEST_DAILY_DTSRQ325 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.253 2025-10-05 10:00:27.260 5 0 0 5 20251006 180500 197 4 0 (unknown) 0 3 1 1 1 +73055B25-67C5-4EED-B82D-89514ED2C146 DOES-DUTAS-SQL1 DEVL_DAILY_DTSBX601 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:43.170 2025-10-04 14:22:43.183 5 0 0 5 20251006 212500 121 4 0 (unknown) 0 3 1 1 1 +153AC23E-6906-414B-ACB2-8AD030903915 DOES-DUTAS-SQL1 PROD_DAILY_DTSMIN02 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.353 2025-10-05 10:20:54.360 5 0 0 5 20251006 182000 281 4 0 (unknown) 0 3 1 1 1 +0D22EC1D-31F3-4197-ACBA-8ADE7CED810F DOES-DUTAS-SQL1 DEVL_DAILY_DTSRQ325 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.817 2025-10-04 14:22:42.827 5 0 0 5 20251006 180500 106 4 0 (unknown) 0 3 1 1 1 +9F826BEC-27C0-42C2-9D4B-8BB7B44AA9A4 DOES-DUTAS-SQL1 PROD_WEEKLY_DTSRQ126 1 Auto-generated DUTAS job. 1 PROD_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:23:57.567 2025-10-05 10:23:57.573 5 0 0 5 20251006 90000 300 4 0 (unknown) 0 3 1 1 1 +927594F0-F42E-4DA8-91F2-8D0AC2F32F3E DOES-DUTAS-SQL1 TEST_WEEKLY_DTSBXREJ 1 Auto-generated DUTAS job. 1 TEST_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:02:05.863 2025-10-05 10:02:05.870 5 0 0 5 20251007 170000 218 4 0 (unknown) 0 3 1 1 1 +AF9148D2-0143-4F5E-88F7-8D74D650CA17 DOES-DUTAS-SQL1 TEST_DAILY_DTSGSID9 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.333 2025-10-05 10:00:27.340 5 0 0 5 20251006 181500 202 4 0 (unknown) 0 3 1 1 1 +1D4A8DA5-DA40-46B6-B9CE-8D9C26FE013C DOES-DUTAS-SQL1 DEVL_DAILY_DTSBXPFL 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:43.043 2025-10-04 14:22:43.057 5 0 0 5 20251006 190000 115 4 0 (unknown) 0 3 1 1 1 +CC754709-D89F-44DC-9139-8E387CAE8EBE DOES-DUTAS-SQL1 syspolicy_purge_history 1 No description available. 1 [Uncategorized (Local)] sa 0 0 0 0 (unknown) (unknown) (unknown) 0 2025-07-16 12:54:00.540 2025-07-16 12:54:00.923 5 20251005 20000 1 20251006 20000 8 4 0 (unknown) 0 3 1 1 1 +54AD7384-17E0-4ECC-9D43-8E3D6005C647 DOES-DUTAS-SQL1 PROD_DAILY_DTSRQ335 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.467 2025-10-05 10:20:54.473 5 0 0 5 20251006 210000 288 4 0 (unknown) 0 3 1 1 1 +8BA0847A-C8BF-4B6F-B645-8EE2EE9DFB00 DOES-DUTAS-SQL1 DEVL_WEEKLY_DTSRQ511 1 Auto-generated DUTAS job. 1 DEVL_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 03:29:29.930 2025-10-05 03:29:29.940 5 0 0 5 20251010 191400 130 4 0 (unknown) 0 3 1 1 1 +0B72ED39-0849-4936-815B-8F53DE1EB95F DOES-DUTAS-SQL1 TEST_DAILY_DTSESDAY 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:26.940 2025-10-05 10:00:26.947 5 0 0 5 20251006 140500 180 4 0 (unknown) 0 3 1 1 1 +AB97E914-0D8F-47B1-97A6-90653EC50821 DOES-DUTAS-SQL1 TEST_DAILY_DTSBX530 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.143 2025-10-05 10:00:27.153 5 0 0 5 20251006 170000 191 4 0 (unknown) 0 3 1 1 1 +64C5E905-91ED-49EC-8AD2-90689303B0AF DOES-DUTAS-SQL1 TEST_DAILY_DTSBX630 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.007 2025-10-05 10:00:27.013 5 0 0 5 20251006 163000 184 4 0 (unknown) 0 3 1 1 1 +247616E3-10C2-4D28-B0FE-912952BF5CD3 DOES-DUTAS-SQL1 PROD_DAILY_DTSRQ459 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.370 2025-10-05 10:20:54.377 5 0 0 5 20251006 190000 282 4 0 (unknown) 0 3 1 1 1 +B744F2CE-5969-4E70-A5BE-91DCE77F3DD7 DOES-DUTAS-SQL1 DEVL_WEEKLY_DTSGSID0 1 Auto-generated DUTAS job. 1 DEVL_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 03:29:29.737 2025-10-05 03:29:29.747 5 20251005 60000 1 20251011 60000 122 4 0 (unknown) 0 3 1 1 1 +E3B1995B-0E6E-467D-8D3E-9229DBE1B0BD DOES-DUTAS-SQL1 PROD_MONTHLY_DTSVBKUP 1 Auto-generated DUTAS job. 1 PROD_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:24:16.343 2025-10-05 10:25:24.380 6 0 0 5 20251031 192600 315 4 0 (unknown) 0 3 1 1 1 +C07AE384-A446-45FE-9973-95E9AF5C040D DOES-DUTAS-SQL1 PROD_DAILY_DTSGSID0 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:53.773 2025-10-05 10:20:53.777 5 0 0 5 20251006 60000 246 4 0 (unknown) 0 3 1 1 1 +43BAD08D-3783-4BA5-9520-962C12992971 DOES-DUTAS-SQL1 TEST_WEEKLY_DTSPDAY7 1 Auto-generated DUTAS job. 1 TEST_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:02:05.897 2025-10-05 10:02:05.903 5 0 0 5 20251010 191000 219 4 0 (unknown) 0 3 1 1 1 +85044141-8128-458D-93F3-963123DD28A6 DOES-DUTAS-SQL1 PROD_DAILY_DTSGWAGE 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:53.930 2025-10-05 10:20:53.940 5 0 0 5 20251006 140000 255 4 0 (unknown) 0 3 1 1 1 +B350EC79-25C1-49D9-A694-982CDC80E7C3 DOES-DUTAS-SQL1 PROD_DAILY_DTSBX630 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.033 2025-10-05 10:20:54.040 5 0 0 5 20251006 163000 261 4 0 (unknown) 0 3 1 1 1 +83BA5AE6-B821-45B5-908B-99FD678BE513 DOES-DUTAS-SQL1 PROD_DAILY_DTSBX403 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.417 2025-10-05 10:20:54.423 5 0 0 5 20251006 200000 285 4 0 (unknown) 0 3 1 1 1 +BAE5384E-419F-4517-8C33-9A96BA6DA226 DOES-DUTAS-SQL1 PROD_DAILY_DTSBX202 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:53.827 2025-10-05 10:20:53.833 5 0 0 5 20251006 70000 250 4 0 (unknown) 0 3 1 1 1 +3D0D4EB8-061D-401F-A637-9AA30C9136EB DOES-DUTAS-SQL1 DEVL_DAILY_DTSBX432 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.390 2025-10-04 14:22:42.397 5 0 0 5 20251006 83000 84 4 0 (unknown) 0 3 1 1 1 +45798112-FFD5-41D7-AD16-9D598E4F6FD8 DOES-DUTAS-SQL1 DEVL_MONTHLY_DTSCHGDC 1 Auto-generated DUTAS job. 1 DEVL_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 03:45:28.557 2025-10-05 06:20:09.947 10 0 0 5 20251103 130000 165 4 0 (unknown) 0 3 1 1 1 +97FF7BB6-2CD9-4A02-9D04-9D66EA0F55CB DOES-DUTAS-SQL1 DEVL_DAILY_DTSBX427 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.837 2025-10-04 14:22:42.847 5 0 0 5 20251006 180700 107 4 0 (unknown) 0 3 1 1 1 +529DB36D-1878-45A5-A01D-9ED68B99DE18 DOES-DUTAS-SQL1 TEST_DAILY_DTSBX629 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:26.990 2025-10-05 10:00:26.997 5 0 0 5 20251006 161500 183 4 0 (unknown) 0 3 1 1 1 +FF2786FD-7F16-4C36-9F2D-9FDC5B356037 DOES-DUTAS-SQL1 DEVL_DAILY_DTSBX626 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.677 2025-10-04 14:22:42.687 5 0 0 5 20251006 170000 99 4 0 (unknown) 0 3 1 1 1 +5D608D3F-BB61-4CA5-A23A-9FED05E34943 DOES-DUTAS-SQL1 PROD_DAILY_DTSBX451 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.197 2025-10-05 10:20:54.203 5 0 0 5 20251006 171500 271 4 0 (unknown) 0 3 1 1 1 +BF71F64A-321C-4570-AB73-A6E797DD6608 DOES-DUTAS-SQL1 TEST_DAILY_DTSBXREL 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.163 2025-10-05 10:00:27.170 5 0 0 5 20251006 170000 192 4 0 (unknown) 0 3 1 1 1 +7F861A9C-1F75-43AD-AC39-A7EAD33E9C59 DOES-DUTAS-SQL1 PROD_DAILY_DTSBX601 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.483 2025-10-05 10:20:54.490 5 0 0 5 20251006 212500 289 4 0 (unknown) 0 3 1 1 1 +8DAD63DB-883B-4176-8132-A913D80EB65E DOES-DUTAS-SQL1 PROD_MONTHLY_DTSRQ414 1 Auto-generated DUTAS job. 1 PROD_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:24:16.277 2025-10-05 10:25:24.330 6 0 0 5 20251103 181500 311 4 0 (unknown) 0 3 1 1 1 +62C7E9A3-776C-4903-A67E-A9393ECEF1F8 DOES-DUTAS-SQL1 PROD_WEEKLY_DTSGSID0 1 Auto-generated DUTAS job. 1 PROD_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:23:57.400 2025-10-05 10:23:57.407 5 0 0 5 20251011 60000 290 4 0 (unknown) 0 3 1 1 1 +8B73E3C4-4E3C-439A-B563-A9EC3E5EF6EF DOES-DUTAS-SQL1 PROD_DAILY_DTSGCHKS 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:53.950 2025-10-05 10:20:53.957 5 0 0 5 20251006 140500 256 4 0 (unknown) 0 3 1 1 1 +DB153758-E84C-4884-AD4D-AC63DA99F5B5 DOES-DUTAS-SQL1 PROD_DAILY_DTSESDAY 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:53.967 2025-10-05 10:20:53.973 5 0 0 5 20251006 140500 257 4 0 (unknown) 0 3 1 1 1 +423347DD-3745-4A7C-A94D-AC70CD19B3D5 DOES-DUTAS-SQL1 DEVL_DAILY_DTSBXACH 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.620 2025-10-04 14:22:42.630 5 0 0 5 20251006 170000 96 4 0 (unknown) 0 3 1 1 1 +2AAA42E1-4DE4-44B7-A16E-ADD32717A89E DOES-DUTAS-SQL1 DEVL_DAILY_DTSGSID2 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.900 2025-10-04 14:22:42.930 5 0 0 5 20251006 181500 110 4 0 (unknown) 0 3 1 1 1 +24B186DE-0368-4C58-A441-AE581CBC8A9E DOES-DUTAS-SQL1 DEVL_DAILY_DTSPDAY1 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.857 2025-10-04 14:22:42.867 5 0 0 5 20251006 181000 108 4 0 (unknown) 0 3 1 1 1 +8B082DEB-F3B7-4084-A8C5-AE866D51C0F8 DOES-DUTAS-SQL1 TEST_DAILY_DTSGSID2 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.320 2025-10-05 10:00:27.327 5 0 0 5 20251006 181500 201 4 0 (unknown) 0 3 1 1 1 +0970D30C-D9DF-4BD3-A32C-AF61BB15A360 DOES-DUTAS-SQL1 DEVL_DAILY_DTSBX403 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:43.087 2025-10-04 14:22:43.100 5 0 0 5 20251006 200000 117 4 0 (unknown) 0 3 1 1 1 +C093537E-1463-4039-AF35-B1AF7D9B3B2E DOES-DUTAS-SQL1 TEST_DAILY_DTSBX450 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.183 2025-10-05 10:00:27.190 5 0 0 5 20251006 171500 193 4 0 (unknown) 0 3 1 1 1 +9BCEA510-F5C5-46D9-AC6E-B2F3EE14E3B3 DOES-DUTAS-SQL1 DEVL_DAILY_DTSRACHD 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.600 2025-10-04 14:22:42.610 5 0 0 5 20251006 170000 95 4 0 (unknown) 0 3 1 1 1 +8FC6F63C-B081-4834-817E-B4B82C6602F1 DOES-DUTAS-SQL1 TEST_DAILY_DTSGSID1 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:26.810 2025-10-05 10:00:26.820 5 0 0 5 20251006 61500 172 4 0 (unknown) 0 3 1 1 1 +43DE06BA-995E-4C20-ADCA-B53E8D5AF0EA DOES-DUTAS-SQL1 DEVL_DAILY_DTSMIN02 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:43.003 2025-10-04 14:22:43.013 5 0 0 5 20251006 182000 113 4 0 (unknown) 0 3 1 1 1 +3585D868-9570-48E8-BD87-B643279E131B DOES-DUTAS-SQL1 PROD_DAILY_DTSBXACH 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.080 2025-10-05 10:20:54.090 5 0 0 5 20251006 170000 264 4 0 (unknown) 0 3 1 1 1 +A7C7C9E7-8616-4286-A049-BC31965C5E6A DOES-DUTAS-SQL1 PROD_DAILY_DTSFRAUD 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.050 2025-10-05 10:20:54.057 5 0 0 5 20251006 163000 262 4 0 (unknown) 0 3 1 1 1 +49701837-43BD-4539-B2C4-BDA3CF7A67D6 DOES-DUTAS-SQL1 DEVL_DAILY_DTSESDAY 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.487 2025-10-04 14:22:42.493 5 0 0 5 20251006 140500 89 4 0 (unknown) 0 3 1 1 1 +8F18764D-5276-47F0-9B93-BF28CF3CDACD DOES-DUTAS-SQL1 DEVL_MONTHLY_DTSCHGVR 1 Auto-generated DUTAS job. 1 DEVL_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 03:45:28.440 2025-10-05 06:20:09.877 7 0 0 5 20251031 192700 159 4 0 (unknown) 0 3 1 1 1 +A684798D-7BAC-4CE0-A747-BFC3DFDDF8FE DOES-DUTAS-SQL1 TEST_MONTHLY_DTSRQ414 1 Auto-generated DUTAS job. 1 TEST_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:03:07.933 2025-10-05 10:04:57.453 6 0 0 5 20251103 181500 234 4 0 (unknown) 0 3 1 1 1 +09C269BA-22FB-448C-987C-C054F69A0F97 DOES-DUTAS-SQL1 PROD_MONTHLY_DTSBX460 1 Auto-generated DUTAS job. 1 PROD_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:24:16.393 2025-10-05 10:25:24.413 6 0 0 5 20251031 193500 318 4 0 (unknown) 0 3 1 1 1 +B20E796F-B4F6-4706-BAE5-C10B7B2A9117 DOES-DUTAS-SQL1 TEST_WEEKLY_DTSRQ444 1 Auto-generated DUTAS job. 1 TEST_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:02:05.950 2025-10-05 10:02:05.957 5 0 0 5 20251006 70000 222 4 0 (unknown) 0 3 1 1 1 +C36D293E-5495-4BA0-8FDF-C304C3A10985 DOES-DUTAS-SQL1 DEVL_DAILY_DTSBX450 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.737 2025-10-04 14:22:42.747 5 0 0 5 20251006 171500 102 4 0 (unknown) 0 3 1 1 1 +6213780E-943E-4170-B314-C45CB376E664 DOES-DUTAS-SQL1 DEVL_DAILY_DTSBX630 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.563 2025-10-04 14:22:42.573 5 0 0 5 20251006 163000 93 4 0 (unknown) 0 3 1 1 1 +687FA883-6690-45F2-B92E-C681FB638E57 DOES-DUTAS-SQL1 PROD_DAILY_DTSBX629 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.017 2025-10-05 10:20:54.023 5 0 0 5 20251006 161500 260 4 0 (unknown) 0 3 1 1 1 +78A53C7B-B1E0-46D2-A220-C6DF7C124C41 DOES-DUTAS-SQL1 PROD_DAILY_DTSBXREL 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.163 2025-10-05 10:20:54.170 5 0 0 5 20251006 170000 269 4 0 (unknown) 0 3 1 1 1 +8FE581C1-DF8F-4574-82E4-C7188BC23B6C DOES-DUTAS-SQL1 TEST_DAILY_DTSRACHD 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.047 2025-10-05 10:00:27.057 5 0 0 5 20251006 170000 186 4 0 (unknown) 0 3 1 1 1 +470206EC-F819-4523-847C-CA7D91D98C55 DOES-DUTAS-SQL1 DEVL_DAILY_DTSBX303 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.427 2025-10-04 14:22:42.437 5 0 0 5 20251006 100000 86 4 0 (unknown) 0 3 1 1 1 +E33445F3-8745-4215-8FB6-CADE2F764C8A DOES-DUTAS-SQL1 PROD_WEEKLY_DTSGSID1 1 Auto-generated DUTAS job. 1 PROD_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:23:57.417 2025-10-05 10:23:57.430 5 0 0 5 20251011 61500 291 4 0 (unknown) 0 3 1 1 1 +365023B6-CBEC-4BC8-B7AC-CD7675E3C3CC DOES-DUTAS-SQL1 PROD_DAILY_DTSPDAY1 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.273 2025-10-05 10:20:54.280 5 0 0 5 20251006 181000 276 4 0 (unknown) 0 3 1 1 1 +E2960946-9C88-4D5B-A50B-CE2AB88EB805 DOES-DUTAS-SQL1 DEVL_DAILY_DTSGWAGE 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.447 2025-10-04 14:22:42.457 5 0 0 5 20251006 140000 87 4 0 (unknown) 0 3 1 1 1 +8E1A15A1-F9AF-43AA-9872-CE3BA5D53D50 DOES-DUTAS-SQL1 TEST_DAILY_DTSGWAGE 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:26.907 2025-10-05 10:00:26.913 5 0 0 5 20251006 140000 178 4 0 (unknown) 0 3 1 1 1 +3CF5C368-E9A3-4084-8FCA-CEB3FA7417DA DOES-DUTAS-SQL1 TEST_DAILY_DTSBX403 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.433 2025-10-05 10:00:27.440 5 0 0 5 20251006 200000 208 4 0 (unknown) 0 3 1 1 1 +A4369291-334F-4E71-9BF4-CEC7B309519A DOES-DUTAS-SQL1 PROD_DAILY_DTSBE405 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.433 2025-10-05 10:20:54.440 5 0 0 5 20251006 201500 286 4 0 (unknown) 0 3 1 1 1 +843386AB-6CB8-4C96-BC30-CFD28B002C88 DOES-DUTAS-SQL1 DEVL_DAILY_DTSBX530 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.697 2025-10-04 14:22:42.707 5 0 0 5 20251006 170000 100 4 0 (unknown) 0 3 1 1 1 +E0B9066E-7219-46DD-AD1F-D02515BBF2F4 DOES-DUTAS-SQL1 TEST_DAILY_DTSBX451 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.203 2025-10-05 10:00:27.210 5 0 0 5 20251006 171500 194 4 0 (unknown) 0 3 1 1 1 +6360559C-F998-42F7-B87E-D10BFB64E0D6 DOES-DUTAS-SQL1 TEST_WEEKLY_DTSRQ126 1 Auto-generated DUTAS job. 1 TEST_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:02:05.970 2025-10-05 10:02:05.980 5 0 0 5 20251006 90000 223 4 0 (unknown) 0 3 1 1 1 +014FA169-2109-4D35-9026-D388EBA8CDF0 DOES-DUTAS-SQL1 TEST_DAILY_GSIRQ300 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:26.780 2025-10-05 10:00:26.787 5 0 0 5 20251006 60500 170 4 0 (unknown) 0 3 1 1 1 +90CB9F96-1943-41A9-8074-D5A97CB0CBDB DOES-DUTAS-SQL1 TEST_DAILY_DESBD427 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.417 2025-10-05 10:00:27.427 5 0 0 5 20251006 190500 207 4 0 (unknown) 0 3 1 1 1 +79CECA7C-7880-415F-849F-D5B0FC3821C8 DOES-DUTAS-SQL1 TEST_DAILY_DTSBX303 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:26.880 2025-10-05 10:00:26.897 5 0 0 5 20251006 100000 177 4 0 (unknown) 0 3 1 1 1 +E0FA50A7-7B81-4708-9D6E-D72B71649C11 DOES-DUTAS-SQL1 DEVL_WEEKLY_DTSRQ126 1 Auto-generated DUTAS job. 1 DEVL_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 03:29:29.973 2025-10-05 03:29:29.983 5 0 0 5 20251006 90000 132 4 0 (unknown) 0 3 1 1 1 +4D969D80-4095-4E94-90F4-D90E2CA44F24 DOES-DUTAS-SQL1 PROD_WEEKLY_DTSBX470 1 Auto-generated DUTAS job. 1 PROD_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:23:57.470 2025-10-05 10:23:57.477 5 0 0 5 20251010 70000 294 4 0 (unknown) 0 3 1 1 1 +F5DFEB96-31F0-4124-AECF-DA48D0A61B3F DOES-DUTAS-SQL1 PROD_DAILY_GSIRQ300 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:53.777 2025-10-05 10:20:53.780 5 0 0 5 20251006 60500 247 4 0 (unknown) 0 3 1 1 1 +53B41E62-3B4C-456C-9EEC-DB1914961816 DOES-DUTAS-SQL1 PROD_MONTHLY_DTSPMON1 1 Auto-generated DUTAS job. 1 PROD_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:24:16.293 2025-10-05 10:25:24.347 6 0 0 5 20251031 191500 312 4 0 (unknown) 0 3 1 1 1 +9D6C28AC-0A09-4510-A80D-DBA2AD18EAD2 DOES-DUTAS-SQL1 PROD_DAILY_DTSGSID2 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.303 2025-10-05 10:20:54.313 5 0 0 5 20251006 181500 278 4 0 (unknown) 0 3 1 1 1 +0241D05B-FCC1-4162-A496-DF8DC82EBCFD DOES-DUTAS-SQL1 TEST_DAILY_DTSBXREG 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.087 2025-10-05 10:00:27.097 5 0 0 5 20251006 170000 188 4 0 (unknown) 0 3 1 1 1 +14BE4DEF-8ED2-4B21-8DD6-DFA061F5D022 DOES-DUTAS-SQL1 DEVL_DAILY_DESBD427 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:43.067 2025-10-04 14:22:43.077 5 0 0 5 20251006 190500 116 4 0 (unknown) 0 3 1 1 1 +76B86F68-AC74-4579-8E6F-E0435691ECEE DOES-DUTAS-SQL1 DEVL_DAILY_DTSRQ335 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:43.150 2025-10-04 14:22:43.160 5 0 0 5 20251006 210000 120 4 0 (unknown) 0 3 1 1 1 +A81A04F5-D0FB-4A1B-ADF0-E07E0D394314 DOES-DUTAS-SQL1 TEST_DAILY_DTSBX405 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.470 2025-10-05 10:00:27.477 5 0 0 5 20251006 201500 210 4 0 (unknown) 0 3 1 1 1 +1AA9F83B-EA82-419E-84A2-E3D75F8E2F44 DOES-DUTAS-SQL1 TEST_DAILY_DTSFT202 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:26.840 2025-10-05 10:00:26.840 5 0 0 5 20251006 80000 174 4 0 (unknown) 0 3 1 1 1 +07FEF44F-28AD-42CD-896D-E56DD3E9FF35 DOES-DUTAS-SQL1 DEVL_DAILY_GSIRQ300 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.290 2025-10-04 14:22:42.300 5 0 0 5 20251006 60500 79 4 0 (unknown) 0 3 1 1 1 +298858BC-0F82-4D1A-B828-E66AD41D6317 DOES-DUTAS-SQL1 PROD_DAILY_DTSMIN01 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.337 2025-10-05 10:20:54.343 5 0 0 5 20251006 182000 280 4 0 (unknown) 0 3 1 1 1 +B94615CC-23A3-4C63-9EA9-E796AECAA175 DOES-DUTAS-SQL1 PROD_MONTHLY_DTSRQ442 1 Auto-generated DUTAS job. 1 PROD_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:24:16.377 2025-10-05 10:25:24.403 6 0 0 5 20251031 193700 317 4 0 (unknown) 0 3 1 1 1 +4AE8B340-0A81-4FCB-9A88-E970A30844AD DOES-DUTAS-SQL1 TEST_WEEKLY_DTSBX122 1 Auto-generated DUTAS job. 1 TEST_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:02:05.913 2025-10-05 10:02:05.920 5 0 0 5 20251010 191400 220 4 0 (unknown) 0 3 1 1 1 +A48B1364-8CF1-4463-BCC9-EA5BF901D743 DOES-DUTAS-SQL1 TEST_DAILY_DTSMIN01 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.350 2025-10-05 10:00:27.360 5 0 0 5 20251006 182000 203 4 0 (unknown) 0 3 1 1 1 +74F6351A-6A9E-4EE6-8AE7-ED0BDB75ADD3 DOES-DUTAS-SQL1 PROD_DAILY_DTSDX145 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:53.997 2025-10-05 10:20:54.007 5 0 0 5 20251006 160500 259 4 0 (unknown) 0 3 1 1 1 +D2394DFA-957C-4922-82EE-ED8DE568084B DOES-DUTAS-SQL1 TEST_DAILY_DTSGPAYT 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:26.957 2025-10-05 10:00:26.963 5 0 0 5 20251006 141000 181 4 0 (unknown) 0 3 1 1 1 +BC5E46A4-8315-4B7D-BD73-EE425D11F69A DOES-DUTAS-SQL1 PROD_DAILY_DTSBX405 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.450 2025-10-05 10:20:54.457 5 0 0 5 20251006 201500 287 4 0 (unknown) 0 3 1 1 1 +5F55E9B1-A3A2-484D-9CC0-EFF2DD081962 DOES-DUTAS-SQL1 TEST_DAILY_DTSPX148 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.237 2025-10-05 10:00:27.243 5 0 0 5 20251006 180500 196 4 0 (unknown) 0 3 1 1 1 +A999E3C9-2462-4939-B9E2-F07A1481370D DOES-DUTAS-SQL1 DEVL_DAILY_DTSW4WGE 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.877 2025-10-04 14:22:42.887 5 0 0 5 20251006 181500 109 4 0 (unknown) 0 3 1 1 1 +5D944F82-95C7-447C-B8CA-F17EC31BB056 DOES-DUTAS-SQL1 TEST_DAILY_DTSBE405 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.450 2025-10-05 10:00:27.460 5 0 0 5 20251006 201500 209 4 0 (unknown) 0 3 1 1 1 +10ECDAAC-03C3-428F-8A3A-F218BB24516C DOES-DUTAS-SQL1 PROD_DAILY_DTSBX626 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.133 2025-10-05 10:20:54.140 5 0 0 5 20251006 170000 267 4 0 (unknown) 0 3 1 1 1 +D44FFDD4-ECF5-44D4-85A7-F4AFDE8540AE DOES-DUTAS-SQL1 DEVL_DAILY_DTSBX305 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.253 2025-10-04 14:22:42.263 5 0 0 5 20251006 40000 77 4 0 (unknown) 0 3 1 1 1 +270BCB97-E53C-4451-8EDD-F579182D2454 DOES-DUTAS-SQL1 PROD_MONTHLY_DTSRQ513 1 Auto-generated DUTAS job. 1 PROD_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:24:16.423 2025-10-05 10:25:24.427 6 0 0 5 20251031 193700 319 4 0 (unknown) 0 3 1 1 1 +85238E5A-B044-46D6-B4EC-F6908947F805 DOES-DUTAS-SQL1 PROD_MONTHLY_DTSVRSTR 1 Auto-generated DUTAS job. 1 PROD_MONTHLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:24:16.360 2025-10-05 10:25:24.393 6 0 0 5 20251031 193000 316 4 0 (unknown) 0 3 1 1 1 +3483AD6C-3907-49EB-A7E3-F7FA200B9F95 DOES-DUTAS-SQL1 PROD_DAILY_DTSBX305 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:53.757 2025-10-05 10:20:53.763 5 0 0 5 20251006 40000 245 4 0 (unknown) 0 3 1 1 1 +3962DEEC-284A-41AC-9EC5-FAA9A1E12A75 DOES-DUTAS-SQL1 DEVL_DAILY_DTSGSID1 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.330 2025-10-04 14:22:42.340 5 0 0 5 20251006 61500 81 4 0 (unknown) 0 3 1 1 1 +A100F4E0-79A0-4119-9A11-FB418E682BEF DOES-DUTAS-SQL1 PROD_DAILY_DTSBX530 1 Auto-generated DUTAS job. 1 PROD_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:20:54.150 2025-10-05 10:20:54.157 5 0 0 5 20251006 170000 268 4 0 (unknown) 0 3 1 1 1 +DCA72C07-504B-48EB-A274-FB588D070EE3 DOES-DUTAS-SQL1 PROD_WEEKLY_DTSFT202 1 Auto-generated DUTAS job. 1 PROD_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:23:57.453 2025-10-05 10:23:57.463 5 0 0 5 20251011 80000 293 4 0 (unknown) 0 3 1 1 1 +E7AC36F3-5BC2-452F-82C4-FBB2B30CC2F3 DOES-DUTAS-SQL1 TEST_DAILY_DTSRQ459 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.383 2025-10-05 10:00:27.393 5 0 0 5 20251006 190000 205 4 0 (unknown) 0 3 1 1 1 +F6004DDB-A977-4CD7-9FCC-FBF2D1751D72 DOES-DUTAS-SQL1 DEVL_DAILY_DTSFT202 1 Auto-generated DUTAS job. 1 DEVL_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-04 14:22:42.370 2025-10-04 14:22:42.380 5 0 0 5 20251006 80000 83 4 0 (unknown) 0 3 1 1 1 +35E11B4F-93C9-4303-8FEC-FF486891A0F0 DOES-DUTAS-SQL1 PROD_WEEKLY_DTSRQ511 1 Auto-generated DUTAS job. 1 PROD_WEEKLY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:23:57.533 2025-10-05 10:23:57.540 5 0 0 5 20251010 191400 298 4 0 (unknown) 0 3 1 1 1 +951D995C-66CC-4F0A-ADF4-FF5E133B017C DOES-DUTAS-SQL1 TEST_DAILY_DTSBX427 1 Auto-generated DUTAS job. 1 TEST_DAILY DOES\DUTASSQLADMINP 2 0 0 0 (unknown) (unknown) (unknown) 0 2025-10-05 10:00:27.270 2025-10-05 10:00:27.277 5 0 0 5 20251006 180700 198 4 0 (unknown) 0 3 1 1 1 diff --git a/SqlAgent/v1/Backup/SQLAgentJobs_20251005_111105.zip b/SqlAgent/v1/Backup/SQLAgentJobs_20251005_111105.zip new file mode 100644 index 0000000..af6f3fe Binary files /dev/null and b/SqlAgent/v1/Backup/SQLAgentJobs_20251005_111105.zip differ diff --git a/SqlAgent/v1/Backup/TestDUTASJobSchedule.bak b/SqlAgent/v1/Backup/TestDUTASJobSchedule.bak new file mode 100644 index 0000000..c5c30f6 Binary files /dev/null and b/SqlAgent/v1/Backup/TestDUTASJobSchedule.bak differ diff --git a/SqlAgent/v1/DUTASJobSchedule_Configuration_Document_v0.1.docx b/SqlAgent/v1/DUTASJobSchedule_Configuration_Document_v0.1.docx new file mode 100644 index 0000000..d16aaf8 Binary files /dev/null and b/SqlAgent/v1/DUTASJobSchedule_Configuration_Document_v0.1.docx differ diff --git a/SqlAgent/v1/DUTAS_SQLAgent_Config_v0.2.docx b/SqlAgent/v1/DUTAS_SQLAgent_Config_v0.2.docx new file mode 100644 index 0000000..5d4a185 Binary files /dev/null and b/SqlAgent/v1/DUTAS_SQLAgent_Config_v0.2.docx differ diff --git a/SqlAgent/v1/README.md b/SqlAgent/v1/README.md new file mode 100644 index 0000000..4ccaaf2 --- /dev/null +++ b/SqlAgent/v1/README.md @@ -0,0 +1,430 @@ +**Master Configuration Document -- SQL Agent Scheduler** + +1. **Summary** + +This document captures the design for the DUTAS Batch Job Scheduling +system on SQL Server. It includes database architecture, schema, stored +procedures, SQL Agent job patterns, PowerShell scripts, maintenance +procedures, and examples. The aim is to provide a knowledge document for +operations, development, and handover. + +2. **Architecture Overview** + +High-level components: + +- SQL Server instance: DOES-DUTAS-SQL1 hosting Devl/Test/Prod job + scheduling databases and SQL Agent (msdb). + +- Environment databases: DevlDUTASJobSchedule, TestDUTASJobSchedule, + ProdDUTASJobSchedule. + +- SQL Agent Jobs for each JobControl entry (3-step structure). + +- PowerShell scripts for remote job execution and logging. + +- Operator stored procedures for overrides and maintenance. + ++-------------+--------------------------------------------------------+ +| ** | **Description** | +| Component** | | ++=============+========================================================+ +| **SQL | Centralized instance hosting all environment databases | +| Server | and SQL Agent Jobs (DOES-DUTAS-SQL1). | +| Instance** | | ++-------------+--------------------------------------------------------+ +| ** | Each environment has its own job scheduling database: | +| Databases** | | +| | • DevlDUTASJobSchedule | +| | | +| | • TestDUTASJobSchedule | +| | | +| | • ProdDUTASJobSchedule | ++-------------+--------------------------------------------------------+ +| **SQL | Manages the execution of scheduled jobs. Each job is | +| Agent** | linked to stored procedures for conditional execution | +| | and status tracking. | ++-------------+--------------------------------------------------------+ +| * | Used for remote job triggering, job submission, and | +| *PowerShell | maintenance automation. | +| Scripts** | | ++-------------+--------------------------------------------------------+ +| **Backup | Automated PowerShell process backs up all SQL Agent | +| Process** | job definitions and configurations. | ++-------------+--------------------------------------------------------+ + +**Job Steps (Generic Job Template)** + +Every job in SQL Agent created by usp_CreateSQLAgentJob follows 3 steps: + + ------------------------------------------------------------------------------ + **Step** **Description** **Subsystem** + ---------------- --------------------------------------------- --------------- + **1. Check Runs usp_CheckJobConditions_Generic \@JobName T-SQL + Conditions** + + **2. Run Job Executes PowerShell job file using CmdExec + Script** Execute-RemoteJob.ps1 --Jobname -Env + + **3. Update Logs job outcome via T-SQL + Execution usp_UpdateJobStatus_Generic \@JobName + Status** + ------------------------------------------------------------------------------ + +3. **Database Schema** + +Database: DevlDUTASJobSchedule (same schema for Test/Prod) + +**3.1 Tables and DDL (key tables):** + + ------------------------------------------------------------------------------ + **Table** **Purpose** + ------------------------- ---------------------------------------------------- + **JobControl** Master list of all jobs, their type + (Daily/Weekly/Monthly), command behavior, active + status, and frequency. + + **JobDependencies** Defines predecessor-successor relationships among + jobs. Used to determine sequencing and dependency + checks. + + **JobExitCodes** Logs job completion codes (0 = success, 1 = failure) + per execution date. + + **JobExecutionHistory** Stores audit trail of all job runs with timestamps, + exit codes, and trigger source. + + **FederalHolidays** Contains all non-working dates used by scheduling + logic (e.g., skip runs on holidays). + ------------------------------------------------------------------------------ + +**3.1.1 JobControl** + + --------------------------------------------------------------------------- + **Column** **Description** + ------------------------ -------------------------------------------------- + **JobName** Unique identifier (e.g., DEVL_DAILY_DTSRQ001). + + **ScheduledStartTime** Scheduled start time (HH:MM format). + + **SchedulerAction** Indicates if job should STOP or CONTINUE next in + chain. + + **IsActive** 1 = Enabled, 0 = Disabled. + + **Frequency** DAILY, WEEKLY, or MONTHLY. (ONDEMAND) + + **CreatedDate** Job Creation Date + --------------------------------------------------------------------------- + +**3.1.2 JobDependencies** + + ---------------------------------------------------------------------------- + **Column** **Description** + -------------------- ------------------------------------------------------- + **JobName** The dependent job. + + **PredecessorJob** Job that must complete successfully before current job + executes. + ---------------------------------------------------------------------------- + +**3.1.3 JobExecutionHistory** + + ------------------------------------------------------------------------------------------ + **Column Name** **Data Type** **Allow **Default / **Description** + NULLs** Constraint** + ------------------------ ---------------- --------- -------------------- ----------------- + **ExecutionID** INT (IDENTITY) No Primary Key Unique identifier + (auto-increment) for each job + execution record. + + **JobName** VARCHAR(50) No --- Name of the job + as defined in + JobControl or SQL + Agent. + + **RunDate** DATE No --- Scheduled date + for the job run. + + **ScheduledStartTime** TIME No --- Time the job was + scheduled to + start. + + **ActualStartTime** DATETIME Yes NULL by default The actual time + when the job + started. + + **ActualEndTime** DATETIME Yes NULL by default The actual time + when the job + completed. + + **Status** VARCHAR(20) Yes Default \'Pending\', Indicates current + constrained to execution status. + (\'Pending\', + \'Running\', + \'Success\', + \'Failed\', + \'ForceComplete\') + + **ErrorMessage** VARCHAR(MAX) Yes NULL by default Error message + captured for + failed runs. + + **OverrideFlag** BIT Yes Default 0 Flag indicating + if job status was + manually + overridden. + + **OverrideBy** VARCHAR(100) Yes NULL by default Name of user or + process who + overrode the + status. + + **OverrideDate** DATETIME Yes NULL by default Timestamp when + the override was + applied. + ------------------------------------------------------------------------------------------ + +**3.1.4 JobExitCodes** + + ------------------------------------------------------------------------------------- + **Column Name** **Data Type** **Allow **Default / **Description** + NULLs** Constraint** + -------------------- --------------- --------- ------------------ ------------------- + **JobExecutionID** INT (IDENTITY) No Primary Key Unique identifier + (auto-increment) for each job + execution record + logged by + PowerShell. + + **JobName** NVARCHAR(128) No --- Name of the + executed SQL or + batch job. + + **RunDate** DATE No --- Date when the job + ran. + + **ExitCode** INT No --- Exit code returned + by PowerShell or + job execution + process. + + **RecordedTime** DATETIME No Default GETDATE() Timestamp when exit + code was recorded. + ------------------------------------------------------------------------------------- + +**3.1.5 FederalHoliday** + + ----------------------------------------------------------------------------------- + **Column Name** **Data Type** **Allow **Default / **Description** + NULLs** Constraint** + ----------------- -------------- --------- ------------------ --------------------- + **HolidayID** INT (IDENTITY) No Primary Key Unique identifier for + (auto-increment) each holiday entry. + + **HolidayDate** DATE No Unique constraint The actual date of + the federal holiday. + + **HolidayName** VARCHAR(100) No --- The name of the + holiday (e.g., + "Independence Day"). + + **Year** INT No --- Calendar year the + holiday applies to. + ----------------------------------------------------------------------------------- + +**3.2 Stored Procedures (core) - Source Code & Purpose** + +Below are the finalized stored procedures that implement the logic for +the scheduling system. This section includes the purpose and the final +tested T-SQL for each one. + + ------------------------------------------------------------------------------ + **Stored Procedure** **Description** + ------------------------------------ ----------------------------------------- + **usp_CreateSQLAgentJob** Creates a new SQL Agent job dynamically + from JobControl entries. Default run on + Monday to Friday (modify schedule if + needed manually). + + **usp_ScheduleMonthlyJob** Dynamically attaches or reattaches + one-time monthly job schedules using + \@Env, \@RunDate, and \@RunTime. + + **usp_CheckJobConditions_Generic** Evaluates predecessor job statuses and + environmental conditions before running a + job. + + **usp_UpdateJobStatus_Generic** Updates the job execution outcome + (Success / Failure) in JobControl after + each run. + + **usp_TriggerMissedJobs** Checks for missed executions and triggers + them if required. + + **usp_ForceComplete** Utility to close out jobs manually when + needed for maintenance or re-runs. + ------------------------------------------------------------------------------ + +**3.3 PowerShell Scripts (key)** + +**3.3.1 Execute-RemoteJob.ps1** + +Purpose: Wrapper that invokes remote job and logs exit code to +JobExitCodes table. + +**3.3.2 RCSubmit-Job.ps1** + +Purpose: Runs legacy submit command and evaluates SYSLOG and exit codes. +Customize acceptance list per job. + +**3.3.3 Backup-SQLAgentJobs.ps1** + +Purpose: Exports all SQL Agent jobs as .sql files and zips them. (Used +for job backups prior to promotion) + +**4. Operational Procedures** + +**4.1 Standard Daily Checklist (before 4:00 AM):** + +- Verify SQL Server and SQL Agent services are running. + +- Verify JobControl entries and schedules. + +**4.2 Ad-hoc Maintenance / Override Flow:** + +1. If a job fails (STOP), investigate and fix the root cause. + +2. Re-run the failed job PowerShell or via SSMS. + +3. Run SQL: ForceCompleteJob.sql to mark job force complete. It uses + Stored Procedure: usp_ForceComplete and takes Job Name and Operator + Name as input. + +4. After ad-hoc operations, you can run the jobs that missed scheduled + time start either one by one or you can run + dbo.usp_TriggerMissedJobs to trigger jobs that missed their + scheduled start while failed job resolution was in progress. + +Sample commands: + +\-- Force Complete (example)\ +EXEC dbo.usp_ForceComplete \'DEVL_WEEKLY_DTSGSID1\', \'Neeraj.Kumar\'; + +\-- 1. Preview missed jobs (safe, no run): + +EXEC dbo.usp_TriggerMissedJobs \@DryRun = 1; + +\-- 2. Actually trigger missed jobs: + +EXEC dbo.usp_TriggerMissedJobs \@DryRun = 0; + +**4.3 Monthly Job Scheduling and Execution Process** + +Monthly jobs in the the SQL Agent are designed to run on-demand or on +specific monthly dates rather than on a recurring automated date. + +To maintain control and prevent unintentional executions, all monthly +jobs are kept disabled by default (IsActive = 0) and are only activated +when needed. + + ------------------------------------------------------------------------------ + **Step** **Action** **Script / Procedure Used** **Purpose** + ---------- ------------- ---------------------------------- ------------------ + 1 Review SELECT \* FROM JobControl WHERE Identify jobs to + monthly job Frequency=\'MONTHLY\'; be run this month. + list + + 2 Update run Edit ActivateMonthlyJob.sql Define monthly + date & time execution window. + + 3 Schedule & Run ActivateMonthlyJob.sql Create one-time + activate jobs SQL Agent + schedules. + + 4 Monitor Use JobExecutionHistory table or Track progress and + execution SQL Agent history outcomes. + + 5 Deactivate Run DeactivateMonthlyJob.sql Reset jobs to + jobs post-run inactive state. + ------------------------------------------------------------------------------ + +**4.3.1 Default State: Jobs Disabled** + +- All monthly jobs are initialized in the JobControl table with + IsActive = 0. + +- This ensures that they do not run automatically unless explicitly + scheduled. + +- Frequency is stored as \'MONTHLY\' for identification, but + scheduling depends entirely on the stored procedure. + +Example Query: + +SELECT JobName, IsActive, Frequency + +FROM dbo.JobControl + +WHERE Frequency = \'MONTHLY\'; + +**4.3.2 Activating and Scheduling Monthly Jobs** + +To schedule monthly jobs for the upcoming month (e.g., October or +November), you'll use the ActivateMonthlyJob.sql script. + +- Updates job activation flags (IsActive = 1). + +- Calls the stored procedure usp_ScheduleMonthlyJob to dynamically + create or refresh SQL Agent schedules. + +- Removes any old schedules and replaces them with new, one-time + schedules for the provided date and time. + +> Example Query: +> +> EXEC dbo.usp_ScheduleMonthlyJob +> +> \@JobName = \'DEVL_MONTHLY_DTSCHGVB\', +> +> \@Env = \'DEVL\', +> +> \@RunDate = \'2025-10-31\', +> +> \@RunTime = \'19:26:00\'; + +What it does internally: + +- Identifies the correct environment database: + + - DEVL → DevlDUTASJobSchedule + + - TEST → TestDUTASJobSchedule + + - PROD → ProdDUTASJobSchedule + +- Sets the job as active in JobControl. + +- Detaches and deletes any existing schedule for the job. + +- Creates a **new one-time SQL Agent schedule** for the given + date/time. + +- Reattaches the schedule to the job. + +- Prints confirmation once the job is scheduled. + +> **4.3.3 Post-Run Deactivation** +> +> After monthly jobs finish executing successfully: + +- Deactivate them again to prevent accidental re-runs. + +- This is done using the DeactivateMonthlyJob.sql script. + +Example Query: + +UPDATE dbo.JobControl + +SET IsActive = 0 + +WHERE Frequency = \'MONTHLY\'; diff --git a/SqlAgent/v2/01_Devl/1_Database_Setup/CreateDB.sql b/SqlAgent/v2/01_Devl/1_Database_Setup/CreateDB.sql new file mode 100644 index 0000000..4a9a22c --- /dev/null +++ b/SqlAgent/v2/01_Devl/1_Database_Setup/CreateDB.sql @@ -0,0 +1,83 @@ +-- Create the database +CREATE DATABASE DevlDUTASJobSchedule; +GO + +USE DevlDUTASJobSchedule; +GO + +-- Create the main control table +CREATE TABLE dbo.JobControl +( + JobID INT IDENTITY(1,1) NOT NULL, + JobName VARCHAR(50) NOT NULL, + ScheduledStartTime TIME(7) NOT NULL, + SchedulerAction VARCHAR(10) NOT NULL, -- STOP or CONTINUE + IsActive BIT NOT NULL CONSTRAINT DF_JobControl_IsActive DEFAULT (1), + CreatedDate DATETIME NOT NULL CONSTRAINT DF_JobControl_CreatedDate DEFAULT (GETDATE()), + Frequency CHAR(20) NOT NULL CONSTRAINT DF_JobControl_Frequency DEFAULT ('DAILY'), + FrequencyPattern NVARCHAR(500) NULL, -- JSON scheduling rule + + CONSTRAINT PK_JobControl PRIMARY KEY CLUSTERED (JobID ASC), + CONSTRAINT UQ_JobControl_JobName UNIQUE NONCLUSTERED (JobName ASC), + CONSTRAINT CK_JobControl_SchedulerAction CHECK (SchedulerAction IN ('STOP', 'CONTINUE')) +); +GO + +-- Create job dependencies table +CREATE TABLE dbo.JobDependencies ( + DependencyID INT IDENTITY(1,1) PRIMARY KEY, + JobName VARCHAR(50) NOT NULL, + PredecessorJobName VARCHAR(50) NULL, + FOREIGN KEY (JobName) REFERENCES dbo.JobControl(JobName) +); +GO + +-- Create execution history table +CREATE TABLE dbo.JobExecutionHistory ( + ExecutionID INT IDENTITY(1,1) PRIMARY KEY, + JobName VARCHAR(50) NOT NULL, + RunDate DATE NOT NULL, + ScheduledStartTime TIME NOT NULL, + ActualStartTime DATETIME NULL, + ActualEndTime DATETIME NULL, + Status VARCHAR(20) DEFAULT 'Pending' CHECK (Status IN ('Pending', 'Running', 'Success', 'Failed', 'ForceComplete')), + ErrorMessage VARCHAR(MAX) NULL, + OverrideFlag BIT DEFAULT 0, + OverrideBy VARCHAR(100) NULL, + OverrideDate DATETIME NULL +); +GO + +-- Create holidays table +CREATE TABLE dbo.FederalHolidays ( + HolidayID INT IDENTITY(1,1) PRIMARY KEY, + HolidayDate DATE NOT NULL UNIQUE, + HolidayName VARCHAR(100) NOT NULL, + Year INT NOT NULL +); +GO + +-- Create Exit Code table for PowerShell Script +CREATE TABLE dbo.JobExitCodes +( + JobExecutionID INT IDENTITY(1,1) PRIMARY KEY, -- unique ID per execution + JobName NVARCHAR(128) NOT NULL, -- job name + RunDate DATE NOT NULL, -- date of execution + ExitCode INT NOT NULL, -- exit code from job + RecordedTime DATETIME NOT NULL DEFAULT GETDATE() -- timestamp of execution +); +GO +-- Create JobSchedule table +CREATE TABLE dbo.JobSchedule ( + JobScheduleID INT IDENTITY(1,1) PRIMARY KEY, + JobName VARCHAR(100) NOT NULL, + Frequency VARCHAR(20) CHECK (Frequency IN ('Monthly','Quarterly')), + ScheduledRule NVARCHAR(500) NULL, -- Copy of JSON or rule text from JobControl + ScheduledDate DATE NOT NULL, -- Planned date (before adjustment) + AdjustedRunDate DATE NOT NULL, -- Final working-day adjusted date + MonthOfSchedule CHAR(7) NOT NULL, -- 'YYYY-MM' + YearOfSchedule INT NOT NULL, + CreatedOn DATETIME DEFAULT GETDATE(), + CreatedBy VARCHAR(50) DEFAULT SUSER_SNAME() +); +GO \ No newline at end of file diff --git a/SqlAgent/v2/01_Devl/1_Database_Setup/InsertHolidays.sql b/SqlAgent/v2/01_Devl/1_Database_Setup/InsertHolidays.sql new file mode 100644 index 0000000..4122b78 --- /dev/null +++ b/SqlAgent/v2/01_Devl/1_Database_Setup/InsertHolidays.sql @@ -0,0 +1,29 @@ +USE [DevlDUTASJobSchedule] +GO +SET IDENTITY_INSERT [dbo].[FederalHolidays] ON +GO +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (1, CAST(N'2025-01-01' AS Date), N'New Years Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (2, CAST(N'2025-01-20' AS Date), N'Martin Luther King Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (3, CAST(N'2025-02-17' AS Date), N'Presidents Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (4, CAST(N'2025-05-26' AS Date), N'Memorial Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (5, CAST(N'2025-06-19' AS Date), N'Juneteenth Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (6, CAST(N'2025-07-04' AS Date), N'Independence Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (7, CAST(N'2025-09-01' AS Date), N'Labor Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (8, CAST(N'2025-10-13' AS Date), N'Columbus Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (9, CAST(N'2025-11-11' AS Date), N'Veterans Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (10, CAST(N'2025-11-27' AS Date), N'Thanksgiving Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (11, CAST(N'2025-12-25' AS Date), N'Christmas Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (12, CAST(N'2026-01-01' AS Date), N'New Years Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (13, CAST(N'2026-01-19' AS Date), N'Martin Luther King Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (14, CAST(N'2026-02-16' AS Date), N'Presidents Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (15, CAST(N'2026-05-25' AS Date), N'Memorial Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (16, CAST(N'2026-06-19' AS Date), N'Juneteenth Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (17, CAST(N'2026-07-03' AS Date), N'Independence Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (18, CAST(N'2026-09-07' AS Date), N'Labor Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (19, CAST(N'2026-10-12' AS Date), N'Columbus Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (20, CAST(N'2026-11-11' AS Date), N'Veterans Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (21, CAST(N'2026-11-26' AS Date), N'Thanksgiving Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (22, CAST(N'2026-12-25' AS Date), N'Christmas Day', 2026) +GO +SET IDENTITY_INSERT [dbo].[FederalHolidays] OFF +GO diff --git a/SqlAgent/v2/01_Devl/1_Database_Setup/InsertJobControl.sql b/SqlAgent/v2/01_Devl/1_Database_Setup/InsertJobControl.sql new file mode 100644 index 0000000..9f646af --- /dev/null +++ b/SqlAgent/v2/01_Devl/1_Database_Setup/InsertJobControl.sql @@ -0,0 +1,143 @@ +USE [DevlDUTASJobSchedule] +GO +SET IDENTITY_INSERT [dbo].[JobControl] ON +GO +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (1, N'DEVL_DAILY_DTSBX215', CAST(N'04:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (2, N'DEVL_DAILY_DTSBX305', CAST(N'04:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (3, N'DEVL_DAILY_DTSGSID0', CAST(N'06:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (4, N'DEVL_DAILY_GSIRQ300', CAST(N'06:05:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (5, N'DEVL_DAILY_DTSRQ202', CAST(N'06:10:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (6, N'DEVL_DAILY_DTSGSID1', CAST(N'06:15:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (7, N'DEVL_DAILY_DTSBX202', CAST(N'07:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (8, N'DEVL_DAILY_DTSFT202', CAST(N'08:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (9, N'DEVL_DAILY_DTSBX432', CAST(N'08:30:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (10, N'DEVL_DAILY_DTSGACHD', CAST(N'09:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (11, N'DEVL_DAILY_DTSBX303', CAST(N'10:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (12, N'DEVL_DAILY_DTSGWAGE', CAST(N'14:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (13, N'DEVL_DAILY_DTSGCHKS', CAST(N'14:05:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (14, N'DEVL_DAILY_DTSESDAY', CAST(N'14:05:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (15, N'DEVL_DAILY_DTSGPAYT', CAST(N'14:10:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (16, N'DEVL_DAILY_DTSDX145', CAST(N'16:05:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (17, N'DEVL_DAILY_DTSBX629', CAST(N'16:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (18, N'DEVL_DAILY_DTSBX630', CAST(N'16:30:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (19, N'DEVL_DAILY_DTSFRAUD', CAST(N'16:30:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (20, N'DEVL_DAILY_DTSRACHD', CAST(N'17:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (21, N'DEVL_DAILY_DTSBXACH', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (22, N'DEVL_DAILY_DTSBXREG', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (23, N'DEVL_DAILY_DTSBX430', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (24, N'DEVL_DAILY_DTSBX626', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (25, N'DEVL_DAILY_DTSBX530', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (26, N'DEVL_DAILY_DTSBXREL', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (27, N'DEVL_DAILY_DTSBX450', CAST(N'17:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (28, N'DEVL_DAILY_DTSBX451', CAST(N'17:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (29, N'DEVL_DAILY_DTSPACHD', CAST(N'18:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (30, N'DEVL_DAILY_DTSPX148', CAST(N'18:05:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (31, N'DEVL_DAILY_DTSRQ325', CAST(N'18:05:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (32, N'DEVL_DAILY_DTSBX427', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (33, N'DEVL_DAILY_DTSPDAY1', CAST(N'18:10:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (34, N'DEVL_DAILY_DTSW4WGE', CAST(N'18:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (35, N'DEVL_DAILY_DTSGSID2', CAST(N'18:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (36, N'DEVL_DAILY_DTSGSID9', CAST(N'18:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (37, N'DEVL_DAILY_DTSMIN01', CAST(N'18:20:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (38, N'DEVL_DAILY_DTSMIN02', CAST(N'18:20:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (39, N'DEVL_DAILY_DTSRQ459', CAST(N'19:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (40, N'DEVL_DAILY_DTSBXPFL', CAST(N'19:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (41, N'DEVL_DAILY_DESBD427', CAST(N'19:05:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (42, N'DEVL_DAILY_DTSBX403', CAST(N'20:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (43, N'DEVL_DAILY_DTSBE405', CAST(N'20:15:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (44, N'DEVL_DAILY_DTSBX405', CAST(N'20:15:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (45, N'DEVL_DAILY_DTSRQ335', CAST(N'21:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (46, N'DEVL_DAILY_DTSBX601', CAST(N'21:25:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (47, N'DEVL_WEEKLY_DTSGSID0', CAST(N'06:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Sat","Sun"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (48, N'DEVL_WEEKLY_DTSGSID1', CAST(N'06:15:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Sat","Sun"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (49, N'DEVL_WEEKLY_DTSBX202', CAST(N'07:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Sat","Sun"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (50, N'DEVL_WEEKLY_DTSFT202', CAST(N'08:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Sat","Sun"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (51, N'DEVL_WEEKLY_DTSBX470', CAST(N'07:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (52, N'DEVL_WEEKLY_DTSBXREJ', CAST(N'17:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Tue","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (53, N'DEVL_WEEKLY_DTSPDAY7', CAST(N'19:10:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (54, N'DEVL_WEEKLY_DTSBX122', CAST(N'19:14:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (55, N'DEVL_WEEKLY_DTSRQ511', CAST(N'19:14:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (56, N'DEVL_WEEKLY_DTSRQ444', CAST(N'07:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Mon"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (57, N'DEVL_WEEKLY_DTSRQ126', CAST(N'09:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Mon"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (58, N'DEVL_MONTHLY_DTSRQ414', CAST(N'18:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"FirstWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (59, N'DEVL_MONTHLY_DTSPMON1', CAST(N'19:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (60, N'DEVL_MONTHLY_DTSCHGVB', CAST(N'19:26:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (61, N'DEVL_MONTHLY_DTSCHGVR', CAST(N'19:27:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (62, N'DEVL_MONTHLY_DTSVBKUP', CAST(N'19:26:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (63, N'DEVL_MONTHLY_DTSVRSTR', CAST(N'19:30:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (64, N'DEVL_MONTHLY_DTSRQ442', CAST(N'19:37:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (65, N'DEVL_MONTHLY_DTSBX460', CAST(N'19:35:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (66, N'DEVL_MONTHLY_DTSRQ513', CAST(N'19:37:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (67, N'DEVL_MONTHLY_DTSCHGDC', CAST(N'13:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"FirstWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (68, N'DEVL_QUARTERLY_DTSRQ119', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Months":[3,6,9,12],"Day":3}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (69, N'DEVL_QUARTERLY_DTSRQ902', CAST(N'18:16:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Months":[3,6,9,12],"Day":1}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (70, N'DEVL_QUARTERLY_DTSBX500', CAST(N'21:25:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Months":[3,6,9,12],"Day":1}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (71, N'DEVL_QUARTERLY_DTSRQ417', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":28},{"Month":5,"Day":31},{"Month":8,"Day":31},{"Month":11,"Day":30}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (72, N'DEVL_QUARTERLY_DTSRQ320', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":10},{"Month":5,"Day":10},{"Month":8,"Day":10},{"Month":11,"Day":10}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (73, N'DEVL_QUARTERLY_DTSRQ713', CAST(N'00:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":3,"Day":31},{"Month":6,"Day":30},{"Month":9,"Day":30},{"Month":12,"Day":31}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (74, N'DEVL_QUARTERLY_DTSBX468', CAST(N'15:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":28},{"Month":5,"Day":30},{"Month":7,"Day":31},{"Month":10,"Day":30}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (75, N'DEVL_QUARTERLY_DTSCHGQ1', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Rule":"FirstWorkdayOfQuarter"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (76, N'DEVL_QUARTERLY_DTSCHGQ2', CAST(N'18:16:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Rule":"FirstWorkdayOfQuarter"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (77, N'DEVL_QUARTERLY_DTSRQ327', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":7},{"Month":5,"Day":7},{"Month":8,"Day":7},{"Month":11,"Day":7}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (78, N'DEVL_QUARTERLY_DTSRQ328', CAST(N'18:16:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":7},{"Month":5,"Day":7},{"Month":8,"Day":7},{"Month":11,"Day":7}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (79, N'DEVL_QUARTERLY_DTSRQ412', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":1,"Day":15},{"Month":4,"Day":15},{"Month":7,"Day":15},{"Month":10,"Day":15}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (80, N'DEVL_QUARTERLY_DTSRQ793', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (81, N'DEVL_QUARTERLY_DTSWGE06', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (82, N'DEVL_QUARTERLY_DTSCHGRT', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (83, N'DEVL_QUARTERLY_DTSCHRGS', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (84, N'DEVL_QUARTERLY_DTSRQ540', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (85, N'DEVL_QUARTERLY_DTSRQ591', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (86, N'DEVL_QUARTERLY_DTSRTCHG', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (87, N'DEVL_QUARTERLY_DTSWGE01', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (88, N'DEVL_QUARTERLY_DESBD426', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (89, N'DEVL_ONDEMAND_DTSACH01', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (90, N'DEVL_ONDEMAND_DTSBX415', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (91, N'DEVL_ONDEMAND_DTSBX452', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (92, N'DEVL_ONDEMAND_DTSBX453', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (93, N'DEVL_ONDEMAND_DTSRQ120', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (94, N'DEVL_ONDEMAND_DTSRQ123', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (95, N'DEVL_ONDEMAND_DTSRQ125', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (96, N'DEVL_ONDEMAND_DTSRQ305', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (97, N'DEVL_ONDEMAND_DTSRQ306', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (98, N'DEVL_ONDEMAND_DTSRQ308', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (99, N'DEVL_ONDEMAND_DTSRQ311', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (100, N'DEVL_ONDEMAND_DTSRQ410', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (101, N'DEVL_ONDEMAND_DTSRQ411', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (102, N'DEVL_ONDEMAND_DTSRQ423', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (103, N'DEVL_ONDEMAND_DTSRQ426', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (104, N'DEVL_ONDEMAND_DTSRQ429', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (105, N'DEVL_ONDEMAND_DTSRQ439', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (106, N'DEVL_ONDEMAND_DTSRQ602', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (107, N'DEVL_ONDEMAND_DTSRQ606', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (108, N'DEVL_ONDEMAND_DTSRQ607', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (109, N'DEVL_ONDEMAND_DTSRQ609', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (110, N'DEVL_ONDEMAND_DTSRQ611', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (111, N'DEVL_ONDEMAND_DTSRQ612', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (112, N'DEVL_ONDEMAND_DTSRQ717', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (113, N'DEVL_ONDEMAND_DTSRQ718', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (114, N'DEVL_ONDEMAND_DTSRQ720', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (115, N'DEVL_ONDEMAND_DTSRQ721', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (116, N'DEVL_ONDEMAND_DTSRT715', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (117, N'DEVL_ONDEMAND_DTSRT716', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (118, N'DEVL_ONDEMAND_DTSRT717', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (119, N'DEVL_ONDEMAND_DTSRT718', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (120, N'DEVL_ONDEMAND_DTSRT719', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (121, N'DEVL_ONDEMAND_DTSRT720', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (122, N'DEVL_ONDEMAND_DTSRT722', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (123, N'DEVL_ONDEMAND_DTSRT723', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (124, N'DEVL_YEARLY_DTSRQ722', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (125, N'DEVL_YEARLY_DTSRQ451', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (126, N'DEVL_YEARLY_DTSRQ127', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (127, N'DEVL_YEARLY_DTSRQ321', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (128, N'DEVL_YEARLY_DTSRQ455', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (129, N'DEVL_YEARLY_DTSRQ500', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (130, N'DEVL_YEARLY_DTSRQ517', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (131, N'DEVL_YEARLY_DTSRQ518', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (132, N'DEVL_YEARLY_DTSRQ616', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (133, N'DEVL_YEARLY_DTSRQ701', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (134, N'DEVL_YEARLY_DTSRQ702', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (135, N'DEVL_YEARLY_DTSRQ704', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (136, N'DEVL_YEARLY_DTSRQ910', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +GO +SET IDENTITY_INSERT [dbo].[JobControl] OFF +GO \ No newline at end of file diff --git a/SqlAgent/v2/01_Devl/1_Database_Setup/InsertJobDependencies.sql b/SqlAgent/v2/01_Devl/1_Database_Setup/InsertJobDependencies.sql new file mode 100644 index 0000000..60d5179 --- /dev/null +++ b/SqlAgent/v2/01_Devl/1_Database_Setup/InsertJobDependencies.sql @@ -0,0 +1,92 @@ +USE [DevlDUTASJobSchedule] +GO +SET IDENTITY_INSERT [dbo].[JobDependencies] ON +GO +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (1, N'DEVL_DAILY_DTSGSID0', N'DEVL_DAILY_DTSBX305') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (2, N'DEVL_DAILY_GSIRQ300', N'DEVL_DAILY_DTSBX305') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (3, N'DEVL_DAILY_DTSRQ202', N'DEVL_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (4, N'DEVL_DAILY_DTSGSID1', N'DEVL_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (5, N'DEVL_DAILY_DTSBX202', N'DEVL_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (6, N'DEVL_DAILY_DTSFT202', N'DEVL_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (7, N'DEVL_DAILY_DTSBX432', N'DEVL_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (8, N'DEVL_DAILY_DTSGACHD', N'DEVL_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (9, N'DEVL_DAILY_DTSBX303', N'DEVL_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (10, N'DEVL_DAILY_DTSGWAGE', N'DEVL_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (11, N'DEVL_DAILY_DTSGCHKS', N'DEVL_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (12, N'DEVL_DAILY_DTSESDAY', N'DEVL_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (13, N'DEVL_DAILY_DTSGPAYT', N'DEVL_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (14, N'DEVL_DAILY_DTSDX145', N'DEVL_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (15, N'DEVL_DAILY_DTSBX629', N'DEVL_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (16, N'DEVL_DAILY_DTSBX630', N'DEVL_DAILY_DTSBX629') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (17, N'DEVL_DAILY_DTSFRAUD', N'DEVL_DAILY_DTSBX629') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (18, N'DEVL_DAILY_DTSRACHD', N'DEVL_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (19, N'DEVL_DAILY_DTSBXACH', N'DEVL_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (20, N'DEVL_DAILY_DTSBXREG', N'DEVL_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (21, N'DEVL_DAILY_DTSBX430', N'DEVL_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (22, N'DEVL_DAILY_DTSBX626', N'DEVL_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (23, N'DEVL_DAILY_DTSBX530', N'DEVL_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (24, N'DEVL_DAILY_DTSBXREL', N'DEVL_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (25, N'DEVL_DAILY_DTSBX450', N'DEVL_DAILY_DTSBXACH') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (26, N'DEVL_DAILY_DTSBX450', N'DEVL_DAILY_DTSBXREG') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (27, N'DEVL_DAILY_DTSBX450', N'DEVL_DAILY_DTSBX430') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (28, N'DEVL_DAILY_DTSBX450', N'DEVL_DAILY_DTSBX626') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (29, N'DEVL_DAILY_DTSBX450', N'DEVL_DAILY_DTSBX530') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (30, N'DEVL_DAILY_DTSBX450', N'DEVL_DAILY_DTSBXREL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (31, N'DEVL_DAILY_DTSBX451', N'DEVL_DAILY_DTSBXACH') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (32, N'DEVL_DAILY_DTSBX451', N'DEVL_DAILY_DTSBXREG') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (33, N'DEVL_DAILY_DTSBX451', N'DEVL_DAILY_DTSBX430') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (34, N'DEVL_DAILY_DTSBX451', N'DEVL_DAILY_DTSBX626') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (35, N'DEVL_DAILY_DTSBX451', N'DEVL_DAILY_DTSBX530') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (36, N'DEVL_DAILY_DTSBX451', N'DEVL_DAILY_DTSBXREL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (37, N'DEVL_DAILY_DTSPACHD', N'DEVL_DAILY_DTSBX450') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (38, N'DEVL_DAILY_DTSPACHD', N'DEVL_DAILY_DTSBX451') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (39, N'DEVL_DAILY_DTSPX148', N'DEVL_DAILY_DTSPACHD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (40, N'DEVL_DAILY_DTSRQ325', N'DEVL_DAILY_DTSPACHD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (41, N'DEVL_DAILY_DTSBX427', N'DEVL_DAILY_DTSPX148') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (42, N'DEVL_DAILY_DTSBX427', N'DEVL_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (43, N'DEVL_DAILY_DTSPDAY1', N'DEVL_DAILY_DTSBX427') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (44, N'DEVL_DAILY_DTSW4WGE', N'DEVL_DAILY_DTSPDAY1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (45, N'DEVL_DAILY_DTSGSID2', N'DEVL_DAILY_DTSPDAY1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (46, N'DEVL_DAILY_DTSGSID9', N'DEVL_DAILY_DTSPDAY1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (47, N'DEVL_DAILY_DTSMIN01', N'DEVL_DAILY_DTSW4WGE') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (48, N'DEVL_DAILY_DTSMIN01', N'DEVL_DAILY_DTSGSID2') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (49, N'DEVL_DAILY_DTSMIN01', N'DEVL_DAILY_DTSGSID9') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (50, N'DEVL_DAILY_DTSMIN02', N'DEVL_DAILY_DTSW4WGE') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (51, N'DEVL_DAILY_DTSMIN02', N'DEVL_DAILY_DTSGSID2') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (52, N'DEVL_DAILY_DTSMIN02', N'DEVL_DAILY_DTSGSID9') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (53, N'DEVL_DAILY_DTSRQ459', N'DEVL_DAILY_DTSMIN01') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (54, N'DEVL_DAILY_DTSRQ459', N'DEVL_DAILY_DTSMIN02') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (55, N'DEVL_DAILY_DTSBXPFL', N'DEVL_DAILY_DTSRQ459') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (56, N'DEVL_DAILY_DESBD427', N'DEVL_DAILY_DTSBXPFL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (57, N'DEVL_DAILY_DTSBX403', N'DEVL_DAILY_DTSBXPFL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (58, N'DEVL_DAILY_DTSBE405', N'DEVL_DAILY_DTSBXPFL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (59, N'DEVL_DAILY_DTSBX405', N'DEVL_DAILY_DTSBXPFL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (60, N'DEVL_DAILY_DTSRQ335', N'DEVL_DAILY_DTSBXPFL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (61, N'DEVL_DAILY_DTSBX601', N'DEVL_DAILY_DTSRQ335') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (62, N'DEVL_WEEKLY_DTSBXREJ', N'DEVL_DAILY_DTSBXREL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (63, N'DEVL_WEEKLY_DTSBX122', N'DEVL_WEEKLY_DTSPDAY7') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (64, N'DEVL_WEEKLY_DTSRQ511', N'DEVL_WEEKLY_DTSPDAY7') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (65, N'DEVL_MONTHLY_DTSRQ414', N'DEVL_DAILY_DTSPDAY1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (66, N'DEVL_MONTHLY_DTSCHGVB', N'DEVL_MONTHLY_DTSPMON1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (67, N'DEVL_MONTHLY_DTSCHGVR', N'DEVL_MONTHLY_DTSCHGVB') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (68, N'DEVL_MONTHLY_DTSVBKUP', N'DEVL_MONTHLY_DTSPMON1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (69, N'DEVL_MONTHLY_DTSVRSTR', N'DEVL_MONTHLY_DTSVBKUP') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (70, N'DEVL_MONTHLY_DTSRQ442', N'DEVL_MONTHLY_DTSRQ513') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (71, N'DEVL_QUARTERLY_DTSRQ119', N'DEVL_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (72, N'DEVL_QUARTERLY_DTSRQ417', N'DEVL_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (73, N'DEVL_QUARTERLY_DTSRQ320', N'DEVL_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (74, N'DEVL_QUARTERLY_DTSRQ793', N'DEVL_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (75, N'DEVL_QUARTERLY_DTSCHGQ1', N'DEVL_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (76, N'DEVL_QUARTERLY_DTSRQ327', N'DEVL_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (77, N'DEVL_QUARTERLY_DTSRQ412', N'DEVL_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (78, N'DEVL_QUARTERLY_DTSRQ591', N'DEVL_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (79, N'DEVL_QUARTERLY_DTSRQ902', N'DEVL_DAILY_DTSPDAY1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (80, N'DEVL_QUARTERLY_DTSCHGQ2', N'DEVL_DAILY_DTSPDAY1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (81, N'DEVL_QUARTERLY_DTSCHGRT', N'DEVL_QUARTERLY_DTSRQ591') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (82, N'DEVL_QUARTERLY_DTSRQ328', N'DEVL_QUARTERLY_DTSRQ327') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (83, N'DEVL_QUARTERLY_DTSBX500', N'DEVL_QUARTERLY_DTSRQ417') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (84, N'DEVL_QUARTERLY_DTSRQ713', N'DEVL_MONTHLY_DTSPMON1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (85, N'DEVL_QUARTERLY_DTSCHRGS', N'DEVL_QUARTERLY_DTSCHGRT') +GO +SET IDENTITY_INSERT [dbo].[JobDependencies] OFF +GO diff --git a/SqlAgent/v2/01_Devl/2_Functions/fn_GetNextWorkday.sql b/SqlAgent/v2/01_Devl/2_Functions/fn_GetNextWorkday.sql new file mode 100644 index 0000000..6a8740a --- /dev/null +++ b/SqlAgent/v2/01_Devl/2_Functions/fn_GetNextWorkday.sql @@ -0,0 +1,17 @@ +USE DevlDUTASJobSchedule; +GO +-- Returns the next valid workday on or after the given date +CREATE OR ALTER FUNCTION dbo.fn_GetNextWorkday (@InputDate DATE) +RETURNS DATE +AS +BEGIN + DECLARE @Workday DATE = @InputDate; + + WHILE DATENAME(WEEKDAY, @Workday) IN ('Saturday','Sunday') + OR EXISTS (SELECT 1 FROM dbo.FederalHolidays WHERE HolidayDate = @Workday) + BEGIN + SET @Workday = DATEADD(DAY, 1, @Workday); + END + + RETURN @Workday; +END; diff --git a/SqlAgent/v2/01_Devl/2_Functions/fn_GetPreviousWorkday.sql b/SqlAgent/v2/01_Devl/2_Functions/fn_GetPreviousWorkday.sql new file mode 100644 index 0000000..dc06a91 --- /dev/null +++ b/SqlAgent/v2/01_Devl/2_Functions/fn_GetPreviousWorkday.sql @@ -0,0 +1,17 @@ +USE DevlDUTASJobSchedule; +GO +-- Returns the most recent valid workday before or equal to the given date +CREATE OR ALTER FUNCTION dbo.fn_GetPreviousWorkday (@InputDate DATE) +RETURNS DATE +AS +BEGIN + DECLARE @Workday DATE = @InputDate; + + WHILE DATENAME(WEEKDAY, @Workday) IN ('Saturday','Sunday') + OR EXISTS (SELECT 1 FROM dbo.FederalHolidays WHERE HolidayDate = @Workday) + BEGIN + SET @Workday = DATEADD(DAY, -1, @Workday); + END + + RETURN @Workday; +END; diff --git a/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_CheckJobConditions.sql b/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_CheckJobConditions.sql new file mode 100644 index 0000000..6711343 Binary files /dev/null and b/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_CheckJobConditions.sql differ diff --git a/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_CheckJobConditions_Generic.sql b/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_CheckJobConditions_Generic.sql new file mode 100644 index 0000000..453879f Binary files /dev/null and b/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_CheckJobConditions_Generic.sql differ diff --git a/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_CreateDailyJobSchedule.sql b/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_CreateDailyJobSchedule.sql new file mode 100644 index 0000000..c2cd1ea --- /dev/null +++ b/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_CreateDailyJobSchedule.sql @@ -0,0 +1,98 @@ +USE msdb; +GO + +CREATE OR ALTER PROCEDURE dbo.usp_CreateDailyJobSchedule + @Env VARCHAR(10) = 'DEVL' -- Added parameter with default value +AS +BEGIN + SET NOCOUNT ON; + + DECLARE + @JobID INT, + @JobName SYSNAME, + @ScheduledStartTime TIME(0), + @Frequency NVARCHAR(20), + @FrequencyPattern NVARCHAR(MAX), + @ScheduleName SYSNAME, + @StartTimeInt INT, + @FreqInterval INT, + @TimeString VARCHAR(8), + @ActiveStartDate INT, + @dbName SYSNAME; -- Added variable for database name + + -- Determine database name based on environment + SET @dbName = CASE @Env + WHEN 'DEVL' THEN 'DevlDUTASJobSchedule' + WHEN 'TEST' THEN 'TestDUTASJobSchedule' + WHEN 'PROD' THEN 'ProdDUTASJobSchedule' + END; + + -- Prepare active start date as INT (YYYYMMDD) + SET @ActiveStartDate = CONVERT(INT, CONVERT(CHAR(8), GETDATE(), 112)); + + -- Dynamic SQL to fetch jobs from the appropriate database + DECLARE @Sql NVARCHAR(MAX); + SET @Sql = N' + DECLARE job_cursor CURSOR FOR + SELECT JobID, JobName, ScheduledStartTime, Frequency, FrequencyPattern + FROM ' + QUOTENAME(@dbName) + N'.dbo.JobControl + WHERE UPPER(Frequency) = ''DAILY'' + AND IsActive = 1;'; + + -- Execute dynamic SQL to declare cursor + EXEC sp_executesql @Sql; + + OPEN job_cursor; + FETCH NEXT FROM job_cursor INTO @JobID, @JobName, @ScheduledStartTime, @Frequency, @FrequencyPattern; + + WHILE @@FETCH_STATUS = 0 + BEGIN + -- Step 1: Convert ScheduledStartTime (TIME) to HH:MM:SS string + SET @TimeString = CONVERT(VARCHAR(8), @ScheduledStartTime, 108); + + -- Step 2: Remove colons and convert to INT (HHMMSS) + SET @StartTimeInt = CONVERT(INT, REPLACE(@TimeString, ':', '')); + + -- Step 3: Prepare schedule name + SET @ScheduleName = CONCAT(@JobName, '_DailySchedule'); + + -- Step 4: Fixed freq_interval for Monday to Friday + SET @FreqInterval = 62; -- Mon(2)+Tue(4)+Wed(8)+Thu(16)+Fri(32) = 62 + + -- Step 5: Delete existing schedule if it exists (idempotency) + IF EXISTS ( + SELECT 1 + FROM msdb.dbo.sysschedules s + JOIN msdb.dbo.sysjobschedules js ON s.schedule_id = js.schedule_id + JOIN msdb.dbo.sysjobs j ON j.job_id = js.job_id + WHERE j.name = @JobName AND s.name = @ScheduleName + ) + BEGIN + EXEC msdb.dbo.sp_delete_schedule @schedule_name = @ScheduleName; + END + + -- Step 6: Create weekly schedule (Monday to Friday) running once per day + EXEC msdb.dbo.sp_add_schedule + @schedule_name = @ScheduleName, + @enabled = 1, + @freq_type = 8, -- weekly + @freq_interval = @FreqInterval, + @freq_recurrence_factor = 1, -- every week + @active_start_time = @StartTimeInt, + @active_start_date = @ActiveStartDate; + + -- Step 7: Attach schedule to job + EXEC msdb.dbo.sp_attach_schedule + @job_name = @JobName, + @schedule_name = @ScheduleName; + + -- Fetch next job + FETCH NEXT FROM job_cursor INTO @JobID, @JobName, @ScheduledStartTime, @Frequency, @FrequencyPattern; + END + + CLOSE job_cursor; + DEALLOCATE job_cursor; + + PRINT 'Daily job schedules (Monday to Friday) created successfully for ' + @dbName; +END; +GO \ No newline at end of file diff --git a/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_CreateSQLAgentJob.sql b/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_CreateSQLAgentJob.sql new file mode 100644 index 0000000..cfba9e9 Binary files /dev/null and b/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_CreateSQLAgentJob.sql differ diff --git a/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_CreateWeeklySchedules.sql b/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_CreateWeeklySchedules.sql new file mode 100644 index 0000000..2021821 --- /dev/null +++ b/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_CreateWeeklySchedules.sql @@ -0,0 +1,223 @@ +USE [msdb]; +GO + +CREATE OR ALTER PROCEDURE dbo.usp_CreateWeeklySchedules + @Env VARCHAR(10) = 'DEVL' -- Added parameter with default value +AS +BEGIN + SET NOCOUNT ON; + + DECLARE + @JobName SYSNAME, + @FrequencyPattern NVARCHAR(MAX), + @StartTime VARCHAR(50), + @ScheduleName SYSNAME, + @StartTimeInt INT, + @FreqInterval INT, + @ActiveDate INT, + @computedFreq INT, + @dbName SYSNAME; -- Added variable for database name + + -- Determine database name based on environment + SET @dbName = CASE @Env + WHEN 'DEVL' THEN 'DevlDUTASJobSchedule' + WHEN 'TEST' THEN 'TestDUTASJobSchedule' + WHEN 'PROD' THEN 'ProdDUTASJobSchedule' + END; + + SET @ActiveDate = CONVERT(INT, CONVERT(CHAR(8), GETDATE(), 112)); + + -------------------------------------------------------------------------- + -- Dynamic SQL for cursor to fetch active weekly jobs from appropriate database + -------------------------------------------------------------------------- + DECLARE @Sql NVARCHAR(MAX); + SET @Sql = N' + DECLARE job_cursor CURSOR FAST_FORWARD FOR + SELECT + JobName, + FrequencyPattern, + ScheduledStartTime + FROM ' + QUOTENAME(@dbName) + N'.dbo.JobControl + WHERE UPPER(Frequency) = ''WEEKLY'' + AND IsActive = 1;'; + + -- Execute dynamic SQL to declare cursor + EXEC sp_executesql @Sql; + + OPEN job_cursor; + FETCH NEXT FROM job_cursor INTO @JobName, @FrequencyPattern, @StartTime; + + WHILE @@FETCH_STATUS = 0 + BEGIN + BEGIN TRY + ------------------------------------------------------------------ + -- Reset per-job variables + ------------------------------------------------------------------ + SET @FreqInterval = 0; + SET @computedFreq = 0; + SET @StartTimeInt = NULL; + SET @ScheduleName = NULL; + + ------------------------------------------------------------------ + -- Correctly format the start time (HHMMSS without extra zeros) + ------------------------------------------------------------------ + SET @StartTime = LTRIM(RTRIM(ISNULL(@StartTime, '00:00:00'))); + + -- Parse time and convert to HHMMSS integer + DECLARE @TimeParts TABLE (part NVARCHAR(10), idx INT); + INSERT INTO @TimeParts (part, idx) + SELECT value, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 + FROM STRING_SPLIT(LEFT(@StartTime, 8), ':'); + + DECLARE @Hours INT, @Minutes INT, @Seconds INT; + + SELECT @Hours = CAST(part AS INT) FROM @TimeParts WHERE idx = 0; + SELECT @Minutes = CAST(part AS INT) FROM @TimeParts WHERE idx = 1; + SELECT @Seconds = CAST(part AS INT) FROM @TimeParts WHERE idx = 2; + + -- Ensure valid time ranges + SET @Hours = ISNULL(@Hours, 0); + SET @Minutes = ISNULL(@Minutes, 0); + SET @Seconds = ISNULL(@Seconds, 0); + + IF @Hours < 0 OR @Hours > 23 SET @Hours = 0; + IF @Minutes < 0 OR @Minutes > 59 SET @Minutes = 0; + IF @Seconds < 0 OR @Seconds > 59 SET @Seconds = 0; + + SET @StartTimeInt = (@Hours * 10000) + (@Minutes * 100) + @Seconds; + + SET @ScheduleName = CONCAT(@JobName, '_WeeklySchedule'); + + ------------------------------------------------------------------ + -- Parse JSON days using a local temporary table + ------------------------------------------------------------------ + CREATE TABLE #Days (DayName NVARCHAR(10)); + + INSERT INTO #Days (DayName) + SELECT TRIM(value) + FROM OPENJSON(ISNULL(@FrequencyPattern, '{}'), '$.Days'); + + ------------------------------------------------------------------ + -- Compute bitmask correctly (values should be 1-127) + ------------------------------------------------------------------ + SELECT @computedFreq = ISNULL(SUM( + CASE UPPER(DayName) + WHEN 'SUN' THEN 1 + WHEN 'MON' THEN 2 + WHEN 'TUE' THEN 4 + WHEN 'WED' THEN 8 + WHEN 'THU' THEN 16 + WHEN 'FRI' THEN 32 + WHEN 'SAT' THEN 64 + ELSE 0 + END + ), 0) + FROM #Days; + + DROP TABLE #Days; -- Explicitly drop the temp table + + SET @FreqInterval = ISNULL(@computedFreq, 0); + + ------------------------------------------------------------------ + -- Validate freq_interval (must be 1..127) + ------------------------------------------------------------------ + IF @FreqInterval < 1 OR @FreqInterval > 127 + BEGIN + PRINT 'Warning: Weekly job ' + @JobName + + ' has invalid freq_interval (' + ISNULL(CAST(@FreqInterval AS VARCHAR(10)), 'NULL') + + '). Days found: ' + ISNULL(@FrequencyPattern, 'None') + '. Skipping.'; + FETCH NEXT FROM job_cursor INTO @JobName, @FrequencyPattern, @StartTime; + CONTINUE; + END + + ------------------------------------------------------------------ + -- Debug output to verify calculations + ------------------------------------------------------------------ + PRINT 'Job: ' + @JobName + + ', Days: ' + @FrequencyPattern + + ', FreqInterval: ' + CAST(@FreqInterval AS VARCHAR(3)) + + ', StartTime: ' + CAST(@StartTimeInt AS VARCHAR(6)); + + ------------------------------------------------------------------ + -- Safely detach and delete any existing schedule with this name + -- Use TRY/CATCH for schedule operations since non-existence is expected + ------------------------------------------------------------------ + BEGIN TRY + DECLARE @schedule_id INT; + DECLARE @attach_count INT; + + -- Check if schedule exists and get its ID + SELECT @schedule_id = s.schedule_id + FROM msdb.dbo.sysschedules s + JOIN msdb.dbo.sysjobschedules js ON s.schedule_id = js.schedule_id + JOIN msdb.dbo.sysjobs j ON j.job_id = js.job_id + WHERE j.name = @JobName AND s.name = @ScheduleName; + + IF @schedule_id IS NOT NULL + BEGIN + -- Detach from this job (if attached) + EXEC msdb.dbo.sp_detach_schedule + @job_name = @JobName, + @schedule_name = @ScheduleName; + + -- Check if schedule still attached to other jobs + SELECT @attach_count = COUNT(*) + FROM msdb.dbo.sysjobschedules js + WHERE js.schedule_id = @schedule_id; + + IF @attach_count = 0 + BEGIN + EXEC msdb.dbo.sp_delete_schedule + @schedule_name = @ScheduleName; + PRINT 'Existing schedule deleted: ' + @ScheduleName; + END + ELSE + BEGIN + PRINT 'Notice: schedule ' + @ScheduleName + ' could not be deleted because it is still attached to other jobs.'; + END + END + END TRY + BEGIN CATCH + -- Schedule operations might fail if schedule doesn't exist, which is fine + PRINT 'Notice: ' + ERROR_MESSAGE() + ' - proceeding with new schedule creation.'; + END CATCH + + ------------------------------------------------------------------ + -- Create the unified weekly schedule with subday config + ------------------------------------------------------------------ + EXEC msdb.dbo.sp_add_schedule + @schedule_name = @ScheduleName, + @enabled = 1, + @freq_type = 8, -- Weekly + @freq_interval = @FreqInterval, -- Bitmask of weekdays + @freq_recurrence_factor = 1, -- Every week + @freq_subday_type = 1, -- Once per day + @freq_subday_interval = 1, + @active_start_time = @StartTimeInt, + @active_start_date = @ActiveDate; + + ------------------------------------------------------------------ + -- Attach the schedule to the job + ------------------------------------------------------------------ + EXEC msdb.dbo.sp_attach_schedule + @job_name = @JobName, + @schedule_name = @ScheduleName; + + PRINT 'Weekly schedule created for job: ' + @JobName + + ' (Days=' + CAST(@FreqInterval AS VARCHAR(10)) + + ', Time=' + RIGHT('000000' + CAST(@StartTimeInt AS VARCHAR(6)), 6) + ')'; + + END TRY + BEGIN CATCH + PRINT 'Error scheduling job ' + ISNULL(@JobName, 'Unknown') + ': ' + ERROR_MESSAGE(); + END CATCH; + + FETCH NEXT FROM job_cursor INTO @JobName, @FrequencyPattern, @StartTime; + END + + CLOSE job_cursor; + DEALLOCATE job_cursor; + + PRINT 'All weekly job schedules processed for ' + @dbName; +END; +GO \ No newline at end of file diff --git a/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_ForceComplete.sql b/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_ForceComplete.sql new file mode 100644 index 0000000..66a3d0d Binary files /dev/null and b/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_ForceComplete.sql differ diff --git a/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_GenerateJobSchedule.sql b/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_GenerateJobSchedule.sql new file mode 100644 index 0000000..afd72d9 --- /dev/null +++ b/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_GenerateJobSchedule.sql @@ -0,0 +1,261 @@ +USE [DevlDUTASJobSchedule]; +GO + +CREATE OR ALTER PROCEDURE dbo.usp_GenerateJobSchedule + @Year INT +AS +BEGIN + SET NOCOUNT ON; + + ------------------------------------------------------------------------- + -- 1. Cleanup existing schedule data for this year + ------------------------------------------------------------------------- + DELETE FROM dbo.JobSchedule WHERE YearOfSchedule = @Year; + + ------------------------------------------------------------------------- + -- 2. Variable declarations + ------------------------------------------------------------------------- + DECLARE + @JobName VARCHAR(100), + @Frequency VARCHAR(20), + @Pattern NVARCHAR(2000), + @ScheduledTime TIME, + @RuleName NVARCHAR(100), + @Month INT, + @BaseDate DATE, + @ScheduledDate DATE, + @AdjustedDate DATE, + @FailSafeDate DATE = '9999-12-31'; + + ------------------------------------------------------------------------- + -- 3. Temporary table to process jobs more efficiently + ------------------------------------------------------------------------- + CREATE TABLE #JobProcessing ( + JobName VARCHAR(100), + Frequency VARCHAR(20), + Pattern NVARCHAR(2000), + ScheduledTime TIME, + RuleName NVARCHAR(100), + MonthsJSON NVARCHAR(MAX), + DayNum INT, + HasExplicitSchedule BIT + ); + + -- Populate temporary table with parsed JSON data + INSERT INTO #JobProcessing (JobName, Frequency, Pattern, ScheduledTime, RuleName, MonthsJSON, DayNum, HasExplicitSchedule) + SELECT + jc.JobName, + jc.Frequency, + jc.FrequencyPattern, + jc.ScheduledStartTime, + JSON_VALUE(jc.FrequencyPattern, '$.Rule'), + JSON_QUERY(jc.FrequencyPattern, '$.Months'), + JSON_VALUE(jc.FrequencyPattern, '$.Day'), + CASE WHEN JSON_QUERY(jc.FrequencyPattern, '$.Schedule') IS NOT NULL THEN 1 ELSE 0 END + FROM dbo.JobControl jc + WHERE UPPER(jc.Frequency) IN ('MONTHLY','QUARTERLY') + AND jc.IsActive = 1; + + ------------------------------------------------------------------------- + -- 4. Process MONTHLY jobs + ------------------------------------------------------------------------- + INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy) + SELECT + jp.JobName, + jp.Frequency, + jp.Pattern, + CASE + WHEN jp.RuleName = 'FirstWorkday' THEN dbo.fn_GetNextWorkday(DATEFROMPARTS(@Year, m.MonthNum, 1)) + WHEN jp.RuleName = 'LastWorkday' THEN dbo.fn_GetPreviousWorkday(EOMONTH(DATEFROMPARTS(@Year, m.MonthNum, 1))) + ELSE @FailSafeDate + END AS ScheduledDate, + CASE + WHEN jp.RuleName = 'FirstWorkday' THEN dbo.fn_GetNextWorkday(DATEFROMPARTS(@Year, m.MonthNum, 1)) + WHEN jp.RuleName = 'LastWorkday' THEN dbo.fn_GetPreviousWorkday(EOMONTH(DATEFROMPARTS(@Year, m.MonthNum, 1))) + ELSE @FailSafeDate + END AS AdjustedRunDate, + FORMAT(DATEFROMPARTS(@Year, m.MonthNum, 1), 'yyyy-MM'), + @Year, + GETDATE(), + SYSTEM_USER + FROM #JobProcessing jp + CROSS JOIN (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) m(MonthNum) + WHERE jp.Frequency = 'MONTHLY' + AND jp.RuleName IN ('FirstWorkday', 'LastWorkday'); + + -- Handle monthly jobs with unknown rules + INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy) + SELECT + jp.JobName, + jp.Frequency, + jp.Pattern, + @FailSafeDate, + @FailSafeDate, + FORMAT(DATEFROMPARTS(@Year, m.MonthNum, 1), 'yyyy-MM'), + @Year, + GETDATE(), + SYSTEM_USER + FROM #JobProcessing jp + CROSS JOIN (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) m(MonthNum) + WHERE jp.Frequency = 'MONTHLY' + AND jp.RuleName NOT IN ('FirstWorkday', 'LastWorkday'); + + ------------------------------------------------------------------------- + -- 5. Process QUARTERLY jobs - FirstWorkdayOfQuarter + ------------------------------------------------------------------------- + INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy) + SELECT + jp.JobName, + jp.Frequency, + jp.Pattern, + dbo.fn_GetNextWorkday(DATEFROMPARTS(@Year, q.StartMonth, 1)), + dbo.fn_GetNextWorkday(DATEFROMPARTS(@Year, q.StartMonth, 1)), + FORMAT(DATEFROMPARTS(@Year, q.StartMonth, 1), 'yyyy-MM'), + @Year, + GETDATE(), + SYSTEM_USER + FROM #JobProcessing jp + CROSS JOIN (VALUES (1),(4),(7),(10)) q(StartMonth) + WHERE jp.Frequency = 'QUARTERLY' + AND jp.RuleName = 'FirstWorkdayOfQuarter'; + + ------------------------------------------------------------------------- + -- 6. Process QUARTERLY jobs - Months array with Day number + ------------------------------------------------------------------------- + ;WITH QuarterlyMonths AS ( + SELECT + jp.JobName, + jp.Frequency, + jp.Pattern, + CAST(m.[value] AS INT) AS MonthNum, + jp.DayNum + FROM #JobProcessing jp + CROSS APPLY OPENJSON(jp.MonthsJSON) m + WHERE jp.Frequency = 'QUARTERLY' + AND jp.MonthsJSON IS NOT NULL + AND jp.DayNum IS NOT NULL + AND jp.RuleName IS NULL + AND jp.HasExplicitSchedule = 0 + ), + QuarterlyDates AS ( + SELECT + qm.JobName, + qm.Frequency, + qm.Pattern, + qm.MonthNum, + qm.DayNum, + CASE + WHEN qm.DayNum <= DAY(EOMONTH(DATEFROMPARTS(@Year, qm.MonthNum, 1))) + THEN DATEFROMPARTS(@Year, qm.MonthNum, qm.DayNum) + ELSE EOMONTH(DATEFROMPARTS(@Year, qm.MonthNum, 1)) + END AS BaseDate + FROM QuarterlyMonths qm + ) + INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy) + SELECT + qd.JobName, + qd.Frequency, + qd.Pattern, + qd.BaseDate, + CASE + WHEN DATENAME(WEEKDAY, qd.BaseDate) IN ('Saturday','Sunday') + OR EXISTS (SELECT 1 FROM dbo.FederalHolidays WHERE HolidayDate = qd.BaseDate) + THEN dbo.fn_GetPreviousWorkday(qd.BaseDate) + ELSE qd.BaseDate + END AS AdjustedRunDate, + FORMAT(qd.BaseDate, 'yyyy-MM'), + @Year, + GETDATE(), + SYSTEM_USER + FROM QuarterlyDates qd; + + ------------------------------------------------------------------------- + -- 7. Process QUARTERLY jobs - Explicit Schedule array + ------------------------------------------------------------------------- + ;WITH ExplicitSchedules AS ( + SELECT + jp.JobName, + jp.Frequency, + jp.Pattern, + s.[Month] AS MonthNum, + s.[Day] AS DayNum + FROM #JobProcessing jp + CROSS APPLY OPENJSON(jp.Pattern, '$.Schedule') + WITH ( + [Month] INT '$.Month', + [Day] INT '$.Day' + ) s + WHERE jp.Frequency = 'QUARTERLY' + AND jp.HasExplicitSchedule = 1 + ), + ExplicitScheduleDates AS ( + SELECT + es.JobName, + es.Frequency, + es.Pattern, + es.MonthNum, + es.DayNum, + CASE + WHEN es.DayNum <= DAY(EOMONTH(DATEFROMPARTS(@Year, es.MonthNum, 1))) + THEN DATEFROMPARTS(@Year, es.MonthNum, es.DayNum) + ELSE EOMONTH(DATEFROMPARTS(@Year, es.MonthNum, 1)) + END AS BaseDate + FROM ExplicitSchedules es + ) + INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy) + SELECT + esd.JobName, + esd.Frequency, + esd.Pattern, + esd.BaseDate, + CASE + WHEN DATENAME(WEEKDAY, esd.BaseDate) IN ('Saturday','Sunday') + OR EXISTS (SELECT 1 FROM dbo.FederalHolidays WHERE HolidayDate = esd.BaseDate) + THEN dbo.fn_GetPreviousWorkday(esd.BaseDate) + ELSE esd.BaseDate + END AS AdjustedRunDate, + FORMAT(esd.BaseDate, 'yyyy-MM'), + @Year, + GETDATE(), + SYSTEM_USER + FROM ExplicitScheduleDates esd; + + ------------------------------------------------------------------------- + -- 8. Handle any quarterly jobs that didn't match the patterns above + ------------------------------------------------------------------------- + INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy) + SELECT + jp.JobName, + jp.Frequency, + jp.Pattern, + @FailSafeDate, + @FailSafeDate, + FORMAT(DATEFROMPARTS(@Year, 1, 1), 'yyyy-MM'), + @Year, + GETDATE(), + SYSTEM_USER + FROM #JobProcessing jp + WHERE jp.Frequency = 'QUARTERLY' + AND NOT EXISTS ( + SELECT 1 FROM dbo.JobSchedule js + WHERE js.JobName = jp.JobName AND js.YearOfSchedule = @Year + ); + + ------------------------------------------------------------------------- + -- 9. Cleanup and output + ------------------------------------------------------------------------- + DROP TABLE #JobProcessing; + + -- Update any NULL dates to fail-safe date + UPDATE dbo.JobSchedule + SET ScheduledDate = @FailSafeDate, + AdjustedRunDate = @FailSafeDate + WHERE YearOfSchedule = @Year + AND (ScheduledDate IS NULL OR AdjustedRunDate IS NULL); + + DECLARE @RecordCount INT = (SELECT COUNT(*) FROM dbo.JobSchedule WHERE YearOfSchedule = @Year); + + PRINT 'Job schedule generation completed for year ' + CAST(@Year AS VARCHAR(4)) + + '. Total records created: ' + CAST(@RecordCount AS VARCHAR(10)); +END; +GO \ No newline at end of file diff --git a/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_ScheduleJob.sql b/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_ScheduleJob.sql new file mode 100644 index 0000000..f6c2ffa --- /dev/null +++ b/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_ScheduleJob.sql @@ -0,0 +1,160 @@ +USE [msdb] +GO + +/****** Object: StoredProcedure [dbo].[usp_ScheduleJob] Script Date: 10/18/2025 9:52:04 AM ******/ +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + +CREATE OR ALTER PROCEDURE [dbo].[usp_ScheduleJob] + @JobName NVARCHAR(100), + @Env CHAR(4), -- 'DEVL' | 'TEST' | 'PROD' + @RunDate DATE, + @RunTime TIME +AS +BEGIN + SET NOCOUNT ON; + + DECLARE + @JobId UNIQUEIDENTIFIER, + @ScheduleName NVARCHAR(200), + @dbName NVARCHAR(128), + @ActiveStartDate INT, + @ActiveStartTime INT, + @Sql NVARCHAR(MAX), + @JobExists BIT = 0, + @ScheduleId INT; + + -- Table variable must be declared separately and at the top level + DECLARE @ExistingSchedules TABLE ( + schedule_id INT, + schedule_name NVARCHAR(200) + ); + + -- Map environment to actual DB name + SET @dbName = CASE @Env + WHEN 'DEVL' THEN 'DevlDUTASJobSchedule' + WHEN 'TEST' THEN 'TestDUTASJobSchedule' + WHEN 'PROD' THEN 'ProdDUTASJobSchedule' + ELSE 'DevlDUTASJobSchedule' + END; + + -- Validate parameters + IF @Env NOT IN ('DEVL','TEST','PROD') + BEGIN + RAISERROR('Env must be one of: DEVL, TEST, PROD.', 16, 1); + RETURN; + END + + IF @RunDate < CAST(GETDATE() AS DATE) + BEGIN + RAISERROR('RunDate cannot be in the past.', 16, 1); + RETURN; + END; + + -- Check if job exists in JobControl table + SET @Sql = N'SELECT @JobExists = 1 FROM ' + QUOTENAME(@dbName) + '.dbo.JobControl WHERE JobName = @JobNameParam'; + + EXEC sp_executesql @Sql, + N'@JobNameParam NVARCHAR(100), @JobExists BIT OUTPUT', + @JobNameParam = @JobName, + @JobExists = @JobExists OUTPUT; + + IF @JobExists = 0 + BEGIN + RAISERROR('Job %s not found in JobControl table.', 16, 1, @JobName); + RETURN; + END; + + -- Activate job in control table + SET @Sql = N'UPDATE ' + QUOTENAME(@dbName) + '.dbo.JobControl SET IsActive = 1 WHERE JobName = @JobNameParam'; + EXEC sp_executesql @Sql, + N'@JobNameParam NVARCHAR(100)', + @JobNameParam = @JobName; + + PRINT 'Job activated in JobControl.'; + + -- Convert date/time to SQL Agent format + SET @ActiveStartDate = CONVERT(INT, CONVERT(CHAR(8), @RunDate, 112)); + SET @ActiveStartTime = DATEPART(HOUR, @RunTime) * 10000 + + DATEPART(MINUTE, @RunTime) * 100 + + DATEPART(SECOND, @RunTime); + + SET @ScheduleName = @JobName + '_MonthlySchedule'; + + -- Get job id + SELECT @JobId = job_id + FROM msdb.dbo.sysjobs + WHERE name = @JobName; + + IF @JobId IS NULL + BEGIN + RAISERROR('SQL Agent job "%s" not found.', 16, 1, @JobName); + RETURN; + END; + + BEGIN TRY + BEGIN TRANSACTION; + + -- Detach and delete all existing schedules for this job + INSERT INTO @ExistingSchedules (schedule_id, schedule_name) + SELECT s.schedule_id, s.name + FROM msdb.dbo.sysschedules AS s + INNER JOIN msdb.dbo.sysjobschedules AS js ON s.schedule_id = js.schedule_id + WHERE js.job_id = @JobId; + + DECLARE @OldScheduleId INT, @OldScheduleName NVARCHAR(200); + + DECLARE cur CURSOR LOCAL FAST_FORWARD FOR + SELECT schedule_id, schedule_name FROM @ExistingSchedules; + + OPEN cur; + FETCH NEXT FROM cur INTO @OldScheduleId, @OldScheduleName; + + WHILE @@FETCH_STATUS = 0 + BEGIN + PRINT 'Detaching old schedule: ' + @OldScheduleName; + EXEC msdb.dbo.sp_detach_schedule @job_id = @JobId, @schedule_name = @OldScheduleName; + + PRINT 'Deleting old schedule: ' + @OldScheduleName; + EXEC msdb.dbo.sp_delete_schedule @schedule_name = @OldScheduleName; + + FETCH NEXT FROM cur INTO @OldScheduleId, @OldScheduleName; + END + + CLOSE cur; + DEALLOCATE cur; + + -- Create new one-time schedule + EXEC msdb.dbo.sp_add_schedule + @schedule_name = @ScheduleName, + @enabled = 1, + @freq_type = 1, -- One-time + @active_start_date = @ActiveStartDate, + @active_start_time = @ActiveStartTime; + + -- Attach schedule to job + EXEC msdb.dbo.sp_attach_schedule + @job_id = @JobId, + @schedule_name = @ScheduleName; + + COMMIT TRANSACTION; + + PRINT 'New schedule created for job "' + @JobName + + '" on ' + CONVERT(VARCHAR(10), @RunDate, 120) + + ' at ' + CONVERT(VARCHAR(8), @RunTime, 108); + END TRY + BEGIN CATCH + IF @@TRANCOUNT > 0 + ROLLBACK TRANSACTION; + + DECLARE @ErrorMessage NVARCHAR(4000) = ERROR_MESSAGE(); + RAISERROR('Error creating schedule: %s', 16, 1, @ErrorMessage); + END CATCH; +END; +GO + + diff --git a/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_ScheduleJobsForMonth.sql b/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_ScheduleJobsForMonth.sql new file mode 100644 index 0000000..0be312a --- /dev/null +++ b/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_ScheduleJobsForMonth.sql @@ -0,0 +1,39 @@ +USE DevlDUTASJobSchedule; +GO + +CREATE OR ALTER PROCEDURE dbo.usp_ScheduleJobsForMonth +AS +BEGIN + SET NOCOUNT ON; + + DECLARE @MonthKey CHAR(7) = FORMAT(GETDATE(), 'yyyy-MM'); + DECLARE @Year INT = YEAR(GETDATE()); + DECLARE @JobName VARCHAR(100); + DECLARE @RunDate DATE; + DECLARE @RunTime TIME; + DECLARE @Env VARCHAR(10) = 'DEVL'; -- configurable per environment + + DECLARE job_cursor CURSOR FOR + SELECT js.JobName, js.AdjustedRunDate, jc.ScheduledStartTime + FROM dbo.JobSchedule js + INNER JOIN dbo.JobControl jc ON js.JobName = jc.JobName + WHERE js.MonthOfSchedule = @MonthKey + AND jc.IsActive = 1; + + OPEN job_cursor; + FETCH NEXT FROM job_cursor INTO @JobName, @RunDate, @RunTime; + + WHILE @@FETCH_STATUS = 0 + BEGIN + EXEC msdb.dbo.usp_ScheduleJob + @JobName = @JobName, + @Env = @Env, + @RunDate = @RunDate, + @RunTime = @RunTime; + + FETCH NEXT FROM job_cursor INTO @JobName, @RunDate, @RunTime; + END + + CLOSE job_cursor; + DEALLOCATE job_cursor; +END diff --git a/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_TriggerMissedJobs.sql b/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_TriggerMissedJobs.sql new file mode 100644 index 0000000..0176424 Binary files /dev/null and b/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_TriggerMissedJobs.sql differ diff --git a/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_UpdateJobStatus_Generic.sql b/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_UpdateJobStatus_Generic.sql new file mode 100644 index 0000000..959016b Binary files /dev/null and b/SqlAgent/v2/01_Devl/3_Stored_Procedures/usp_UpdateJobStatus_Generic.sql differ diff --git a/SqlAgent/v2/01_Devl/4_Job_Maintenance/ActivateOnDemandJob.sql b/SqlAgent/v2/01_Devl/4_Job_Maintenance/ActivateOnDemandJob.sql new file mode 100644 index 0000000..e6a4f58 --- /dev/null +++ b/SqlAgent/v2/01_Devl/4_Job_Maintenance/ActivateOnDemandJob.sql @@ -0,0 +1,10 @@ +USE msdb; +GO + +-- Schedule DEVL OnDemand Job on 03 Nov at 18:15 PM +------------------------------------------------ +EXEC dbo.usp_ScheduleJob + @JobName='DEVL_MONTHLY_DTSRQ414', + @Env='DEVL', + @RunDate='2025-11-03', + @RunTime='18:15:00'; diff --git a/SqlAgent/v2/01_Devl/4_Job_Maintenance/AddAllJobsToSQLAgent.sql b/SqlAgent/v2/01_Devl/4_Job_Maintenance/AddAllJobsToSQLAgent.sql new file mode 100644 index 0000000..1fe50e2 --- /dev/null +++ b/SqlAgent/v2/01_Devl/4_Job_Maintenance/AddAllJobsToSQLAgent.sql @@ -0,0 +1,141 @@ +USE [msdb] +GO + +-- Execute the stored procedure for each job +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX215', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX305', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSGSID0', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_GSIRQ300', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSRQ202', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSGSID1', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX202', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSFT202', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX432', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSGACHD', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX303', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSGWAGE', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSGCHKS', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSESDAY', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSGPAYT', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSDX145', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX629', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX630', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSFRAUD', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSRACHD', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBXACH', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBXREG', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX430', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX626', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX530', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBXREL', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX450', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX451', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSPACHD', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSPX148', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSRQ325', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX427', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSPDAY1', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSW4WGE', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSGSID2', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSGSID9', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSMIN01', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSMIN02', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSRQ459', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBXPFL', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DESBD427', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX403', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBE405', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX405', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSRQ335', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX601', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_WEEKLY_DTSGSID0', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_WEEKLY_DTSGSID1', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_WEEKLY_DTSBX202', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_WEEKLY_DTSFT202', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_WEEKLY_DTSBX470', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_WEEKLY_DTSBXREJ', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_WEEKLY_DTSPDAY7', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_WEEKLY_DTSBX122', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_WEEKLY_DTSRQ511', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_WEEKLY_DTSRQ444', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_WEEKLY_DTSRQ126', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_MONTHLY_DTSRQ414', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_MONTHLY_DTSPMON1', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_MONTHLY_DTSCHGVB', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_MONTHLY_DTSCHGVR', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_MONTHLY_DTSVBKUP', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_MONTHLY_DTSVRSTR', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_MONTHLY_DTSRQ442', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_MONTHLY_DTSBX460', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_MONTHLY_DTSRQ513', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_MONTHLY_DTSCHGDC', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSRQ119', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSRQ902', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSBX500', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSRQ417', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSRQ320', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSRQ713', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSBX468', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSCHGQ1', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSCHGQ2', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSRQ327', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSRQ328', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSRQ412', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSRQ793', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSWGE06', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSCHGRT', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSCHRGS', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSRQ540', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSRQ591', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSRTCHG', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSWGE01', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DESBD426', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSACH01', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSBX415', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSBX452', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSBX453', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ120', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ123', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ125', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ305', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ306', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ308', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ311', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ410', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ411', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ423', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ426', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ429', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ439', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ602', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ606', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ607', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ609', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ611', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ612', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ717', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ718', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ720', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ721', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRT715', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRT716', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRT717', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRT718', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRT719', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRT720', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRT722', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRT723', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_YEARLY_DTSRQ722', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_YEARLY_DTSRQ451', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_YEARLY_DTSRQ127', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_YEARLY_DTSRQ321', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_YEARLY_DTSRQ455', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_YEARLY_DTSRQ500', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_YEARLY_DTSRQ517', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_YEARLY_DTSRQ518', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_YEARLY_DTSRQ616', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_YEARLY_DTSRQ701', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_YEARLY_DTSRQ702', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_YEARLY_DTSRQ704', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_YEARLY_DTSRQ910', @Env = 'DEVL'; +GO \ No newline at end of file diff --git a/SqlAgent/v2/01_Devl/4_Job_Maintenance/AddDailyJobSchedule.sql b/SqlAgent/v2/01_Devl/4_Job_Maintenance/AddDailyJobSchedule.sql new file mode 100644 index 0000000..3183ffd --- /dev/null +++ b/SqlAgent/v2/01_Devl/4_Job_Maintenance/AddDailyJobSchedule.sql @@ -0,0 +1 @@ +EXEC msdb.dbo.usp_CreateDailyJobSchedule @Env = 'DEVL'; \ No newline at end of file diff --git a/SqlAgent/v2/01_Devl/4_Job_Maintenance/AddNewJobToSQLAgent.sql b/SqlAgent/v2/01_Devl/4_Job_Maintenance/AddNewJobToSQLAgent.sql new file mode 100644 index 0000000..743765a --- /dev/null +++ b/SqlAgent/v2/01_Devl/4_Job_Maintenance/AddNewJobToSQLAgent.sql @@ -0,0 +1,5 @@ +USE [msdb] +GO + +-- Create a job in SQL Agent (With Standard 3 steps approach) +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX215', @Env = 'DEVL'; \ No newline at end of file diff --git a/SqlAgent/v2/01_Devl/4_Job_Maintenance/AddWeeklyJobSchedule.sql b/SqlAgent/v2/01_Devl/4_Job_Maintenance/AddWeeklyJobSchedule.sql new file mode 100644 index 0000000..7a1f2b5 --- /dev/null +++ b/SqlAgent/v2/01_Devl/4_Job_Maintenance/AddWeeklyJobSchedule.sql @@ -0,0 +1 @@ +EXEC msdb.dbo.usp_CreateWeeklySchedules @Env = 'DEVL'; \ No newline at end of file diff --git a/SqlAgent/v2/01_Devl/4_Job_Maintenance/DailyJobScheduleLookup.sql b/SqlAgent/v2/01_Devl/4_Job_Maintenance/DailyJobScheduleLookup.sql new file mode 100644 index 0000000..b893457 --- /dev/null +++ b/SqlAgent/v2/01_Devl/4_Job_Maintenance/DailyJobScheduleLookup.sql @@ -0,0 +1,86 @@ +/******************************************************************************************** + Section 1: Daily Job Schedule Lookup + -------------------------------------------------------------------------------------------- + Description: + Returns all SQL Agent jobs scheduled to run on a given date, along with their control + status (IsActive) and configured runtime from JobControl. + + Parameters: + @CheckDate - The date to check job schedules for. + + Notes: + • Uses MSDB’s internal schedule definitions (sysschedules, sysjobschedules). + • Supports One-time, Daily, Weekly, and Monthly schedule types. + • Can easily be adapted for DEVL / TEST / PROD by changing @DbName. + +********************************************************************************************/ +USE msdb; +GO + +DECLARE @CheckDate DATE = CAST(GETDATE() AS DATE); -- Change if needed +DECLARE @CheckWeekday INT = DATEPART(WEEKDAY, @CheckDate); +DECLARE @Env SYSNAME = 'DEVL'; -- Change for TEST or PROD +DECLARE @DbName SYSNAME; + +-- Map environment to the right control DB +SET @DbName = CASE @Env + WHEN 'DEVL' THEN 'DevlDUTASJobSchedule' + WHEN 'TEST' THEN 'TestDUTASJobSchedule' + WHEN 'PROD' THEN 'ProdDUTASJobSchedule' + END; + +DECLARE @Sql NVARCHAR(MAX); +SET @Sql = N' +SELECT + j.name AS SQLAgentJobName, + jc.JobName AS ControlJobName, + jc.ScheduledStartTime, + jc.IsActive, + s.name AS ScheduleName, + s.freq_type, + s.freq_interval, + s.freq_subday_type, + s.freq_subday_interval, + s.active_start_date, + CASE s.freq_type + WHEN 1 THEN ''One-time'' + WHEN 4 THEN ''Daily'' + WHEN 8 THEN ''Weekly'' + WHEN 16 THEN ''Monthly'' + ELSE ''Other'' + END AS FrequencyType, + CASE + WHEN s.freq_type = 1 + AND s.active_start_date = CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112)) + THEN 1 + WHEN s.freq_type = 4 + AND s.active_start_date <= CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112)) + THEN 1 + WHEN s.freq_type = 8 -- Weekly + AND (POWER(2, @CheckWeekdayParam - 1) & s.freq_interval) > 0 + THEN 1 + WHEN s.freq_type = 16 -- Monthly + AND DAY(@CheckDateParam) = s.freq_interval + THEN 1 + ELSE 0 + END AS IsScheduledToday +FROM msdb.dbo.sysjobs j +JOIN msdb.dbo.sysjobschedules js ON j.job_id = js.job_id +JOIN msdb.dbo.sysschedules s ON js.schedule_id = s.schedule_id +LEFT JOIN ' + QUOTENAME(@DbName) + '.dbo.JobControl jc ON jc.JobName = j.name +WHERE jc.IsActive = 1 + AND ( + (s.freq_type = 1 AND s.active_start_date = CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112))) -- One-time + OR (s.freq_type = 4 AND s.active_start_date <= CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112))) -- Daily + OR (s.freq_type = 8 AND (POWER(2, @CheckWeekdayParam - 1) & s.freq_interval) > 0) -- Weekly + OR (s.freq_type = 16 AND DAY(@CheckDateParam) = s.freq_interval) -- Monthly + ) +ORDER BY jc.ScheduledStartTime; +'; + +EXEC sp_executesql + @Sql, + N'@CheckDateParam DATE, @CheckWeekdayParam INT', + @CheckDateParam = @CheckDate, + @CheckWeekdayParam = @CheckWeekday; +GO diff --git a/SqlAgent/v2/01_Devl/4_Job_Maintenance/DeactivateJob.sql b/SqlAgent/v2/01_Devl/4_Job_Maintenance/DeactivateJob.sql new file mode 100644 index 0000000..3822af3 --- /dev/null +++ b/SqlAgent/v2/01_Devl/4_Job_Maintenance/DeactivateJob.sql @@ -0,0 +1,12 @@ +USE DevlDUTASJobSchedule; +GO + +UPDATE dbo.JobControl +SET IsActive = 0 +WHERE Frequency = 'MONTHLY'; +GO + +-- Optional: Verify changes +SELECT JobName, Frequency, IsActive +FROM dbo.JobControl +WHERE Frequency = 'MONTHLY'; diff --git a/SqlAgent/v2/01_Devl/4_Job_Maintenance/DeleteSchedule.sql b/SqlAgent/v2/01_Devl/4_Job_Maintenance/DeleteSchedule.sql new file mode 100644 index 0000000..b3cf962 --- /dev/null +++ b/SqlAgent/v2/01_Devl/4_Job_Maintenance/DeleteSchedule.sql @@ -0,0 +1,27 @@ +USE msdb; +GO + +DECLARE @EnvPrefix NVARCHAR(50) = N'DEVL'; -- <<< Change this to your environment prefix +DECLARE @schedule_id INT; +DECLARE @schedule_name NVARCHAR(128); + +DECLARE Sched_Cursor CURSOR FOR +SELECT schedule_id, name +FROM msdb.dbo.sysschedules +WHERE name LIKE @EnvPrefix + '%'; -- Only schedules starting with the given prefix + +OPEN Sched_Cursor; +FETCH NEXT FROM Sched_Cursor INTO @schedule_id, @schedule_name; + +WHILE @@FETCH_STATUS = 0 +BEGIN + PRINT 'Deleting schedule: ' + @schedule_name; + EXEC msdb.dbo.sp_delete_schedule @schedule_id = @schedule_id; + FETCH NEXT FROM Sched_Cursor INTO @schedule_id, @schedule_name; +END + +CLOSE Sched_Cursor; +DEALLOCATE Sched_Cursor; + +PRINT 'All SQL Agent schedules starting with prefix ' + @EnvPrefix + ' deleted successfully.'; +GO diff --git a/SqlAgent/v2/01_Devl/4_Job_Maintenance/DetachDeleteScheduleByName.sql b/SqlAgent/v2/01_Devl/4_Job_Maintenance/DetachDeleteScheduleByName.sql new file mode 100644 index 0000000..c337e5e --- /dev/null +++ b/SqlAgent/v2/01_Devl/4_Job_Maintenance/DetachDeleteScheduleByName.sql @@ -0,0 +1,13 @@ +-- If you know both the job name and schedule name +DECLARE @JobName NVARCHAR(100) = 'DEVL_MONTHLY_DTSCHGDC'; +DECLARE @ScheduleName NVARCHAR(200) = 'DEVL_MONTHLY_DTSCHGDC_MonthlySchedule'; +DECLARE @JobId UNIQUEIDENTIFIER; + +-- Get job ID +SELECT @JobId = job_id FROM msdb.dbo.sysjobs WHERE name = @JobName; + +-- Detach from specific job +EXEC msdb.dbo.sp_detach_schedule @job_id = @JobId, @schedule_name = @ScheduleName; + +-- Then delete +EXEC msdb.dbo.sp_delete_schedule @schedule_name = @ScheduleName; diff --git a/SqlAgent/v2/01_Devl/4_Job_Maintenance/ForceCompleteJob.sql b/SqlAgent/v2/01_Devl/4_Job_Maintenance/ForceCompleteJob.sql new file mode 100644 index 0000000..9add511 --- /dev/null +++ b/SqlAgent/v2/01_Devl/4_Job_Maintenance/ForceCompleteJob.sql @@ -0,0 +1,16 @@ +USE DevlDUTASJobSchedule; +GO + +-- 1. Check today's job status +SELECT JobName, Status, ErrorMessage +FROM dbo.JobExecutionHistory +WHERE RunDate = CAST(GETDATE() AS DATE) +AND JobName = 'DEVL_WEEKLY_DTSGSID1'; + +-- 2. Mark DTSBX305 as manually overridden +EXEC dbo.usp_ForceComplete 'DEVL_WEEKLY_DTSGSID1', 'Neeraj.Kumar'; + +-- 3. Verify the override +SELECT JobName, Status, OverrideBy, OverrideDate +FROM dbo.JobExecutionHistory +WHERE JobName = 'DEVL_WEEKLY_DTSGSID1' AND RunDate = CAST(GETDATE() AS DATE); \ No newline at end of file diff --git a/SqlAgent/v2/01_Devl/4_Job_Maintenance/GenerateJobScheduleTable.sql b/SqlAgent/v2/01_Devl/4_Job_Maintenance/GenerateJobScheduleTable.sql new file mode 100644 index 0000000..eae7ee1 --- /dev/null +++ b/SqlAgent/v2/01_Devl/4_Job_Maintenance/GenerateJobScheduleTable.sql @@ -0,0 +1,10 @@ +USE DevlDUTASJobSchedule; +GO + +-- Set Job Schedule for the Year 2025 +EXEC dbo.usp_GenerateJobSchedule @Year = 2025; +GO + +-- Set Job Schedule for the Year 2026 +EXEC dbo.usp_GenerateJobSchedule @Year = 2026; +GO \ No newline at end of file diff --git a/SqlAgent/v2/01_Devl/4_Job_Maintenance/JobInfo.sql b/SqlAgent/v2/01_Devl/4_Job_Maintenance/JobInfo.sql new file mode 100644 index 0000000..426e047 --- /dev/null +++ b/SqlAgent/v2/01_Devl/4_Job_Maintenance/JobInfo.sql @@ -0,0 +1,47 @@ +USE msdb; +GO + +PRINT '================================================================================'; +PRINT 'SECTION 1: JOB CONTROL INFORMATION'; +PRINT '================================================================================'; +GO + +-- View all active jobs +SELECT JobName, ScheduledStartTime, Frequency, IsActive +FROM DevlDUTASJobSchedule.dbo.JobControl +WHERE IsActive = 1 +ORDER BY Frequency, ScheduledStartTime; +GO + +-- View all inactive jobs +SELECT JobName, Frequency, ScheduledStartTime +FROM DevlDUTASJobSchedule.dbo.JobControl +WHERE IsActive = 0 +ORDER BY Frequency; +GO + +-- Find weekly/monthly jobs +SELECT JobName, Frequency, ScheduledStartTime +FROM DevlDUTASJobSchedule.dbo.JobControl +WHERE Frequency IN ('WEEKLY', 'MONTHLY') +ORDER BY Frequency, ScheduledStartTime; +GO + +PRINT '================================================================================'; +PRINT 'SECTION 2: JOB DEPENDENCIES'; +PRINT '================================================================================'; +GO + +-- Check dependencies for a job +DECLARE @Job NVARCHAR(100) = 'DEVL_MONTHLY_DTSCHGVR'; +SELECT JobName, PredecessorJobName +FROM DevlDUTASJobSchedule.dbo.JobDependencies +WHERE JobName = @Job; +GO + +-- Show dependency chain overview +SELECT d.JobName, d.PredecessorJobName, jc.ScheduledStartTime, jc.Frequency +FROM DevlDUTASJobSchedule.dbo.JobDependencies d +JOIN DevlDUTASJobSchedule.dbo.JobControl jc ON d.JobName = jc.JobName +ORDER BY jc.Frequency, jc.ScheduledStartTime; +GO diff --git a/SqlAgent/v2/01_Devl/4_Job_Maintenance/SQLAgentInfo.sql b/SqlAgent/v2/01_Devl/4_Job_Maintenance/SQLAgentInfo.sql new file mode 100644 index 0000000..d63458e --- /dev/null +++ b/SqlAgent/v2/01_Devl/4_Job_Maintenance/SQLAgentInfo.sql @@ -0,0 +1,42 @@ +USE msdb; +GO + +PRINT '================================================================================'; +PRINT 'SECTION 1: SQL AGENT JOB STATUS'; +PRINT '================================================================================'; +GO + +-- List all jobs in SQL Agent +SELECT name AS JobName, enabled, date_created, date_modified +FROM msdb.dbo.sysjobs +ORDER BY name; +GO + +-- Job schedule summary +SELECT j.name AS JobName, s.name AS ScheduleName, + s.enabled, s.freq_type, s.active_start_date, s.active_start_time +FROM msdb.dbo.sysjobs j +JOIN msdb.dbo.sysjobschedules js ON j.job_id = js.job_id +JOIN msdb.dbo.sysschedules s ON js.schedule_id = s.schedule_id +ORDER BY j.name; +GO + +-- Last job run details +SELECT j.name AS JobName, + h.run_status, + CASE h.run_status + WHEN 0 THEN 'Failed' + WHEN 1 THEN 'Succeeded' + WHEN 2 THEN 'Retry' + WHEN 3 THEN 'Canceled' + WHEN 4 THEN 'In Progress' + END AS StatusDescription, + msdb.dbo.agent_datetime(h.run_date, h.run_time) AS RunDateTime, + h.run_duration +FROM dbo.sysjobs j +LEFT JOIN dbo.sysjobhistory h ON j.job_id = h.job_id +WHERE h.instance_id IN ( + SELECT MAX(instance_id) FROM dbo.sysjobhistory GROUP BY job_id +) +ORDER BY RunDateTime DESC; +GO \ No newline at end of file diff --git a/SqlAgent/v2/01_Devl/4_Job_Maintenance/ScheduleJobsMonthly.sql b/SqlAgent/v2/01_Devl/4_Job_Maintenance/ScheduleJobsMonthly.sql new file mode 100644 index 0000000..975520b --- /dev/null +++ b/SqlAgent/v2/01_Devl/4_Job_Maintenance/ScheduleJobsMonthly.sql @@ -0,0 +1,3 @@ +USE DevlDUTASJobSchedule; +GO +EXEC dbo.usp_ScheduleJobsForMonth; diff --git a/SqlAgent/v2/01_Devl/4_Job_Maintenance/TodaysExecution.sql b/SqlAgent/v2/01_Devl/4_Job_Maintenance/TodaysExecution.sql new file mode 100644 index 0000000..3480fdd --- /dev/null +++ b/SqlAgent/v2/01_Devl/4_Job_Maintenance/TodaysExecution.sql @@ -0,0 +1,21 @@ +USE DevlDUTASJobSchedule; +GO + +DECLARE @Runday DATE = DATEADD(day, +0, CAST(GETDATE() AS DATE)); -- -1 for Yesterday + +SELECT + jeh.ExecutionID, + jeh.JobName, + jeh.RunDate, + jc.ScheduledStartTime, + jeh.ActualStartTime, + jeh.ActualEndTime, + jeh.Status, + jeh.ErrorMessage, + jeh.OverrideFlag, + jeh.OverrideBy +FROM dbo.JobExecutionHistory jeh +INNER JOIN dbo.JobControl jc + ON jeh.JobName = jc.JobName +WHERE jeh.RunDate = @Runday +ORDER BY jc.ScheduledStartTime, jeh.ActualStartTime; diff --git a/SqlAgent/v2/01_Devl/4_Job_Maintenance/TriggerMissedJob.sql b/SqlAgent/v2/01_Devl/4_Job_Maintenance/TriggerMissedJob.sql new file mode 100644 index 0000000..c2f3e90 --- /dev/null +++ b/SqlAgent/v2/01_Devl/4_Job_Maintenance/TriggerMissedJob.sql @@ -0,0 +1,9 @@ +USE [DevlDUTASJobSchedule] +GO + +-- 1. Preview missed jobs (safe, no run): + EXEC dbo.usp_TriggerMissedJobs @DryRun = 1; + +-- 2. Actually trigger missed jobs: + EXEC dbo.usp_TriggerMissedJobs @DryRun = 0; + diff --git a/SqlAgent/v2/01_Devl/5_PowerShell_Scripts/Execute-RemoteJob.ps1 b/SqlAgent/v2/01_Devl/5_PowerShell_Scripts/Execute-RemoteJob.ps1 new file mode 100644 index 0000000..ddf3ea8 --- /dev/null +++ b/SqlAgent/v2/01_Devl/5_PowerShell_Scripts/Execute-RemoteJob.ps1 @@ -0,0 +1,102 @@ +param( + [Parameter(Mandatory = $true)] + [string]$JobName, + + [Parameter(Mandatory = $true)] + [ValidateSet('DEVL', 'TEST', 'PROD')] + [string]$Env +) + +try { + Write-Host "Starting job $JobName in environment $Env at $(Get-Date)" + + # ------------------------------------------------------------ + # Extract JCL from JobName (ENV_FREQUENCY_JOB pattern) + # ------------------------------------------------------------ + $JCL = $JobName -replace '^[A-Z]+_[A-Z]+_', '' + Write-Host "Extracted JCL: $JCL from JobName: $JobName" -ForegroundColor Yellow + + # ------------------------------------------------------------ + # Environment-specific configuration + # ------------------------------------------------------------ + switch ($Env.ToUpper()) { + 'DEVL' { + $ComputerName = '10.57.110.120' + $DatabaseName = 'DevlDUTASJobSchedule' + } + 'TEST' { + $ComputerName = '10.57.110.141' + $DatabaseName = 'TestDUTASJobSchedule' + } + 'PROD' { + $ComputerName = '10.57.111.125' + $DatabaseName = 'ProdDUTASJobSchedule' + } + default { + throw "Invalid environment specified: $Env" + } + } + + # ------------------------------------------------------------ + # Remote credentials + # (recommend moving credentials to secure vault for production) + # ------------------------------------------------------------ + $username = "DUTASSQLAdminP@does.dcgov.priv" + $password = "4ho@3Pr&Xof8" | ConvertTo-SecureString -AsPlainText -Force + $credential = New-Object System.Management.Automation.PSCredential($username, $password) + + # ------------------------------------------------------------ + # Execute job remotely using the extracted JCL + # ------------------------------------------------------------ + Write-Host "Connecting to remote server $ComputerName ..." + $exitCode = Invoke-Command -ComputerName $ComputerName ` + -Credential $credential ` + -Authentication CredSSP ` + -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck) ` + -ArgumentList $JobName, $JCL, $Env ` + -ScriptBlock { + param($JobName, $JCL, $Env) + + Write-Host "Remote execution - JobName: $JobName, JCL: $JCL, Env: $Env" + + $process = Start-Process -FilePath "powershell.exe" ` + -ArgumentList "-ExecutionPolicy Bypass -File `"E:\PSScript\RCSubmit-Job.ps1`" -JobName `"$JCL`" -Env `"$Env`"" ` + -NoNewWindow -Wait -PassThru + return $process.ExitCode + } + + if ($exitCode -eq 0) { + Write-Host "Job $JobName (JCL: $JCL) completed successfully at $(Get-Date)" -ForegroundColor Green + } else { + Write-Error "Job $JobName (JCL: $JCL) failed with exit code: $exitCode" + } +} +catch { + Write-Error "Job $JobName failed with error: $($_.Exception.Message)" + $exitCode = 1 +} +finally { + # ------------------------------------------------------------ + # Log exit code to the appropriate database + # ------------------------------------------------------------ + try { + $connectionString = "Server=localhost;Database=$DatabaseName;Trusted_Connection=true;" + $connection = New-Object System.Data.SqlClient.SqlConnection($connectionString) + $connection.Open() + + $command = $connection.CreateCommand() + $command.CommandText = @" + INSERT INTO dbo.JobExitCodes (JobName, RunDate, ExitCode, RecordedTime) + VALUES ('$JobName', CAST(GETDATE() AS DATE), $exitCode, GETDATE()); +"@ + $command.ExecuteNonQuery() + $connection.Close() + Write-Host "Exit code $exitCode logged to database $DatabaseName for job $JobName" + } + catch { + $errorMsg = $_.Exception.Message + Write-Host "Failed to log exit code to database $DatabaseName`: $errorMsg" + } +} + +exit $exitCode \ No newline at end of file diff --git a/SqlAgent/v2/01_Devl/5_PowerShell_Scripts/RCSubmit-Job.ps1 b/SqlAgent/v2/01_Devl/5_PowerShell_Scripts/RCSubmit-Job.ps1 new file mode 100644 index 0000000..b9893d7 --- /dev/null +++ b/SqlAgent/v2/01_Devl/5_PowerShell_Scripts/RCSubmit-Job.ps1 @@ -0,0 +1,108 @@ +param( + [string]$JobName, + [string]$Env +) + +# --- Parameter Validation --- +if (-not $JobName) { + Write-Host "JobName parameter is required" -ForegroundColor Red + exit 1 +} +if (-not $Env) { + Write-Host "Environment (Env) parameter is required" -ForegroundColor Red + exit 1 +} + +# --- Execute Job --- +Write-Host "Submitting job: $JobName in environment: $Env" -ForegroundColor Cyan +$output = & "$env:rcbin\submit.exe" -DSN="DOESTAX.$Env.JOBS.BATCH.LIB($JobName)" +$exitCode = [int]$LASTEXITCODE +$isSuccess = 0 + +# --- Parse SYSLOG Path --- +$syslogPath = $null +$syslogFolder = "Not found" +$content = @() +$summary = @() + +try { + $syslogPath = $output | Select-String -Pattern "SYSLOG=\[(.*)\]" | ForEach-Object { $_.Matches.Groups[1].Value } + + if ($syslogPath -and (Test-Path $syslogPath)) { + $syslogFolder = Split-Path $syslogPath -Parent + $content = Get-Content $syslogPath -ErrorAction Stop + $summary = $content | Select-String -Pattern "%Job Overall Stats:" -Context 0,7 | ForEach-Object { + $_.Context.PostContext | Select-Object -Skip 1 -First 5 + } + } else { + Write-Host "SYSLOG path not found or inaccessible: $syslogPath" -ForegroundColor Yellow + $summary = @("SYSLOG file not found in output", "Raw output:", $output -join "`n") + } +} +catch { + Write-Host "Error processing SYSLOG: $($_.Exception.Message)" -ForegroundColor Yellow + $summary = @("Error reading SYSLOG: $($_.Exception.Message)", "Raw output:", $output -join "`n") +} + +# --- Evaluate Return Codes --- +$successConditions = @( + { $JobName -eq "GSIRQ300" -and $exitCode -eq 50 }, + { $JobName -eq "DTSGWAGE" -and $exitCode -eq 8 }, + { $JobName -eq "DTSGCHKS" -and $exitCode -eq 8 }, + { $JobName -eq "DTSGPAYT" -and $exitCode -eq 8 }, + { $JobName -eq "DTSBXACH" -and $exitCode -eq 2 }, + { $JobName -eq "DTSBXREL" -and $exitCode -eq 2 }, + { $JobName -eq "DTSMIN02" -and $exitCode -eq 4 }, + { $JobName -eq "DTSBE405" -and $exitCode -eq 910 }, + { $JobName -eq "DTSBXREJ" -and $exitCode -eq 4 }, + { $JobName -eq "DTSRQ444" -and $exitCode -eq 4 }, + { $exitCode -eq 0 } +) + +if ($successConditions | Where-Object { & $_ }) { + Write-Host "Job $JobName succeeded with code $exitCode" -ForegroundColor Green + $isSuccess = 0 +} else { + Write-Host "Job $JobName failed with code $exitCode" -ForegroundColor Red + $isSuccess = 1 + # Only use error if we don't have a proper summary + if ($summary.Count -eq 0) { + $summary = @($Error[0]) + } +} + +# --- Email Notification --- +$smtpServer = "smtp4.dc.gov" +$fromEmail = "Dutas@dc.gov" +$toEmail = "zarath.lalputan@dc.gov" +$ccEmail = @("srujani.chandragiri@dc.gov") + +$emailBody = @" +
+DUTAS Batch Job: $JobName Execution Report
+==========================================
+$($summary -join "`n")
+==========================================
+
+Return Code: $exitCode
+Status: $(if ($isSuccess -eq 0) { "SUCCESS" } else { "FAILED" })
+JOBLOG Path: $syslogFolder
+
+"@ + +try { + Send-MailMessage -SmtpServer $smtpServer -Port 25 ` + -From $fromEmail -To $toEmail -Cc $ccEmail ` + -Subject "DUTAS-[$Env] Job Status: $JobName - $(if ($isSuccess -eq 0) { 'SUCCESS' } else { 'FAILED' })" ` + -Body $emailBody -BodyAsHtml + Write-Host "Email sent successfully to $toEmail" -ForegroundColor Cyan +} +catch { + Write-Host "Failed to send email: $($_.Exception.Message)" -ForegroundColor Yellow +} + +Write-Host "`n---------------------------------------------" +Write-Host "Job: $JobName | ExitCode: $exitCode | Status: $(if ($isSuccess -eq 0) { 'SUCCESS' } else { 'FAILED' })" +Write-Host "---------------------------------------------`n" + +exit $isSuccess \ No newline at end of file diff --git a/SqlAgent/v2/01_Devl/6_Backup_Restore/Backup-Restore-Guide.docx b/SqlAgent/v2/01_Devl/6_Backup_Restore/Backup-Restore-Guide.docx new file mode 100644 index 0000000..c19787a Binary files /dev/null and b/SqlAgent/v2/01_Devl/6_Backup_Restore/Backup-Restore-Guide.docx differ diff --git a/SqlAgent/v2/01_Devl/6_Backup_Restore/Backup-SQLAgent.ps1 b/SqlAgent/v2/01_Devl/6_Backup_Restore/Backup-SQLAgent.ps1 new file mode 100644 index 0000000..0271cda --- /dev/null +++ b/SqlAgent/v2/01_Devl/6_Backup_Restore/Backup-SQLAgent.ps1 @@ -0,0 +1,48 @@ +# =================================================================== +# SQL Agent Jobs Backup Script (PowerShell) +# Modern Version using SqlServer module +# & "E:\Neeraj\SqlAgent\v2\01_Devl\6_Backup\Backup-SQLAgent.ps1" ` +# -ServerName "DOES-DUTAS-SQL1" ` +# -BackupPath "\\DOES-RAINVM-DEV\E$\Neeraj\SqlAgent\Backup\" +# +# =================================================================== + +param ( + [Parameter(Mandatory = $true)] + [string]$ServerName, + + [Parameter(Mandatory = $true)] + [string]$BackupPath +) + +# Load SQL Server PowerShell module +Import-Module SqlServer -ErrorAction Stop + +# Create timestamp and output paths +$Timestamp = Get-Date -Format "yyyyMMdd_HHmmss" +$ZipFile = Join-Path $BackupPath "SQLAgentJobs_$Timestamp.zip" + +# Ensure backup folder exists +if (-not (Test-Path $BackupPath)) { + New-Item -ItemType Directory -Path $BackupPath | Out-Null +} + +# Connect to SQL Server +$server = New-Object Microsoft.SqlServer.Management.Smo.Server $ServerName + +# Export all jobs as individual SQL scripts +$JobFiles = @() +foreach ($job in $server.JobServer.Jobs) { + $SafeJobName = ($job.Name -replace '[\\/:*?"<>|]', '_') + $FileName = Join-Path $BackupPath "$SafeJobName`_$Timestamp.sql" + $job.Script() | Out-File -FilePath $FileName -Encoding UTF8 + $JobFiles += $FileName +} + +# Compress all SQL files into a single ZIP +Compress-Archive -Path $JobFiles -DestinationPath $ZipFile -Force + +# Optional: clean up individual .sql files +# Remove-Item -Path $JobFiles + +Write-Host "SQL Agent jobs backup complete: $ZipFile" -ForegroundColor Green diff --git a/SqlAgent/v2/01_Devl/6_Backup_Restore/BackupDB.sql b/SqlAgent/v2/01_Devl/6_Backup_Restore/BackupDB.sql new file mode 100644 index 0000000..1412c11 --- /dev/null +++ b/SqlAgent/v2/01_Devl/6_Backup_Restore/BackupDB.sql @@ -0,0 +1,19 @@ +USE master; +GO + +DECLARE @SrcDB NVARCHAR(128) = 'DevlDUTASJobSchedule'; +DECLARE @BackupPath NVARCHAR(260) = '\\DOES-RAINVM-DEV\E$\Neeraj\SqlAgent\Backup\' + @SrcDB + '.bak'; +DECLARE @SQL NVARCHAR(MAX); + +-- Dynamic SQL for backup +SET @SQL = ' +BACKUP DATABASE [' + @SrcDB + '] +TO DISK = N''' + @BackupPath + ''' +WITH INIT, COMPRESSION, STATS = 10; +'; + +-- Execute backup +EXEC(@SQL); + +PRINT 'Backup completed: ' + @BackupPath; +GO diff --git a/SqlAgent/v2/01_Devl/6_Backup_Restore/Cleanup-SQLAgent.ps1 b/SqlAgent/v2/01_Devl/6_Backup_Restore/Cleanup-SQLAgent.ps1 new file mode 100644 index 0000000..edcb054 --- /dev/null +++ b/SqlAgent/v2/01_Devl/6_Backup_Restore/Cleanup-SQLAgent.ps1 @@ -0,0 +1,45 @@ +<# +.SYNOPSIS +Deletes SQL Agent jobs whose names start with a given environment prefix (e.g., DEVL, TEST, PROD). + +.PARAMETER ServerName +SQL Server instance name (use FCI virtual name if clustered). + +.PARAMETER Env +Environment prefix for job deletion (e.g., DEVL, TEST, PROD). + +.EXAMPLE +.\Cleanup-SQLAgent.ps1 -ServerName "DOES-DUTAS-SQL1" -Env "DEVL" +#> + +param ( + [Parameter(Mandatory = $true)] + [string]$ServerName, + + [Parameter(Mandatory = $true)] + [string]$Environment +) + +# Load SQL Server module +Import-Module SqlServer -ErrorAction Stop + +# Connect to SQL Server +$server = New-Object Microsoft.SqlServer.Management.Smo.Server $ServerName + +# Create log file path (same folder as script) +$ScriptRoot = Split-Path -Parent $MyInvocation.MyCommand.Definition +$LogPath = Join-Path $ScriptRoot "CleanupSQLAgent_$($Environment)_$(Get-Date -Format 'yyyyMMdd_HHmmss').log" + +"=== SQL Agent Cleanup Started for $Environment : $(Get-Date) ===" | Out-File $LogPath -Encoding UTF8 + +# Take a snapshot of all jobs first (avoids collection modification issue) +$jobsToDelete = @($server.JobServer.Jobs | Where-Object { $_.Name -like "$Environment*" }) + +foreach ($job in $jobsToDelete) { + Write-Host "Deleting job: $($job.Name)" -ForegroundColor Yellow + "Deleting job: $($job.Name)" | Out-File $LogPath -Append -Encoding UTF8 + $job.Drop() +} + +"=== Cleanup Complete for $Environment : $(Get-Date) ===" | Out-File $LogPath -Append -Encoding UTF8 +Write-Host "All $Environment SQL Agent jobs deleted successfully." -ForegroundColor Green diff --git a/SqlAgent/v2/01_Devl/6_Backup_Restore/CleanupSQLAgent.sql b/SqlAgent/v2/01_Devl/6_Backup_Restore/CleanupSQLAgent.sql new file mode 100644 index 0000000..43ff71d --- /dev/null +++ b/SqlAgent/v2/01_Devl/6_Backup_Restore/CleanupSQLAgent.sql @@ -0,0 +1,27 @@ +USE msdb; +GO + +DECLARE @EnvPrefix NVARCHAR(50) = N'DEVL'; -- <<< Change this to your environment prefix +DECLARE @job_id UNIQUEIDENTIFIER; +DECLARE @job_name NVARCHAR(200); + +DECLARE JobCursor CURSOR FOR +SELECT job_id, name +FROM msdb.dbo.sysjobs +WHERE name LIKE @EnvPrefix + '%'; -- Only jobs starting with the given prefix + +OPEN JobCursor; +FETCH NEXT FROM JobCursor INTO @job_id, @job_name; + +WHILE @@FETCH_STATUS = 0 +BEGIN + PRINT 'Deleting job: ' + @job_name; + EXEC msdb.dbo.sp_delete_job @job_id = @job_id; + FETCH NEXT FROM JobCursor INTO @job_id, @job_name; +END + +CLOSE JobCursor; +DEALLOCATE JobCursor; + +PRINT 'All SQL Agent jobs starting with prefix ' + @EnvPrefix + ' deleted successfully.'; +GO diff --git a/SqlAgent/v2/01_Devl/6_Backup_Restore/Extract_Backup-SQLAgent.ps1 b/SqlAgent/v2/01_Devl/6_Backup_Restore/Extract_Backup-SQLAgent.ps1 new file mode 100644 index 0000000..83fba92 --- /dev/null +++ b/SqlAgent/v2/01_Devl/6_Backup_Restore/Extract_Backup-SQLAgent.ps1 @@ -0,0 +1,8 @@ +$BackupZip = "\\DOES-RAINVM-DEV\E$\Neeraj\SqlAgent\Backup\SQLAgentJobs_20251018_153000.zip" +$ExtractPath = "\\DOES-RAINVM-DEV\E$\Neeraj\SqlAgent\Restore\" + +# Create folder if not exist +if (-not (Test-Path $ExtractPath)) { New-Item -ItemType Directory -Path $ExtractPath | Out-Null } + +# Extract the ZIP +Expand-Archive -Path $BackupZip -DestinationPath $ExtractPath -Force diff --git a/SqlAgent/v2/01_Devl/6_Backup_Restore/RestoreDB.sql b/SqlAgent/v2/01_Devl/6_Backup_Restore/RestoreDB.sql new file mode 100644 index 0000000..60978a2 --- /dev/null +++ b/SqlAgent/v2/01_Devl/6_Backup_Restore/RestoreDB.sql @@ -0,0 +1,31 @@ +USE master; +GO + +DECLARE @SrcDB NVARCHAR(128) = 'DevlDUTASJobSchedule'; -- original database +DECLARE @NewDB NVARCHAR(128) = 'DevlDUTASJobSchedule'; -- database name to restore as +DECLARE @BackupPath NVARCHAR(260) = '\\DOES-RAINVM-DEV\E$\Neeraj\SqlAgent\Backup\' + @SrcDB + '.bak'; +DECLARE @SQL NVARCHAR(MAX); + +-- Optional: check logical file names inside backup +-- RESTORE FILELISTONLY FROM DISK = @BackupPath; + +-- Dynamic SQL for restore +SET @SQL = ' +-- Optional: disconnect active connections +ALTER DATABASE [' + @NewDB + '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; + +RESTORE DATABASE [' + @NewDB + '] +FROM DISK = N''' + @BackupPath + ''' +WITH MOVE N''' + @SrcDB + ''' TO N''\\DOES-RAINVM-DEV\E$\SQLData\' + @NewDB + '.mdf'', + MOVE N''' + @SrcDB + '_log'' TO N''\\DOES-RAINVM-DEV\E$\SQLLogs\' + @NewDB + '_log.ldf'', + REPLACE, STATS = 10; + +-- Set database back to multi-user +ALTER DATABASE [' + @NewDB + '] SET MULTI_USER; +'; + +-- Execute restore +EXEC(@SQL); + +PRINT 'Database restored successfully as ' + @NewDB; +GO diff --git a/SqlAgent/v2/01_Devl/6_Backup_Restore/RestoreSQLAgent.sql b/SqlAgent/v2/01_Devl/6_Backup_Restore/RestoreSQLAgent.sql new file mode 100644 index 0000000..697baeb --- /dev/null +++ b/SqlAgent/v2/01_Devl/6_Backup_Restore/RestoreSQLAgent.sql @@ -0,0 +1,12 @@ +# Connect to SQL Server +$ServerName = "DOES-DUTAS-SQL1" +$SqlInstance = "localhost" # or server instance name + +# Execute each script +$ScriptFiles = Get-ChildItem -Path $ExtractPath -Filter *.sql +foreach ($file in $ScriptFiles) { + Write-Host "Restoring job from: $($file.FullName)" + sqlcmd -S $SqlInstance -i $file.FullName +} + +Write-Host "All SQL Agent jobs restored successfully." diff --git a/SqlAgent/v2/02_Test/1_Database_Setup/CreateDB.sql b/SqlAgent/v2/02_Test/1_Database_Setup/CreateDB.sql new file mode 100644 index 0000000..bdc31a6 --- /dev/null +++ b/SqlAgent/v2/02_Test/1_Database_Setup/CreateDB.sql @@ -0,0 +1,83 @@ +-- Create the database +CREATE DATABASE TestDUTASJobSchedule; +GO + +USE TestDUTASJobSchedule; +GO + +-- Create the main control table +CREATE TABLE dbo.JobControl +( + JobID INT IDENTITY(1,1) NOT NULL, + JobName VARCHAR(50) NOT NULL, + ScheduledStartTime TIME(7) NOT NULL, + SchedulerAction VARCHAR(10) NOT NULL, -- STOP or CONTINUE + IsActive BIT NOT NULL CONSTRAINT DF_JobControl_IsActive DEFAULT (1), + CreatedDate DATETIME NOT NULL CONSTRAINT DF_JobControl_CreatedDate DEFAULT (GETDATE()), + Frequency CHAR(20) NOT NULL CONSTRAINT DF_JobControl_Frequency DEFAULT ('DAILY'), + FrequencyPattern NVARCHAR(500) NULL, -- JSON scheduling rule + + CONSTRAINT PK_JobControl PRIMARY KEY CLUSTERED (JobID ASC), + CONSTRAINT UQ_JobControl_JobName UNIQUE NONCLUSTERED (JobName ASC), + CONSTRAINT CK_JobControl_SchedulerAction CHECK (SchedulerAction IN ('STOP', 'CONTINUE')) +); +GO + +-- Create job dependencies table +CREATE TABLE dbo.JobDependencies ( + DependencyID INT IDENTITY(1,1) PRIMARY KEY, + JobName VARCHAR(50) NOT NULL, + PredecessorJobName VARCHAR(50) NULL, + FOREIGN KEY (JobName) REFERENCES dbo.JobControl(JobName) +); +GO + +-- Create execution history table +CREATE TABLE dbo.JobExecutionHistory ( + ExecutionID INT IDENTITY(1,1) PRIMARY KEY, + JobName VARCHAR(50) NOT NULL, + RunDate DATE NOT NULL, + ScheduledStartTime TIME NOT NULL, + ActualStartTime DATETIME NULL, + ActualEndTime DATETIME NULL, + Status VARCHAR(20) DEFAULT 'Pending' CHECK (Status IN ('Pending', 'Running', 'Success', 'Failed', 'ForceComplete')), + ErrorMessage VARCHAR(MAX) NULL, + OverrideFlag BIT DEFAULT 0, + OverrideBy VARCHAR(100) NULL, + OverrideDate DATETIME NULL +); +GO + +-- Create holidays table +CREATE TABLE dbo.FederalHolidays ( + HolidayID INT IDENTITY(1,1) PRIMARY KEY, + HolidayDate DATE NOT NULL UNIQUE, + HolidayName VARCHAR(100) NOT NULL, + Year INT NOT NULL +); +GO + +-- Create Exit Code table for PowerShell Script +CREATE TABLE dbo.JobExitCodes +( + JobExecutionID INT IDENTITY(1,1) PRIMARY KEY, -- unique ID per execution + JobName NVARCHAR(128) NOT NULL, -- job name + RunDate DATE NOT NULL, -- date of execution + ExitCode INT NOT NULL, -- exit code from job + RecordedTime DATETIME NOT NULL DEFAULT GETDATE() -- timestamp of execution +); +GO +-- Create JobSchedule table +CREATE TABLE dbo.JobSchedule ( + JobScheduleID INT IDENTITY(1,1) PRIMARY KEY, + JobName VARCHAR(100) NOT NULL, + Frequency VARCHAR(20) CHECK (Frequency IN ('Monthly','Quarterly')), + ScheduledRule NVARCHAR(500) NULL, -- Copy of JSON or rule text from JobControl + ScheduledDate DATE NOT NULL, -- Planned date (before adjustment) + AdjustedRunDate DATE NOT NULL, -- Final working-day adjusted date + MonthOfSchedule CHAR(7) NOT NULL, -- 'YYYY-MM' + YearOfSchedule INT NOT NULL, + CreatedOn DATETIME DEFAULT GETDATE(), + CreatedBy VARCHAR(50) DEFAULT SUSER_SNAME() +); +GO \ No newline at end of file diff --git a/SqlAgent/v2/02_Test/1_Database_Setup/InsertHolidays.sql b/SqlAgent/v2/02_Test/1_Database_Setup/InsertHolidays.sql new file mode 100644 index 0000000..e517718 --- /dev/null +++ b/SqlAgent/v2/02_Test/1_Database_Setup/InsertHolidays.sql @@ -0,0 +1,29 @@ +USE [TestDUTASJobSchedule] +GO +SET IDENTITY_INSERT [dbo].[FederalHolidays] ON +GO +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (1, CAST(N'2025-01-01' AS Date), N'New Years Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (2, CAST(N'2025-01-20' AS Date), N'Martin Luther King Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (3, CAST(N'2025-02-17' AS Date), N'Presidents Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (4, CAST(N'2025-05-26' AS Date), N'Memorial Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (5, CAST(N'2025-06-19' AS Date), N'Juneteenth Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (6, CAST(N'2025-07-04' AS Date), N'Independence Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (7, CAST(N'2025-09-01' AS Date), N'Labor Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (8, CAST(N'2025-10-13' AS Date), N'Columbus Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (9, CAST(N'2025-11-11' AS Date), N'Veterans Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (10, CAST(N'2025-11-27' AS Date), N'Thanksgiving Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (11, CAST(N'2025-12-25' AS Date), N'Christmas Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (12, CAST(N'2026-01-01' AS Date), N'New Years Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (13, CAST(N'2026-01-19' AS Date), N'Martin Luther King Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (14, CAST(N'2026-02-16' AS Date), N'Presidents Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (15, CAST(N'2026-05-25' AS Date), N'Memorial Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (16, CAST(N'2026-06-19' AS Date), N'Juneteenth Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (17, CAST(N'2026-07-03' AS Date), N'Independence Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (18, CAST(N'2026-09-07' AS Date), N'Labor Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (19, CAST(N'2026-10-12' AS Date), N'Columbus Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (20, CAST(N'2026-11-11' AS Date), N'Veterans Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (21, CAST(N'2026-11-26' AS Date), N'Thanksgiving Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (22, CAST(N'2026-12-25' AS Date), N'Christmas Day', 2026) +GO +SET IDENTITY_INSERT [dbo].[FederalHolidays] OFF +GO diff --git a/SqlAgent/v2/02_Test/1_Database_Setup/InsertJobControl.sql b/SqlAgent/v2/02_Test/1_Database_Setup/InsertJobControl.sql new file mode 100644 index 0000000..119af04 --- /dev/null +++ b/SqlAgent/v2/02_Test/1_Database_Setup/InsertJobControl.sql @@ -0,0 +1,143 @@ +USE [TestDUTASJobSchedule] +GO +SET IDENTITY_INSERT [dbo].[JobControl] ON +GO +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (1, N'TEST_DAILY_DTSBX215', CAST(N'04:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (2, N'TEST_DAILY_DTSBX305', CAST(N'04:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (3, N'TEST_DAILY_DTSGSID0', CAST(N'06:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (4, N'TEST_DAILY_GSIRQ300', CAST(N'06:05:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (5, N'TEST_DAILY_DTSRQ202', CAST(N'06:10:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (6, N'TEST_DAILY_DTSGSID1', CAST(N'06:15:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (7, N'TEST_DAILY_DTSBX202', CAST(N'07:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (8, N'TEST_DAILY_DTSFT202', CAST(N'08:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (9, N'TEST_DAILY_DTSBX432', CAST(N'08:30:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (10, N'TEST_DAILY_DTSGACHD', CAST(N'09:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (11, N'TEST_DAILY_DTSBX303', CAST(N'10:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (12, N'TEST_DAILY_DTSGWAGE', CAST(N'14:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (13, N'TEST_DAILY_DTSGCHKS', CAST(N'14:05:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (14, N'TEST_DAILY_DTSESDAY', CAST(N'14:05:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (15, N'TEST_DAILY_DTSGPAYT', CAST(N'14:10:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (16, N'TEST_DAILY_DTSDX145', CAST(N'16:05:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (17, N'TEST_DAILY_DTSBX629', CAST(N'16:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (18, N'TEST_DAILY_DTSBX630', CAST(N'16:30:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (19, N'TEST_DAILY_DTSFRAUD', CAST(N'16:30:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (20, N'TEST_DAILY_DTSRACHD', CAST(N'17:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (21, N'TEST_DAILY_DTSBXACH', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (22, N'TEST_DAILY_DTSBXREG', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (23, N'TEST_DAILY_DTSBX430', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (24, N'TEST_DAILY_DTSBX626', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (25, N'TEST_DAILY_DTSBX530', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (26, N'TEST_DAILY_DTSBXREL', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (27, N'TEST_DAILY_DTSBX450', CAST(N'17:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (28, N'TEST_DAILY_DTSBX451', CAST(N'17:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (29, N'TEST_DAILY_DTSPACHD', CAST(N'18:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (30, N'TEST_DAILY_DTSPX148', CAST(N'18:05:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (31, N'TEST_DAILY_DTSRQ325', CAST(N'18:05:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (32, N'TEST_DAILY_DTSBX427', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (33, N'TEST_DAILY_DTSPDAY1', CAST(N'18:10:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (34, N'TEST_DAILY_DTSW4WGE', CAST(N'18:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (35, N'TEST_DAILY_DTSGSID2', CAST(N'18:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (36, N'TEST_DAILY_DTSGSID9', CAST(N'18:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (37, N'TEST_DAILY_DTSMIN01', CAST(N'18:20:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (38, N'TEST_DAILY_DTSMIN02', CAST(N'18:20:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (39, N'TEST_DAILY_DTSRQ459', CAST(N'19:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (40, N'TEST_DAILY_DTSBXPFL', CAST(N'19:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (41, N'TEST_DAILY_DESBD427', CAST(N'19:05:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (42, N'TEST_DAILY_DTSBX403', CAST(N'20:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (43, N'TEST_DAILY_DTSBE405', CAST(N'20:15:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (44, N'TEST_DAILY_DTSBX405', CAST(N'20:15:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (45, N'TEST_DAILY_DTSRQ335', CAST(N'21:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (46, N'TEST_DAILY_DTSBX601', CAST(N'21:25:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (47, N'TEST_WEEKLY_DTSGSID0', CAST(N'06:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Sat","Sun"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (48, N'TEST_WEEKLY_DTSGSID1', CAST(N'06:15:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Sat","Sun"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (49, N'TEST_WEEKLY_DTSBX202', CAST(N'07:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Sat","Sun"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (50, N'TEST_WEEKLY_DTSFT202', CAST(N'08:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Sat","Sun"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (51, N'TEST_WEEKLY_DTSBX470', CAST(N'07:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (52, N'TEST_WEEKLY_DTSBXREJ', CAST(N'17:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Tue","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (53, N'TEST_WEEKLY_DTSPDAY7', CAST(N'19:10:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (54, N'TEST_WEEKLY_DTSBX122', CAST(N'19:14:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (55, N'TEST_WEEKLY_DTSRQ511', CAST(N'19:14:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (56, N'TEST_WEEKLY_DTSRQ444', CAST(N'07:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Mon"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (57, N'TEST_WEEKLY_DTSRQ126', CAST(N'09:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Mon"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (58, N'TEST_MONTHLY_DTSRQ414', CAST(N'18:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"FirstWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (59, N'TEST_MONTHLY_DTSPMON1', CAST(N'19:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (60, N'TEST_MONTHLY_DTSCHGVB', CAST(N'19:26:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (61, N'TEST_MONTHLY_DTSCHGVR', CAST(N'19:27:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (62, N'TEST_MONTHLY_DTSVBKUP', CAST(N'19:26:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (63, N'TEST_MONTHLY_DTSVRSTR', CAST(N'19:30:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (64, N'TEST_MONTHLY_DTSRQ442', CAST(N'19:37:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (65, N'TEST_MONTHLY_DTSBX460', CAST(N'19:35:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (66, N'TEST_MONTHLY_DTSRQ513', CAST(N'19:37:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (67, N'TEST_MONTHLY_DTSCHGDC', CAST(N'13:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"FirstWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (68, N'TEST_QUARTERLY_DTSRQ119', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Months":[3,6,9,12],"Day":3}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (69, N'TEST_QUARTERLY_DTSRQ902', CAST(N'18:16:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Months":[3,6,9,12],"Day":1}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (70, N'TEST_QUARTERLY_DTSBX500', CAST(N'21:25:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Months":[3,6,9,12],"Day":1}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (71, N'TEST_QUARTERLY_DTSRQ417', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":28},{"Month":5,"Day":31},{"Month":8,"Day":31},{"Month":11,"Day":30}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (72, N'TEST_QUARTERLY_DTSRQ320', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":10},{"Month":5,"Day":10},{"Month":8,"Day":10},{"Month":11,"Day":10}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (73, N'TEST_QUARTERLY_DTSRQ713', CAST(N'00:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":3,"Day":31},{"Month":6,"Day":30},{"Month":9,"Day":30},{"Month":12,"Day":31}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (74, N'TEST_QUARTERLY_DTSBX468', CAST(N'15:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":28},{"Month":5,"Day":30},{"Month":7,"Day":31},{"Month":10,"Day":30}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (75, N'TEST_QUARTERLY_DTSCHGQ1', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Rule":"FirstWorkdayOfQuarter"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (76, N'TEST_QUARTERLY_DTSCHGQ2', CAST(N'18:16:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Rule":"FirstWorkdayOfQuarter"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (77, N'TEST_QUARTERLY_DTSRQ327', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":7},{"Month":5,"Day":7},{"Month":8,"Day":7},{"Month":11,"Day":7}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (78, N'TEST_QUARTERLY_DTSRQ328', CAST(N'18:16:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":7},{"Month":5,"Day":7},{"Month":8,"Day":7},{"Month":11,"Day":7}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (79, N'TEST_QUARTERLY_DTSRQ412', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":1,"Day":15},{"Month":4,"Day":15},{"Month":7,"Day":15},{"Month":10,"Day":15}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (80, N'TEST_QUARTERLY_DTSRQ793', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (81, N'TEST_QUARTERLY_DTSWGE06', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (82, N'TEST_QUARTERLY_DTSCHGRT', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (83, N'TEST_QUARTERLY_DTSCHRGS', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (84, N'TEST_QUARTERLY_DTSRQ540', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (85, N'TEST_QUARTERLY_DTSRQ591', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (86, N'TEST_QUARTERLY_DTSRTCHG', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (87, N'TEST_QUARTERLY_DTSWGE01', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (88, N'TEST_QUARTERLY_DESBD426', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (89, N'TEST_ONDEMAND_DTSACH01', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (90, N'TEST_ONDEMAND_DTSBX415', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (91, N'TEST_ONDEMAND_DTSBX452', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (92, N'TEST_ONDEMAND_DTSBX453', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (93, N'TEST_ONDEMAND_DTSRQ120', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (94, N'TEST_ONDEMAND_DTSRQ123', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (95, N'TEST_ONDEMAND_DTSRQ125', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (96, N'TEST_ONDEMAND_DTSRQ305', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (97, N'TEST_ONDEMAND_DTSRQ306', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (98, N'TEST_ONDEMAND_DTSRQ308', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (99, N'TEST_ONDEMAND_DTSRQ311', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (100, N'TEST_ONDEMAND_DTSRQ410', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (101, N'TEST_ONDEMAND_DTSRQ411', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (102, N'TEST_ONDEMAND_DTSRQ423', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (103, N'TEST_ONDEMAND_DTSRQ426', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (104, N'TEST_ONDEMAND_DTSRQ429', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (105, N'TEST_ONDEMAND_DTSRQ439', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (106, N'TEST_ONDEMAND_DTSRQ602', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (107, N'TEST_ONDEMAND_DTSRQ606', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (108, N'TEST_ONDEMAND_DTSRQ607', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (109, N'TEST_ONDEMAND_DTSRQ609', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (110, N'TEST_ONDEMAND_DTSRQ611', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (111, N'TEST_ONDEMAND_DTSRQ612', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (112, N'TEST_ONDEMAND_DTSRQ717', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (113, N'TEST_ONDEMAND_DTSRQ718', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (114, N'TEST_ONDEMAND_DTSRQ720', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (115, N'TEST_ONDEMAND_DTSRQ721', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (116, N'TEST_ONDEMAND_DTSRT715', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (117, N'TEST_ONDEMAND_DTSRT716', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (118, N'TEST_ONDEMAND_DTSRT717', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (119, N'TEST_ONDEMAND_DTSRT718', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (120, N'TEST_ONDEMAND_DTSRT719', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (121, N'TEST_ONDEMAND_DTSRT720', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (122, N'TEST_ONDEMAND_DTSRT722', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (123, N'TEST_ONDEMAND_DTSRT723', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (124, N'TEST_YEARLY_DTSRQ722', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (125, N'TEST_YEARLY_DTSRQ451', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (126, N'TEST_YEARLY_DTSRQ127', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (127, N'TEST_YEARLY_DTSRQ321', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (128, N'TEST_YEARLY_DTSRQ455', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (129, N'TEST_YEARLY_DTSRQ500', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (130, N'TEST_YEARLY_DTSRQ517', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (131, N'TEST_YEARLY_DTSRQ518', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (132, N'TEST_YEARLY_DTSRQ616', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (133, N'TEST_YEARLY_DTSRQ701', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (134, N'TEST_YEARLY_DTSRQ702', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (135, N'TEST_YEARLY_DTSRQ704', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (136, N'TEST_YEARLY_DTSRQ910', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +GO +SET IDENTITY_INSERT [dbo].[JobControl] OFF +GO \ No newline at end of file diff --git a/SqlAgent/v2/02_Test/1_Database_Setup/InsertJobDependencies.sql b/SqlAgent/v2/02_Test/1_Database_Setup/InsertJobDependencies.sql new file mode 100644 index 0000000..0f84ae3 --- /dev/null +++ b/SqlAgent/v2/02_Test/1_Database_Setup/InsertJobDependencies.sql @@ -0,0 +1,92 @@ +USE [TestDUTASJobSchedule] +GO +SET IDENTITY_INSERT [dbo].[JobDependencies] ON +GO +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (1, N'TEST_DAILY_DTSGSID0', N'TEST_DAILY_DTSBX305') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (2, N'TEST_DAILY_GSIRQ300', N'TEST_DAILY_DTSBX305') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (3, N'TEST_DAILY_DTSRQ202', N'TEST_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (4, N'TEST_DAILY_DTSGSID1', N'TEST_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (5, N'TEST_DAILY_DTSBX202', N'TEST_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (6, N'TEST_DAILY_DTSFT202', N'TEST_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (7, N'TEST_DAILY_DTSBX432', N'TEST_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (8, N'TEST_DAILY_DTSGACHD', N'TEST_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (9, N'TEST_DAILY_DTSBX303', N'TEST_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (10, N'TEST_DAILY_DTSGWAGE', N'TEST_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (11, N'TEST_DAILY_DTSGCHKS', N'TEST_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (12, N'TEST_DAILY_DTSESDAY', N'TEST_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (13, N'TEST_DAILY_DTSGPAYT', N'TEST_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (14, N'TEST_DAILY_DTSDX145', N'TEST_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (15, N'TEST_DAILY_DTSBX629', N'TEST_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (16, N'TEST_DAILY_DTSBX630', N'TEST_DAILY_DTSBX629') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (17, N'TEST_DAILY_DTSFRAUD', N'TEST_DAILY_DTSBX629') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (18, N'TEST_DAILY_DTSRACHD', N'TEST_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (19, N'TEST_DAILY_DTSBXACH', N'TEST_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (20, N'TEST_DAILY_DTSBXREG', N'TEST_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (21, N'TEST_DAILY_DTSBX430', N'TEST_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (22, N'TEST_DAILY_DTSBX626', N'TEST_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (23, N'TEST_DAILY_DTSBX530', N'TEST_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (24, N'TEST_DAILY_DTSBXREL', N'TEST_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (25, N'TEST_DAILY_DTSBX450', N'TEST_DAILY_DTSBXACH') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (26, N'TEST_DAILY_DTSBX450', N'TEST_DAILY_DTSBXREG') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (27, N'TEST_DAILY_DTSBX450', N'TEST_DAILY_DTSBX430') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (28, N'TEST_DAILY_DTSBX450', N'TEST_DAILY_DTSBX626') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (29, N'TEST_DAILY_DTSBX450', N'TEST_DAILY_DTSBX530') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (30, N'TEST_DAILY_DTSBX450', N'TEST_DAILY_DTSBXREL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (31, N'TEST_DAILY_DTSBX451', N'TEST_DAILY_DTSBXACH') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (32, N'TEST_DAILY_DTSBX451', N'TEST_DAILY_DTSBXREG') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (33, N'TEST_DAILY_DTSBX451', N'TEST_DAILY_DTSBX430') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (34, N'TEST_DAILY_DTSBX451', N'TEST_DAILY_DTSBX626') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (35, N'TEST_DAILY_DTSBX451', N'TEST_DAILY_DTSBX530') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (36, N'TEST_DAILY_DTSBX451', N'TEST_DAILY_DTSBXREL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (37, N'TEST_DAILY_DTSPACHD', N'TEST_DAILY_DTSBX450') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (38, N'TEST_DAILY_DTSPACHD', N'TEST_DAILY_DTSBX451') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (39, N'TEST_DAILY_DTSPX148', N'TEST_DAILY_DTSPACHD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (40, N'TEST_DAILY_DTSRQ325', N'TEST_DAILY_DTSPACHD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (41, N'TEST_DAILY_DTSBX427', N'TEST_DAILY_DTSPX148') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (42, N'TEST_DAILY_DTSBX427', N'TEST_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (43, N'TEST_DAILY_DTSPDAY1', N'TEST_DAILY_DTSBX427') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (44, N'TEST_DAILY_DTSW4WGE', N'TEST_DAILY_DTSPDAY1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (45, N'TEST_DAILY_DTSGSID2', N'TEST_DAILY_DTSPDAY1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (46, N'TEST_DAILY_DTSGSID9', N'TEST_DAILY_DTSPDAY1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (47, N'TEST_DAILY_DTSMIN01', N'TEST_DAILY_DTSW4WGE') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (48, N'TEST_DAILY_DTSMIN01', N'TEST_DAILY_DTSGSID2') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (49, N'TEST_DAILY_DTSMIN01', N'TEST_DAILY_DTSGSID9') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (50, N'TEST_DAILY_DTSMIN02', N'TEST_DAILY_DTSW4WGE') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (51, N'TEST_DAILY_DTSMIN02', N'TEST_DAILY_DTSGSID2') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (52, N'TEST_DAILY_DTSMIN02', N'TEST_DAILY_DTSGSID9') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (53, N'TEST_DAILY_DTSRQ459', N'TEST_DAILY_DTSMIN01') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (54, N'TEST_DAILY_DTSRQ459', N'TEST_DAILY_DTSMIN02') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (55, N'TEST_DAILY_DTSBXPFL', N'TEST_DAILY_DTSRQ459') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (56, N'TEST_DAILY_DESBD427', N'TEST_DAILY_DTSBXPFL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (57, N'TEST_DAILY_DTSBX403', N'TEST_DAILY_DTSBXPFL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (58, N'TEST_DAILY_DTSBE405', N'TEST_DAILY_DTSBXPFL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (59, N'TEST_DAILY_DTSBX405', N'TEST_DAILY_DTSBXPFL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (60, N'TEST_DAILY_DTSRQ335', N'TEST_DAILY_DTSBXPFL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (61, N'TEST_DAILY_DTSBX601', N'TEST_DAILY_DTSRQ335') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (62, N'TEST_WEEKLY_DTSBXREJ', N'TEST_DAILY_DTSBXREL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (63, N'TEST_WEEKLY_DTSBX122', N'TEST_WEEKLY_DTSPDAY7') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (64, N'TEST_WEEKLY_DTSRQ511', N'TEST_WEEKLY_DTSPDAY7') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (65, N'TEST_MONTHLY_DTSRQ414', N'TEST_DAILY_DTSPDAY1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (66, N'TEST_MONTHLY_DTSCHGVB', N'TEST_MONTHLY_DTSPMON1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (67, N'TEST_MONTHLY_DTSCHGVR', N'TEST_MONTHLY_DTSCHGVB') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (68, N'TEST_MONTHLY_DTSVBKUP', N'TEST_MONTHLY_DTSPMON1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (69, N'TEST_MONTHLY_DTSVRSTR', N'TEST_MONTHLY_DTSVBKUP') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (70, N'TEST_MONTHLY_DTSRQ442', N'TEST_MONTHLY_DTSRQ513') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (71, N'TEST_QUARTERLY_DTSRQ119', N'TEST_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (72, N'TEST_QUARTERLY_DTSRQ417', N'TEST_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (73, N'TEST_QUARTERLY_DTSRQ320', N'TEST_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (74, N'TEST_QUARTERLY_DTSRQ793', N'TEST_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (75, N'TEST_QUARTERLY_DTSCHGQ1', N'TEST_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (76, N'TEST_QUARTERLY_DTSRQ327', N'TEST_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (77, N'TEST_QUARTERLY_DTSRQ412', N'TEST_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (78, N'TEST_QUARTERLY_DTSRQ591', N'TEST_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (79, N'TEST_QUARTERLY_DTSRQ902', N'TEST_DAILY_DTSPDAY1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (80, N'TEST_QUARTERLY_DTSCHGQ2', N'TEST_DAILY_DTSPDAY1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (81, N'TEST_QUARTERLY_DTSCHGRT', N'TEST_QUARTERLY_DTSRQ591') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (82, N'TEST_QUARTERLY_DTSRQ328', N'TEST_QUARTERLY_DTSRQ327') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (83, N'TEST_QUARTERLY_DTSBX500', N'TEST_QUARTERLY_DTSRQ417') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (84, N'TEST_QUARTERLY_DTSRQ713', N'TEST_MONTHLY_DTSPMON1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (85, N'TEST_QUARTERLY_DTSCHRGS', N'TEST_QUARTERLY_DTSCHGRT') +GO +SET IDENTITY_INSERT [dbo].[JobDependencies] OFF +GO diff --git a/SqlAgent/v2/02_Test/2_Functions/fn_GetNextWorkday.sql b/SqlAgent/v2/02_Test/2_Functions/fn_GetNextWorkday.sql new file mode 100644 index 0000000..6f2e39a --- /dev/null +++ b/SqlAgent/v2/02_Test/2_Functions/fn_GetNextWorkday.sql @@ -0,0 +1,17 @@ +USE TestDUTASJobSchedule; +GO +-- Returns the next valid workday on or after the given date +CREATE OR ALTER FUNCTION dbo.fn_GetNextWorkday (@InputDate DATE) +RETURNS DATE +AS +BEGIN + DECLARE @Workday DATE = @InputDate; + + WHILE DATENAME(WEEKDAY, @Workday) IN ('Saturday','Sunday') + OR EXISTS (SELECT 1 FROM dbo.FederalHolidays WHERE HolidayDate = @Workday) + BEGIN + SET @Workday = DATEADD(DAY, 1, @Workday); + END + + RETURN @Workday; +END; diff --git a/SqlAgent/v2/02_Test/2_Functions/fn_GetPreviousWorkday.sql b/SqlAgent/v2/02_Test/2_Functions/fn_GetPreviousWorkday.sql new file mode 100644 index 0000000..88aab72 --- /dev/null +++ b/SqlAgent/v2/02_Test/2_Functions/fn_GetPreviousWorkday.sql @@ -0,0 +1,17 @@ +USE TestDUTASJobSchedule; +GO +-- Returns the most recent valid workday before or equal to the given date +CREATE OR ALTER FUNCTION dbo.fn_GetPreviousWorkday (@InputDate DATE) +RETURNS DATE +AS +BEGIN + DECLARE @Workday DATE = @InputDate; + + WHILE DATENAME(WEEKDAY, @Workday) IN ('Saturday','Sunday') + OR EXISTS (SELECT 1 FROM dbo.FederalHolidays WHERE HolidayDate = @Workday) + BEGIN + SET @Workday = DATEADD(DAY, -1, @Workday); + END + + RETURN @Workday; +END; diff --git a/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_CheckJobConditions.sql b/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_CheckJobConditions.sql new file mode 100644 index 0000000..42f3b01 Binary files /dev/null and b/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_CheckJobConditions.sql differ diff --git a/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_CheckJobConditions_Generic.sql b/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_CheckJobConditions_Generic.sql new file mode 100644 index 0000000..d009605 Binary files /dev/null and b/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_CheckJobConditions_Generic.sql differ diff --git a/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_CreateDailyJobSchedule.sql b/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_CreateDailyJobSchedule.sql new file mode 100644 index 0000000..c2cd1ea --- /dev/null +++ b/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_CreateDailyJobSchedule.sql @@ -0,0 +1,98 @@ +USE msdb; +GO + +CREATE OR ALTER PROCEDURE dbo.usp_CreateDailyJobSchedule + @Env VARCHAR(10) = 'DEVL' -- Added parameter with default value +AS +BEGIN + SET NOCOUNT ON; + + DECLARE + @JobID INT, + @JobName SYSNAME, + @ScheduledStartTime TIME(0), + @Frequency NVARCHAR(20), + @FrequencyPattern NVARCHAR(MAX), + @ScheduleName SYSNAME, + @StartTimeInt INT, + @FreqInterval INT, + @TimeString VARCHAR(8), + @ActiveStartDate INT, + @dbName SYSNAME; -- Added variable for database name + + -- Determine database name based on environment + SET @dbName = CASE @Env + WHEN 'DEVL' THEN 'DevlDUTASJobSchedule' + WHEN 'TEST' THEN 'TestDUTASJobSchedule' + WHEN 'PROD' THEN 'ProdDUTASJobSchedule' + END; + + -- Prepare active start date as INT (YYYYMMDD) + SET @ActiveStartDate = CONVERT(INT, CONVERT(CHAR(8), GETDATE(), 112)); + + -- Dynamic SQL to fetch jobs from the appropriate database + DECLARE @Sql NVARCHAR(MAX); + SET @Sql = N' + DECLARE job_cursor CURSOR FOR + SELECT JobID, JobName, ScheduledStartTime, Frequency, FrequencyPattern + FROM ' + QUOTENAME(@dbName) + N'.dbo.JobControl + WHERE UPPER(Frequency) = ''DAILY'' + AND IsActive = 1;'; + + -- Execute dynamic SQL to declare cursor + EXEC sp_executesql @Sql; + + OPEN job_cursor; + FETCH NEXT FROM job_cursor INTO @JobID, @JobName, @ScheduledStartTime, @Frequency, @FrequencyPattern; + + WHILE @@FETCH_STATUS = 0 + BEGIN + -- Step 1: Convert ScheduledStartTime (TIME) to HH:MM:SS string + SET @TimeString = CONVERT(VARCHAR(8), @ScheduledStartTime, 108); + + -- Step 2: Remove colons and convert to INT (HHMMSS) + SET @StartTimeInt = CONVERT(INT, REPLACE(@TimeString, ':', '')); + + -- Step 3: Prepare schedule name + SET @ScheduleName = CONCAT(@JobName, '_DailySchedule'); + + -- Step 4: Fixed freq_interval for Monday to Friday + SET @FreqInterval = 62; -- Mon(2)+Tue(4)+Wed(8)+Thu(16)+Fri(32) = 62 + + -- Step 5: Delete existing schedule if it exists (idempotency) + IF EXISTS ( + SELECT 1 + FROM msdb.dbo.sysschedules s + JOIN msdb.dbo.sysjobschedules js ON s.schedule_id = js.schedule_id + JOIN msdb.dbo.sysjobs j ON j.job_id = js.job_id + WHERE j.name = @JobName AND s.name = @ScheduleName + ) + BEGIN + EXEC msdb.dbo.sp_delete_schedule @schedule_name = @ScheduleName; + END + + -- Step 6: Create weekly schedule (Monday to Friday) running once per day + EXEC msdb.dbo.sp_add_schedule + @schedule_name = @ScheduleName, + @enabled = 1, + @freq_type = 8, -- weekly + @freq_interval = @FreqInterval, + @freq_recurrence_factor = 1, -- every week + @active_start_time = @StartTimeInt, + @active_start_date = @ActiveStartDate; + + -- Step 7: Attach schedule to job + EXEC msdb.dbo.sp_attach_schedule + @job_name = @JobName, + @schedule_name = @ScheduleName; + + -- Fetch next job + FETCH NEXT FROM job_cursor INTO @JobID, @JobName, @ScheduledStartTime, @Frequency, @FrequencyPattern; + END + + CLOSE job_cursor; + DEALLOCATE job_cursor; + + PRINT 'Daily job schedules (Monday to Friday) created successfully for ' + @dbName; +END; +GO \ No newline at end of file diff --git a/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_CreateSQLAgentJob.sql b/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_CreateSQLAgentJob.sql new file mode 100644 index 0000000..cfba9e9 Binary files /dev/null and b/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_CreateSQLAgentJob.sql differ diff --git a/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_CreateWeeklySchedules.sql b/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_CreateWeeklySchedules.sql new file mode 100644 index 0000000..2021821 --- /dev/null +++ b/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_CreateWeeklySchedules.sql @@ -0,0 +1,223 @@ +USE [msdb]; +GO + +CREATE OR ALTER PROCEDURE dbo.usp_CreateWeeklySchedules + @Env VARCHAR(10) = 'DEVL' -- Added parameter with default value +AS +BEGIN + SET NOCOUNT ON; + + DECLARE + @JobName SYSNAME, + @FrequencyPattern NVARCHAR(MAX), + @StartTime VARCHAR(50), + @ScheduleName SYSNAME, + @StartTimeInt INT, + @FreqInterval INT, + @ActiveDate INT, + @computedFreq INT, + @dbName SYSNAME; -- Added variable for database name + + -- Determine database name based on environment + SET @dbName = CASE @Env + WHEN 'DEVL' THEN 'DevlDUTASJobSchedule' + WHEN 'TEST' THEN 'TestDUTASJobSchedule' + WHEN 'PROD' THEN 'ProdDUTASJobSchedule' + END; + + SET @ActiveDate = CONVERT(INT, CONVERT(CHAR(8), GETDATE(), 112)); + + -------------------------------------------------------------------------- + -- Dynamic SQL for cursor to fetch active weekly jobs from appropriate database + -------------------------------------------------------------------------- + DECLARE @Sql NVARCHAR(MAX); + SET @Sql = N' + DECLARE job_cursor CURSOR FAST_FORWARD FOR + SELECT + JobName, + FrequencyPattern, + ScheduledStartTime + FROM ' + QUOTENAME(@dbName) + N'.dbo.JobControl + WHERE UPPER(Frequency) = ''WEEKLY'' + AND IsActive = 1;'; + + -- Execute dynamic SQL to declare cursor + EXEC sp_executesql @Sql; + + OPEN job_cursor; + FETCH NEXT FROM job_cursor INTO @JobName, @FrequencyPattern, @StartTime; + + WHILE @@FETCH_STATUS = 0 + BEGIN + BEGIN TRY + ------------------------------------------------------------------ + -- Reset per-job variables + ------------------------------------------------------------------ + SET @FreqInterval = 0; + SET @computedFreq = 0; + SET @StartTimeInt = NULL; + SET @ScheduleName = NULL; + + ------------------------------------------------------------------ + -- Correctly format the start time (HHMMSS without extra zeros) + ------------------------------------------------------------------ + SET @StartTime = LTRIM(RTRIM(ISNULL(@StartTime, '00:00:00'))); + + -- Parse time and convert to HHMMSS integer + DECLARE @TimeParts TABLE (part NVARCHAR(10), idx INT); + INSERT INTO @TimeParts (part, idx) + SELECT value, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 + FROM STRING_SPLIT(LEFT(@StartTime, 8), ':'); + + DECLARE @Hours INT, @Minutes INT, @Seconds INT; + + SELECT @Hours = CAST(part AS INT) FROM @TimeParts WHERE idx = 0; + SELECT @Minutes = CAST(part AS INT) FROM @TimeParts WHERE idx = 1; + SELECT @Seconds = CAST(part AS INT) FROM @TimeParts WHERE idx = 2; + + -- Ensure valid time ranges + SET @Hours = ISNULL(@Hours, 0); + SET @Minutes = ISNULL(@Minutes, 0); + SET @Seconds = ISNULL(@Seconds, 0); + + IF @Hours < 0 OR @Hours > 23 SET @Hours = 0; + IF @Minutes < 0 OR @Minutes > 59 SET @Minutes = 0; + IF @Seconds < 0 OR @Seconds > 59 SET @Seconds = 0; + + SET @StartTimeInt = (@Hours * 10000) + (@Minutes * 100) + @Seconds; + + SET @ScheduleName = CONCAT(@JobName, '_WeeklySchedule'); + + ------------------------------------------------------------------ + -- Parse JSON days using a local temporary table + ------------------------------------------------------------------ + CREATE TABLE #Days (DayName NVARCHAR(10)); + + INSERT INTO #Days (DayName) + SELECT TRIM(value) + FROM OPENJSON(ISNULL(@FrequencyPattern, '{}'), '$.Days'); + + ------------------------------------------------------------------ + -- Compute bitmask correctly (values should be 1-127) + ------------------------------------------------------------------ + SELECT @computedFreq = ISNULL(SUM( + CASE UPPER(DayName) + WHEN 'SUN' THEN 1 + WHEN 'MON' THEN 2 + WHEN 'TUE' THEN 4 + WHEN 'WED' THEN 8 + WHEN 'THU' THEN 16 + WHEN 'FRI' THEN 32 + WHEN 'SAT' THEN 64 + ELSE 0 + END + ), 0) + FROM #Days; + + DROP TABLE #Days; -- Explicitly drop the temp table + + SET @FreqInterval = ISNULL(@computedFreq, 0); + + ------------------------------------------------------------------ + -- Validate freq_interval (must be 1..127) + ------------------------------------------------------------------ + IF @FreqInterval < 1 OR @FreqInterval > 127 + BEGIN + PRINT 'Warning: Weekly job ' + @JobName + + ' has invalid freq_interval (' + ISNULL(CAST(@FreqInterval AS VARCHAR(10)), 'NULL') + + '). Days found: ' + ISNULL(@FrequencyPattern, 'None') + '. Skipping.'; + FETCH NEXT FROM job_cursor INTO @JobName, @FrequencyPattern, @StartTime; + CONTINUE; + END + + ------------------------------------------------------------------ + -- Debug output to verify calculations + ------------------------------------------------------------------ + PRINT 'Job: ' + @JobName + + ', Days: ' + @FrequencyPattern + + ', FreqInterval: ' + CAST(@FreqInterval AS VARCHAR(3)) + + ', StartTime: ' + CAST(@StartTimeInt AS VARCHAR(6)); + + ------------------------------------------------------------------ + -- Safely detach and delete any existing schedule with this name + -- Use TRY/CATCH for schedule operations since non-existence is expected + ------------------------------------------------------------------ + BEGIN TRY + DECLARE @schedule_id INT; + DECLARE @attach_count INT; + + -- Check if schedule exists and get its ID + SELECT @schedule_id = s.schedule_id + FROM msdb.dbo.sysschedules s + JOIN msdb.dbo.sysjobschedules js ON s.schedule_id = js.schedule_id + JOIN msdb.dbo.sysjobs j ON j.job_id = js.job_id + WHERE j.name = @JobName AND s.name = @ScheduleName; + + IF @schedule_id IS NOT NULL + BEGIN + -- Detach from this job (if attached) + EXEC msdb.dbo.sp_detach_schedule + @job_name = @JobName, + @schedule_name = @ScheduleName; + + -- Check if schedule still attached to other jobs + SELECT @attach_count = COUNT(*) + FROM msdb.dbo.sysjobschedules js + WHERE js.schedule_id = @schedule_id; + + IF @attach_count = 0 + BEGIN + EXEC msdb.dbo.sp_delete_schedule + @schedule_name = @ScheduleName; + PRINT 'Existing schedule deleted: ' + @ScheduleName; + END + ELSE + BEGIN + PRINT 'Notice: schedule ' + @ScheduleName + ' could not be deleted because it is still attached to other jobs.'; + END + END + END TRY + BEGIN CATCH + -- Schedule operations might fail if schedule doesn't exist, which is fine + PRINT 'Notice: ' + ERROR_MESSAGE() + ' - proceeding with new schedule creation.'; + END CATCH + + ------------------------------------------------------------------ + -- Create the unified weekly schedule with subday config + ------------------------------------------------------------------ + EXEC msdb.dbo.sp_add_schedule + @schedule_name = @ScheduleName, + @enabled = 1, + @freq_type = 8, -- Weekly + @freq_interval = @FreqInterval, -- Bitmask of weekdays + @freq_recurrence_factor = 1, -- Every week + @freq_subday_type = 1, -- Once per day + @freq_subday_interval = 1, + @active_start_time = @StartTimeInt, + @active_start_date = @ActiveDate; + + ------------------------------------------------------------------ + -- Attach the schedule to the job + ------------------------------------------------------------------ + EXEC msdb.dbo.sp_attach_schedule + @job_name = @JobName, + @schedule_name = @ScheduleName; + + PRINT 'Weekly schedule created for job: ' + @JobName + + ' (Days=' + CAST(@FreqInterval AS VARCHAR(10)) + + ', Time=' + RIGHT('000000' + CAST(@StartTimeInt AS VARCHAR(6)), 6) + ')'; + + END TRY + BEGIN CATCH + PRINT 'Error scheduling job ' + ISNULL(@JobName, 'Unknown') + ': ' + ERROR_MESSAGE(); + END CATCH; + + FETCH NEXT FROM job_cursor INTO @JobName, @FrequencyPattern, @StartTime; + END + + CLOSE job_cursor; + DEALLOCATE job_cursor; + + PRINT 'All weekly job schedules processed for ' + @dbName; +END; +GO \ No newline at end of file diff --git a/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_ForceComplete.sql b/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_ForceComplete.sql new file mode 100644 index 0000000..3b107b2 Binary files /dev/null and b/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_ForceComplete.sql differ diff --git a/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_GenerateJobSchedule.sql b/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_GenerateJobSchedule.sql new file mode 100644 index 0000000..de09cab --- /dev/null +++ b/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_GenerateJobSchedule.sql @@ -0,0 +1,261 @@ +USE [TestDUTASJobSchedule]; +GO + +CREATE OR ALTER PROCEDURE dbo.usp_GenerateJobSchedule + @Year INT +AS +BEGIN + SET NOCOUNT ON; + + ------------------------------------------------------------------------- + -- 1. Cleanup existing schedule data for this year + ------------------------------------------------------------------------- + DELETE FROM dbo.JobSchedule WHERE YearOfSchedule = @Year; + + ------------------------------------------------------------------------- + -- 2. Variable declarations + ------------------------------------------------------------------------- + DECLARE + @JobName VARCHAR(100), + @Frequency VARCHAR(20), + @Pattern NVARCHAR(2000), + @ScheduledTime TIME, + @RuleName NVARCHAR(100), + @Month INT, + @BaseDate DATE, + @ScheduledDate DATE, + @AdjustedDate DATE, + @FailSafeDate DATE = '9999-12-31'; + + ------------------------------------------------------------------------- + -- 3. Temporary table to process jobs more efficiently + ------------------------------------------------------------------------- + CREATE TABLE #JobProcessing ( + JobName VARCHAR(100), + Frequency VARCHAR(20), + Pattern NVARCHAR(2000), + ScheduledTime TIME, + RuleName NVARCHAR(100), + MonthsJSON NVARCHAR(MAX), + DayNum INT, + HasExplicitSchedule BIT + ); + + -- Populate temporary table with parsed JSON data + INSERT INTO #JobProcessing (JobName, Frequency, Pattern, ScheduledTime, RuleName, MonthsJSON, DayNum, HasExplicitSchedule) + SELECT + jc.JobName, + jc.Frequency, + jc.FrequencyPattern, + jc.ScheduledStartTime, + JSON_VALUE(jc.FrequencyPattern, '$.Rule'), + JSON_QUERY(jc.FrequencyPattern, '$.Months'), + JSON_VALUE(jc.FrequencyPattern, '$.Day'), + CASE WHEN JSON_QUERY(jc.FrequencyPattern, '$.Schedule') IS NOT NULL THEN 1 ELSE 0 END + FROM dbo.JobControl jc + WHERE UPPER(jc.Frequency) IN ('MONTHLY','QUARTERLY') + AND jc.IsActive = 1; + + ------------------------------------------------------------------------- + -- 4. Process MONTHLY jobs + ------------------------------------------------------------------------- + INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy) + SELECT + jp.JobName, + jp.Frequency, + jp.Pattern, + CASE + WHEN jp.RuleName = 'FirstWorkday' THEN dbo.fn_GetNextWorkday(DATEFROMPARTS(@Year, m.MonthNum, 1)) + WHEN jp.RuleName = 'LastWorkday' THEN dbo.fn_GetPreviousWorkday(EOMONTH(DATEFROMPARTS(@Year, m.MonthNum, 1))) + ELSE @FailSafeDate + END AS ScheduledDate, + CASE + WHEN jp.RuleName = 'FirstWorkday' THEN dbo.fn_GetNextWorkday(DATEFROMPARTS(@Year, m.MonthNum, 1)) + WHEN jp.RuleName = 'LastWorkday' THEN dbo.fn_GetPreviousWorkday(EOMONTH(DATEFROMPARTS(@Year, m.MonthNum, 1))) + ELSE @FailSafeDate + END AS AdjustedRunDate, + FORMAT(DATEFROMPARTS(@Year, m.MonthNum, 1), 'yyyy-MM'), + @Year, + GETDATE(), + SYSTEM_USER + FROM #JobProcessing jp + CROSS JOIN (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) m(MonthNum) + WHERE jp.Frequency = 'MONTHLY' + AND jp.RuleName IN ('FirstWorkday', 'LastWorkday'); + + -- Handle monthly jobs with unknown rules + INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy) + SELECT + jp.JobName, + jp.Frequency, + jp.Pattern, + @FailSafeDate, + @FailSafeDate, + FORMAT(DATEFROMPARTS(@Year, m.MonthNum, 1), 'yyyy-MM'), + @Year, + GETDATE(), + SYSTEM_USER + FROM #JobProcessing jp + CROSS JOIN (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) m(MonthNum) + WHERE jp.Frequency = 'MONTHLY' + AND jp.RuleName NOT IN ('FirstWorkday', 'LastWorkday'); + + ------------------------------------------------------------------------- + -- 5. Process QUARTERLY jobs - FirstWorkdayOfQuarter + ------------------------------------------------------------------------- + INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy) + SELECT + jp.JobName, + jp.Frequency, + jp.Pattern, + dbo.fn_GetNextWorkday(DATEFROMPARTS(@Year, q.StartMonth, 1)), + dbo.fn_GetNextWorkday(DATEFROMPARTS(@Year, q.StartMonth, 1)), + FORMAT(DATEFROMPARTS(@Year, q.StartMonth, 1), 'yyyy-MM'), + @Year, + GETDATE(), + SYSTEM_USER + FROM #JobProcessing jp + CROSS JOIN (VALUES (1),(4),(7),(10)) q(StartMonth) + WHERE jp.Frequency = 'QUARTERLY' + AND jp.RuleName = 'FirstWorkdayOfQuarter'; + + ------------------------------------------------------------------------- + -- 6. Process QUARTERLY jobs - Months array with Day number + ------------------------------------------------------------------------- + ;WITH QuarterlyMonths AS ( + SELECT + jp.JobName, + jp.Frequency, + jp.Pattern, + CAST(m.[value] AS INT) AS MonthNum, + jp.DayNum + FROM #JobProcessing jp + CROSS APPLY OPENJSON(jp.MonthsJSON) m + WHERE jp.Frequency = 'QUARTERLY' + AND jp.MonthsJSON IS NOT NULL + AND jp.DayNum IS NOT NULL + AND jp.RuleName IS NULL + AND jp.HasExplicitSchedule = 0 + ), + QuarterlyDates AS ( + SELECT + qm.JobName, + qm.Frequency, + qm.Pattern, + qm.MonthNum, + qm.DayNum, + CASE + WHEN qm.DayNum <= DAY(EOMONTH(DATEFROMPARTS(@Year, qm.MonthNum, 1))) + THEN DATEFROMPARTS(@Year, qm.MonthNum, qm.DayNum) + ELSE EOMONTH(DATEFROMPARTS(@Year, qm.MonthNum, 1)) + END AS BaseDate + FROM QuarterlyMonths qm + ) + INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy) + SELECT + qd.JobName, + qd.Frequency, + qd.Pattern, + qd.BaseDate, + CASE + WHEN DATENAME(WEEKDAY, qd.BaseDate) IN ('Saturday','Sunday') + OR EXISTS (SELECT 1 FROM dbo.FederalHolidays WHERE HolidayDate = qd.BaseDate) + THEN dbo.fn_GetPreviousWorkday(qd.BaseDate) + ELSE qd.BaseDate + END AS AdjustedRunDate, + FORMAT(qd.BaseDate, 'yyyy-MM'), + @Year, + GETDATE(), + SYSTEM_USER + FROM QuarterlyDates qd; + + ------------------------------------------------------------------------- + -- 7. Process QUARTERLY jobs - Explicit Schedule array + ------------------------------------------------------------------------- + ;WITH ExplicitSchedules AS ( + SELECT + jp.JobName, + jp.Frequency, + jp.Pattern, + s.[Month] AS MonthNum, + s.[Day] AS DayNum + FROM #JobProcessing jp + CROSS APPLY OPENJSON(jp.Pattern, '$.Schedule') + WITH ( + [Month] INT '$.Month', + [Day] INT '$.Day' + ) s + WHERE jp.Frequency = 'QUARTERLY' + AND jp.HasExplicitSchedule = 1 + ), + ExplicitScheduleDates AS ( + SELECT + es.JobName, + es.Frequency, + es.Pattern, + es.MonthNum, + es.DayNum, + CASE + WHEN es.DayNum <= DAY(EOMONTH(DATEFROMPARTS(@Year, es.MonthNum, 1))) + THEN DATEFROMPARTS(@Year, es.MonthNum, es.DayNum) + ELSE EOMONTH(DATEFROMPARTS(@Year, es.MonthNum, 1)) + END AS BaseDate + FROM ExplicitSchedules es + ) + INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy) + SELECT + esd.JobName, + esd.Frequency, + esd.Pattern, + esd.BaseDate, + CASE + WHEN DATENAME(WEEKDAY, esd.BaseDate) IN ('Saturday','Sunday') + OR EXISTS (SELECT 1 FROM dbo.FederalHolidays WHERE HolidayDate = esd.BaseDate) + THEN dbo.fn_GetPreviousWorkday(esd.BaseDate) + ELSE esd.BaseDate + END AS AdjustedRunDate, + FORMAT(esd.BaseDate, 'yyyy-MM'), + @Year, + GETDATE(), + SYSTEM_USER + FROM ExplicitScheduleDates esd; + + ------------------------------------------------------------------------- + -- 8. Handle any quarterly jobs that didn't match the patterns above + ------------------------------------------------------------------------- + INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy) + SELECT + jp.JobName, + jp.Frequency, + jp.Pattern, + @FailSafeDate, + @FailSafeDate, + FORMAT(DATEFROMPARTS(@Year, 1, 1), 'yyyy-MM'), + @Year, + GETDATE(), + SYSTEM_USER + FROM #JobProcessing jp + WHERE jp.Frequency = 'QUARTERLY' + AND NOT EXISTS ( + SELECT 1 FROM dbo.JobSchedule js + WHERE js.JobName = jp.JobName AND js.YearOfSchedule = @Year + ); + + ------------------------------------------------------------------------- + -- 9. Cleanup and output + ------------------------------------------------------------------------- + DROP TABLE #JobProcessing; + + -- Update any NULL dates to fail-safe date + UPDATE dbo.JobSchedule + SET ScheduledDate = @FailSafeDate, + AdjustedRunDate = @FailSafeDate + WHERE YearOfSchedule = @Year + AND (ScheduledDate IS NULL OR AdjustedRunDate IS NULL); + + DECLARE @RecordCount INT = (SELECT COUNT(*) FROM dbo.JobSchedule WHERE YearOfSchedule = @Year); + + PRINT 'Job schedule generation completed for year ' + CAST(@Year AS VARCHAR(4)) + + '. Total records created: ' + CAST(@RecordCount AS VARCHAR(10)); +END; +GO \ No newline at end of file diff --git a/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_ScheduleJob.sql b/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_ScheduleJob.sql new file mode 100644 index 0000000..f6c2ffa --- /dev/null +++ b/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_ScheduleJob.sql @@ -0,0 +1,160 @@ +USE [msdb] +GO + +/****** Object: StoredProcedure [dbo].[usp_ScheduleJob] Script Date: 10/18/2025 9:52:04 AM ******/ +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + +CREATE OR ALTER PROCEDURE [dbo].[usp_ScheduleJob] + @JobName NVARCHAR(100), + @Env CHAR(4), -- 'DEVL' | 'TEST' | 'PROD' + @RunDate DATE, + @RunTime TIME +AS +BEGIN + SET NOCOUNT ON; + + DECLARE + @JobId UNIQUEIDENTIFIER, + @ScheduleName NVARCHAR(200), + @dbName NVARCHAR(128), + @ActiveStartDate INT, + @ActiveStartTime INT, + @Sql NVARCHAR(MAX), + @JobExists BIT = 0, + @ScheduleId INT; + + -- Table variable must be declared separately and at the top level + DECLARE @ExistingSchedules TABLE ( + schedule_id INT, + schedule_name NVARCHAR(200) + ); + + -- Map environment to actual DB name + SET @dbName = CASE @Env + WHEN 'DEVL' THEN 'DevlDUTASJobSchedule' + WHEN 'TEST' THEN 'TestDUTASJobSchedule' + WHEN 'PROD' THEN 'ProdDUTASJobSchedule' + ELSE 'DevlDUTASJobSchedule' + END; + + -- Validate parameters + IF @Env NOT IN ('DEVL','TEST','PROD') + BEGIN + RAISERROR('Env must be one of: DEVL, TEST, PROD.', 16, 1); + RETURN; + END + + IF @RunDate < CAST(GETDATE() AS DATE) + BEGIN + RAISERROR('RunDate cannot be in the past.', 16, 1); + RETURN; + END; + + -- Check if job exists in JobControl table + SET @Sql = N'SELECT @JobExists = 1 FROM ' + QUOTENAME(@dbName) + '.dbo.JobControl WHERE JobName = @JobNameParam'; + + EXEC sp_executesql @Sql, + N'@JobNameParam NVARCHAR(100), @JobExists BIT OUTPUT', + @JobNameParam = @JobName, + @JobExists = @JobExists OUTPUT; + + IF @JobExists = 0 + BEGIN + RAISERROR('Job %s not found in JobControl table.', 16, 1, @JobName); + RETURN; + END; + + -- Activate job in control table + SET @Sql = N'UPDATE ' + QUOTENAME(@dbName) + '.dbo.JobControl SET IsActive = 1 WHERE JobName = @JobNameParam'; + EXEC sp_executesql @Sql, + N'@JobNameParam NVARCHAR(100)', + @JobNameParam = @JobName; + + PRINT 'Job activated in JobControl.'; + + -- Convert date/time to SQL Agent format + SET @ActiveStartDate = CONVERT(INT, CONVERT(CHAR(8), @RunDate, 112)); + SET @ActiveStartTime = DATEPART(HOUR, @RunTime) * 10000 + + DATEPART(MINUTE, @RunTime) * 100 + + DATEPART(SECOND, @RunTime); + + SET @ScheduleName = @JobName + '_MonthlySchedule'; + + -- Get job id + SELECT @JobId = job_id + FROM msdb.dbo.sysjobs + WHERE name = @JobName; + + IF @JobId IS NULL + BEGIN + RAISERROR('SQL Agent job "%s" not found.', 16, 1, @JobName); + RETURN; + END; + + BEGIN TRY + BEGIN TRANSACTION; + + -- Detach and delete all existing schedules for this job + INSERT INTO @ExistingSchedules (schedule_id, schedule_name) + SELECT s.schedule_id, s.name + FROM msdb.dbo.sysschedules AS s + INNER JOIN msdb.dbo.sysjobschedules AS js ON s.schedule_id = js.schedule_id + WHERE js.job_id = @JobId; + + DECLARE @OldScheduleId INT, @OldScheduleName NVARCHAR(200); + + DECLARE cur CURSOR LOCAL FAST_FORWARD FOR + SELECT schedule_id, schedule_name FROM @ExistingSchedules; + + OPEN cur; + FETCH NEXT FROM cur INTO @OldScheduleId, @OldScheduleName; + + WHILE @@FETCH_STATUS = 0 + BEGIN + PRINT 'Detaching old schedule: ' + @OldScheduleName; + EXEC msdb.dbo.sp_detach_schedule @job_id = @JobId, @schedule_name = @OldScheduleName; + + PRINT 'Deleting old schedule: ' + @OldScheduleName; + EXEC msdb.dbo.sp_delete_schedule @schedule_name = @OldScheduleName; + + FETCH NEXT FROM cur INTO @OldScheduleId, @OldScheduleName; + END + + CLOSE cur; + DEALLOCATE cur; + + -- Create new one-time schedule + EXEC msdb.dbo.sp_add_schedule + @schedule_name = @ScheduleName, + @enabled = 1, + @freq_type = 1, -- One-time + @active_start_date = @ActiveStartDate, + @active_start_time = @ActiveStartTime; + + -- Attach schedule to job + EXEC msdb.dbo.sp_attach_schedule + @job_id = @JobId, + @schedule_name = @ScheduleName; + + COMMIT TRANSACTION; + + PRINT 'New schedule created for job "' + @JobName + + '" on ' + CONVERT(VARCHAR(10), @RunDate, 120) + + ' at ' + CONVERT(VARCHAR(8), @RunTime, 108); + END TRY + BEGIN CATCH + IF @@TRANCOUNT > 0 + ROLLBACK TRANSACTION; + + DECLARE @ErrorMessage NVARCHAR(4000) = ERROR_MESSAGE(); + RAISERROR('Error creating schedule: %s', 16, 1, @ErrorMessage); + END CATCH; +END; +GO + + diff --git a/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_ScheduleJobsForMonth.sql b/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_ScheduleJobsForMonth.sql new file mode 100644 index 0000000..adcfa37 --- /dev/null +++ b/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_ScheduleJobsForMonth.sql @@ -0,0 +1,39 @@ +USE TestDUTASJobSchedule; +GO + +CREATE OR ALTER PROCEDURE dbo.usp_ScheduleJobsForMonth +AS +BEGIN + SET NOCOUNT ON; + + DECLARE @MonthKey CHAR(7) = FORMAT(GETDATE(), 'yyyy-MM'); + DECLARE @Year INT = YEAR(GETDATE()); + DECLARE @JobName VARCHAR(100); + DECLARE @RunDate DATE; + DECLARE @RunTime TIME; + DECLARE @Env VARCHAR(10) = 'TEST'; -- configurable per environment + + DECLARE job_cursor CURSOR FOR + SELECT js.JobName, js.AdjustedRunDate, jc.ScheduledStartTime + FROM dbo.JobSchedule js + INNER JOIN dbo.JobControl jc ON js.JobName = jc.JobName + WHERE js.MonthOfSchedule = @MonthKey + AND jc.IsActive = 1; + + OPEN job_cursor; + FETCH NEXT FROM job_cursor INTO @JobName, @RunDate, @RunTime; + + WHILE @@FETCH_STATUS = 0 + BEGIN + EXEC msdb.dbo.usp_ScheduleJob + @JobName = @JobName, + @Env = @Env, + @RunDate = @RunDate, + @RunTime = @RunTime; + + FETCH NEXT FROM job_cursor INTO @JobName, @RunDate, @RunTime; + END + + CLOSE job_cursor; + DEALLOCATE job_cursor; +END diff --git a/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_TriggerMissedJobs.sql b/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_TriggerMissedJobs.sql new file mode 100644 index 0000000..53496ac Binary files /dev/null and b/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_TriggerMissedJobs.sql differ diff --git a/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_UpdateJobStatus_Generic.sql b/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_UpdateJobStatus_Generic.sql new file mode 100644 index 0000000..6057d6e Binary files /dev/null and b/SqlAgent/v2/02_Test/3_Stored_Procedures/usp_UpdateJobStatus_Generic.sql differ diff --git a/SqlAgent/v2/02_Test/4_Job_Maintenance/ActivateOnDemandJob.sql b/SqlAgent/v2/02_Test/4_Job_Maintenance/ActivateOnDemandJob.sql new file mode 100644 index 0000000..8ba8703 --- /dev/null +++ b/SqlAgent/v2/02_Test/4_Job_Maintenance/ActivateOnDemandJob.sql @@ -0,0 +1,10 @@ +USE msdb; +GO + +-- Schedule TEST OnDemand Job on 03 Nov at 18:15 PM +------------------------------------------------ +EXEC dbo.usp_ScheduleJob + @JobName='TEST_MONTHLY_DTSRQ414', + @Env='TEST', + @RunDate='2025-11-03', + @RunTime='18:15:00'; diff --git a/SqlAgent/v2/02_Test/4_Job_Maintenance/AddAllJobsToSQLAgent.sql b/SqlAgent/v2/02_Test/4_Job_Maintenance/AddAllJobsToSQLAgent.sql new file mode 100644 index 0000000..1365898 --- /dev/null +++ b/SqlAgent/v2/02_Test/4_Job_Maintenance/AddAllJobsToSQLAgent.sql @@ -0,0 +1,141 @@ +USE [msdb] +GO + +-- Execute the stored procedure for each job +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX215', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX305', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSGSID0', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_GSIRQ300', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSRQ202', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSGSID1', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX202', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSFT202', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX432', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSGACHD', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX303', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSGWAGE', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSGCHKS', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSESDAY', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSGPAYT', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSDX145', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX629', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX630', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSFRAUD', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSRACHD', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBXACH', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBXREG', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX430', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX626', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX530', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBXREL', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX450', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX451', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSPACHD', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSPX148', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSRQ325', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX427', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSPDAY1', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSW4WGE', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSGSID2', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSGSID9', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSMIN01', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSMIN02', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSRQ459', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBXPFL', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DESBD427', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX403', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBE405', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX405', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSRQ335', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX601', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_WEEKLY_DTSGSID0', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_WEEKLY_DTSGSID1', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_WEEKLY_DTSBX202', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_WEEKLY_DTSFT202', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_WEEKLY_DTSBX470', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_WEEKLY_DTSBXREJ', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_WEEKLY_DTSPDAY7', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_WEEKLY_DTSBX122', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_WEEKLY_DTSRQ511', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_WEEKLY_DTSRQ444', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_WEEKLY_DTSRQ126', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_MONTHLY_DTSRQ414', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_MONTHLY_DTSPMON1', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_MONTHLY_DTSCHGVB', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_MONTHLY_DTSCHGVR', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_MONTHLY_DTSVBKUP', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_MONTHLY_DTSVRSTR', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_MONTHLY_DTSRQ442', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_MONTHLY_DTSBX460', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_MONTHLY_DTSRQ513', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_MONTHLY_DTSCHGDC', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSRQ119', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSRQ902', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSBX500', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSRQ417', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSRQ320', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSRQ713', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSBX468', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSCHGQ1', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSCHGQ2', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSRQ327', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSRQ328', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSRQ412', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSRQ793', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSWGE06', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSCHGRT', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSCHRGS', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSRQ540', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSRQ591', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSRTCHG', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSWGE01', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DESBD426', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSACH01', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSBX415', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSBX452', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSBX453', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ120', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ123', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ125', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ305', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ306', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ308', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ311', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ410', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ411', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ423', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ426', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ429', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ439', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ602', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ606', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ607', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ609', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ611', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ612', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ717', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ718', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ720', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ721', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRT715', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRT716', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRT717', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRT718', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRT719', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRT720', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRT722', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRT723', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_YEARLY_DTSRQ722', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_YEARLY_DTSRQ451', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_YEARLY_DTSRQ127', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_YEARLY_DTSRQ321', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_YEARLY_DTSRQ455', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_YEARLY_DTSRQ500', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_YEARLY_DTSRQ517', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_YEARLY_DTSRQ518', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_YEARLY_DTSRQ616', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_YEARLY_DTSRQ701', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_YEARLY_DTSRQ702', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_YEARLY_DTSRQ704', @Env = 'TEST'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_YEARLY_DTSRQ910', @Env = 'TEST'; +GO \ No newline at end of file diff --git a/SqlAgent/v2/02_Test/4_Job_Maintenance/AddDailyJobSchedule.sql b/SqlAgent/v2/02_Test/4_Job_Maintenance/AddDailyJobSchedule.sql new file mode 100644 index 0000000..88d2d22 --- /dev/null +++ b/SqlAgent/v2/02_Test/4_Job_Maintenance/AddDailyJobSchedule.sql @@ -0,0 +1 @@ +EXEC msdb.dbo.usp_CreateDailyJobSchedule @Env = 'TEST'; \ No newline at end of file diff --git a/SqlAgent/v2/02_Test/4_Job_Maintenance/AddNewJobToSQLAgent.sql b/SqlAgent/v2/02_Test/4_Job_Maintenance/AddNewJobToSQLAgent.sql new file mode 100644 index 0000000..743765a --- /dev/null +++ b/SqlAgent/v2/02_Test/4_Job_Maintenance/AddNewJobToSQLAgent.sql @@ -0,0 +1,5 @@ +USE [msdb] +GO + +-- Create a job in SQL Agent (With Standard 3 steps approach) +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX215', @Env = 'DEVL'; \ No newline at end of file diff --git a/SqlAgent/v2/02_Test/4_Job_Maintenance/AddWeeklyJobSchedule.sql b/SqlAgent/v2/02_Test/4_Job_Maintenance/AddWeeklyJobSchedule.sql new file mode 100644 index 0000000..39978c4 --- /dev/null +++ b/SqlAgent/v2/02_Test/4_Job_Maintenance/AddWeeklyJobSchedule.sql @@ -0,0 +1 @@ +EXEC msdb.dbo.usp_CreateWeeklySchedules @Env = 'TEST'; \ No newline at end of file diff --git a/SqlAgent/v2/02_Test/4_Job_Maintenance/DailyJobScheduleLookup.sql b/SqlAgent/v2/02_Test/4_Job_Maintenance/DailyJobScheduleLookup.sql new file mode 100644 index 0000000..b893457 --- /dev/null +++ b/SqlAgent/v2/02_Test/4_Job_Maintenance/DailyJobScheduleLookup.sql @@ -0,0 +1,86 @@ +/******************************************************************************************** + Section 1: Daily Job Schedule Lookup + -------------------------------------------------------------------------------------------- + Description: + Returns all SQL Agent jobs scheduled to run on a given date, along with their control + status (IsActive) and configured runtime from JobControl. + + Parameters: + @CheckDate - The date to check job schedules for. + + Notes: + • Uses MSDB’s internal schedule definitions (sysschedules, sysjobschedules). + • Supports One-time, Daily, Weekly, and Monthly schedule types. + • Can easily be adapted for DEVL / TEST / PROD by changing @DbName. + +********************************************************************************************/ +USE msdb; +GO + +DECLARE @CheckDate DATE = CAST(GETDATE() AS DATE); -- Change if needed +DECLARE @CheckWeekday INT = DATEPART(WEEKDAY, @CheckDate); +DECLARE @Env SYSNAME = 'DEVL'; -- Change for TEST or PROD +DECLARE @DbName SYSNAME; + +-- Map environment to the right control DB +SET @DbName = CASE @Env + WHEN 'DEVL' THEN 'DevlDUTASJobSchedule' + WHEN 'TEST' THEN 'TestDUTASJobSchedule' + WHEN 'PROD' THEN 'ProdDUTASJobSchedule' + END; + +DECLARE @Sql NVARCHAR(MAX); +SET @Sql = N' +SELECT + j.name AS SQLAgentJobName, + jc.JobName AS ControlJobName, + jc.ScheduledStartTime, + jc.IsActive, + s.name AS ScheduleName, + s.freq_type, + s.freq_interval, + s.freq_subday_type, + s.freq_subday_interval, + s.active_start_date, + CASE s.freq_type + WHEN 1 THEN ''One-time'' + WHEN 4 THEN ''Daily'' + WHEN 8 THEN ''Weekly'' + WHEN 16 THEN ''Monthly'' + ELSE ''Other'' + END AS FrequencyType, + CASE + WHEN s.freq_type = 1 + AND s.active_start_date = CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112)) + THEN 1 + WHEN s.freq_type = 4 + AND s.active_start_date <= CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112)) + THEN 1 + WHEN s.freq_type = 8 -- Weekly + AND (POWER(2, @CheckWeekdayParam - 1) & s.freq_interval) > 0 + THEN 1 + WHEN s.freq_type = 16 -- Monthly + AND DAY(@CheckDateParam) = s.freq_interval + THEN 1 + ELSE 0 + END AS IsScheduledToday +FROM msdb.dbo.sysjobs j +JOIN msdb.dbo.sysjobschedules js ON j.job_id = js.job_id +JOIN msdb.dbo.sysschedules s ON js.schedule_id = s.schedule_id +LEFT JOIN ' + QUOTENAME(@DbName) + '.dbo.JobControl jc ON jc.JobName = j.name +WHERE jc.IsActive = 1 + AND ( + (s.freq_type = 1 AND s.active_start_date = CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112))) -- One-time + OR (s.freq_type = 4 AND s.active_start_date <= CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112))) -- Daily + OR (s.freq_type = 8 AND (POWER(2, @CheckWeekdayParam - 1) & s.freq_interval) > 0) -- Weekly + OR (s.freq_type = 16 AND DAY(@CheckDateParam) = s.freq_interval) -- Monthly + ) +ORDER BY jc.ScheduledStartTime; +'; + +EXEC sp_executesql + @Sql, + N'@CheckDateParam DATE, @CheckWeekdayParam INT', + @CheckDateParam = @CheckDate, + @CheckWeekdayParam = @CheckWeekday; +GO diff --git a/SqlAgent/v2/02_Test/4_Job_Maintenance/DeactivateJob.sql b/SqlAgent/v2/02_Test/4_Job_Maintenance/DeactivateJob.sql new file mode 100644 index 0000000..e72bae5 --- /dev/null +++ b/SqlAgent/v2/02_Test/4_Job_Maintenance/DeactivateJob.sql @@ -0,0 +1,12 @@ +USE TestDUTASJobSchedule; +GO + +UPDATE dbo.JobControl +SET IsActive = 0 +WHERE Frequency = 'MONTHLY'; +GO + +-- Optional: Verify changes +SELECT JobName, Frequency, IsActive +FROM dbo.JobControl +WHERE Frequency = 'MONTHLY'; diff --git a/SqlAgent/v2/02_Test/4_Job_Maintenance/DeleteSchedule.sql b/SqlAgent/v2/02_Test/4_Job_Maintenance/DeleteSchedule.sql new file mode 100644 index 0000000..04be04d --- /dev/null +++ b/SqlAgent/v2/02_Test/4_Job_Maintenance/DeleteSchedule.sql @@ -0,0 +1,27 @@ +USE msdb; +GO + +DECLARE @EnvPrefix NVARCHAR(50) = N'TEST'; -- <<< Change this to your environment prefix +DECLARE @schedule_id INT; +DECLARE @schedule_name NVARCHAR(128); + +DECLARE Sched_Cursor CURSOR FOR +SELECT schedule_id, name +FROM msdb.dbo.sysschedules +WHERE name LIKE @EnvPrefix + '%'; -- Only schedules starting with the given prefix + +OPEN Sched_Cursor; +FETCH NEXT FROM Sched_Cursor INTO @schedule_id, @schedule_name; + +WHILE @@FETCH_STATUS = 0 +BEGIN + PRINT 'Deleting schedule: ' + @schedule_name; + EXEC msdb.dbo.sp_delete_schedule @schedule_id = @schedule_id; + FETCH NEXT FROM Sched_Cursor INTO @schedule_id, @schedule_name; +END + +CLOSE Sched_Cursor; +DEALLOCATE Sched_Cursor; + +PRINT 'All SQL Agent schedules starting with prefix ' + @EnvPrefix + ' deleted successfully.'; +GO diff --git a/SqlAgent/v2/02_Test/4_Job_Maintenance/DetachDeleteScheduleByName.sql b/SqlAgent/v2/02_Test/4_Job_Maintenance/DetachDeleteScheduleByName.sql new file mode 100644 index 0000000..d646072 --- /dev/null +++ b/SqlAgent/v2/02_Test/4_Job_Maintenance/DetachDeleteScheduleByName.sql @@ -0,0 +1,13 @@ +-- If you know both the job name and schedule name +DECLARE @JobName NVARCHAR(100) = 'TEST_MONTHLY_DTSCHGDC'; +DECLARE @ScheduleName NVARCHAR(200) = 'TEST_MONTHLY_DTSCHGDC_MonthlySchedule'; +DECLARE @JobId UNIQUEIDENTIFIER; + +-- Get job ID +SELECT @JobId = job_id FROM msdb.dbo.sysjobs WHERE name = @JobName; + +-- Detach from specific job +EXEC msdb.dbo.sp_detach_schedule @job_id = @JobId, @schedule_name = @ScheduleName; + +-- Then delete +EXEC msdb.dbo.sp_delete_schedule @schedule_name = @ScheduleName; diff --git a/SqlAgent/v2/02_Test/4_Job_Maintenance/ForceCompleteJob.sql b/SqlAgent/v2/02_Test/4_Job_Maintenance/ForceCompleteJob.sql new file mode 100644 index 0000000..b34da74 --- /dev/null +++ b/SqlAgent/v2/02_Test/4_Job_Maintenance/ForceCompleteJob.sql @@ -0,0 +1,16 @@ +USE TestDUTASJobSchedule; +GO + +-- 1. Check today's job status +SELECT JobName, Status, ErrorMessage +FROM dbo.JobExecutionHistory +WHERE RunDate = CAST(GETDATE() AS DATE) +AND JobName = 'TEST_WEEKLY_DTSGSID1'; + +-- 2. Mark DTSBX305 as manually overridden +EXEC dbo.usp_ForceComplete 'TEST_WEEKLY_DTSGSID1', 'Neeraj.Kumar'; + +-- 3. Verify the override +SELECT JobName, Status, OverrideBy, OverrideDate +FROM dbo.JobExecutionHistory +WHERE JobName = 'TEST_WEEKLY_DTSGSID1' AND RunDate = CAST(GETDATE() AS DATE); \ No newline at end of file diff --git a/SqlAgent/v2/02_Test/4_Job_Maintenance/GenerateJobScheduleTable.sql b/SqlAgent/v2/02_Test/4_Job_Maintenance/GenerateJobScheduleTable.sql new file mode 100644 index 0000000..7c58121 --- /dev/null +++ b/SqlAgent/v2/02_Test/4_Job_Maintenance/GenerateJobScheduleTable.sql @@ -0,0 +1,10 @@ +USE TestDUTASJobSchedule; +GO + +-- Set Job Schedule for the Year 2025 +EXEC dbo.usp_GenerateJobSchedule @Year = 2025; +GO + +-- Set Job Schedule for the Year 2026 +EXEC dbo.usp_GenerateJobSchedule @Year = 2026; +GO \ No newline at end of file diff --git a/SqlAgent/v2/02_Test/4_Job_Maintenance/JobInfo.sql b/SqlAgent/v2/02_Test/4_Job_Maintenance/JobInfo.sql new file mode 100644 index 0000000..4cd23e4 --- /dev/null +++ b/SqlAgent/v2/02_Test/4_Job_Maintenance/JobInfo.sql @@ -0,0 +1,47 @@ +USE msdb; +GO + +PRINT '================================================================================'; +PRINT 'SECTION 1: JOB CONTROL INFORMATION'; +PRINT '================================================================================'; +GO + +-- View all active jobs +SELECT JobName, ScheduledStartTime, Frequency, IsActive +FROM TestDUTASJobSchedule.dbo.JobControl +WHERE IsActive = 1 +ORDER BY Frequency, ScheduledStartTime; +GO + +-- View all inactive jobs +SELECT JobName, Frequency, ScheduledStartTime +FROM TestDUTASJobSchedule.dbo.JobControl +WHERE IsActive = 0 +ORDER BY Frequency; +GO + +-- Find weekly/monthly jobs +SELECT JobName, Frequency, ScheduledStartTime +FROM TestDUTASJobSchedule.dbo.JobControl +WHERE Frequency IN ('WEEKLY', 'MONTHLY') +ORDER BY Frequency, ScheduledStartTime; +GO + +PRINT '================================================================================'; +PRINT 'SECTION 2: JOB DEPENDENCIES'; +PRINT '================================================================================'; +GO + +-- Check dependencies for a job +DECLARE @Job NVARCHAR(100) = 'TEST_MONTHLY_DTSCHGVR'; +SELECT JobName, PredecessorJobName +FROM TestDUTASJobSchedule.dbo.JobDependencies +WHERE JobName = @Job; +GO + +-- Show dependency chain overview +SELECT d.JobName, d.PredecessorJobName, jc.ScheduledStartTime, jc.Frequency +FROM TestDUTASJobSchedule.dbo.JobDependencies d +JOIN TestDUTASJobSchedule.dbo.JobControl jc ON d.JobName = jc.JobName +ORDER BY jc.Frequency, jc.ScheduledStartTime; +GO diff --git a/SqlAgent/v2/02_Test/4_Job_Maintenance/SQLAgentInfo.sql b/SqlAgent/v2/02_Test/4_Job_Maintenance/SQLAgentInfo.sql new file mode 100644 index 0000000..d63458e --- /dev/null +++ b/SqlAgent/v2/02_Test/4_Job_Maintenance/SQLAgentInfo.sql @@ -0,0 +1,42 @@ +USE msdb; +GO + +PRINT '================================================================================'; +PRINT 'SECTION 1: SQL AGENT JOB STATUS'; +PRINT '================================================================================'; +GO + +-- List all jobs in SQL Agent +SELECT name AS JobName, enabled, date_created, date_modified +FROM msdb.dbo.sysjobs +ORDER BY name; +GO + +-- Job schedule summary +SELECT j.name AS JobName, s.name AS ScheduleName, + s.enabled, s.freq_type, s.active_start_date, s.active_start_time +FROM msdb.dbo.sysjobs j +JOIN msdb.dbo.sysjobschedules js ON j.job_id = js.job_id +JOIN msdb.dbo.sysschedules s ON js.schedule_id = s.schedule_id +ORDER BY j.name; +GO + +-- Last job run details +SELECT j.name AS JobName, + h.run_status, + CASE h.run_status + WHEN 0 THEN 'Failed' + WHEN 1 THEN 'Succeeded' + WHEN 2 THEN 'Retry' + WHEN 3 THEN 'Canceled' + WHEN 4 THEN 'In Progress' + END AS StatusDescription, + msdb.dbo.agent_datetime(h.run_date, h.run_time) AS RunDateTime, + h.run_duration +FROM dbo.sysjobs j +LEFT JOIN dbo.sysjobhistory h ON j.job_id = h.job_id +WHERE h.instance_id IN ( + SELECT MAX(instance_id) FROM dbo.sysjobhistory GROUP BY job_id +) +ORDER BY RunDateTime DESC; +GO \ No newline at end of file diff --git a/SqlAgent/v2/02_Test/4_Job_Maintenance/ScheduleJobsMonthly.sql b/SqlAgent/v2/02_Test/4_Job_Maintenance/ScheduleJobsMonthly.sql new file mode 100644 index 0000000..cd590b3 --- /dev/null +++ b/SqlAgent/v2/02_Test/4_Job_Maintenance/ScheduleJobsMonthly.sql @@ -0,0 +1,3 @@ +USE TestDUTASJobSchedule; +GO +EXEC dbo.usp_ScheduleJobsForMonth; diff --git a/SqlAgent/v2/02_Test/4_Job_Maintenance/TodaysExecution.sql b/SqlAgent/v2/02_Test/4_Job_Maintenance/TodaysExecution.sql new file mode 100644 index 0000000..7509ac0 --- /dev/null +++ b/SqlAgent/v2/02_Test/4_Job_Maintenance/TodaysExecution.sql @@ -0,0 +1,21 @@ +USE TestDUTASJobSchedule; +GO + +DECLARE @Runday DATE = DATEADD(day, +0, CAST(GETDATE() AS DATE)); -- -1 for Yesterday + +SELECT + jeh.ExecutionID, + jeh.JobName, + jeh.RunDate, + jc.ScheduledStartTime, + jeh.ActualStartTime, + jeh.ActualEndTime, + jeh.Status, + jeh.ErrorMessage, + jeh.OverrideFlag, + jeh.OverrideBy +FROM dbo.JobExecutionHistory jeh +INNER JOIN dbo.JobControl jc + ON jeh.JobName = jc.JobName +WHERE jeh.RunDate = @Runday +ORDER BY jc.ScheduledStartTime, jeh.ActualStartTime; diff --git a/SqlAgent/v2/02_Test/4_Job_Maintenance/TriggerMissedJob.sql b/SqlAgent/v2/02_Test/4_Job_Maintenance/TriggerMissedJob.sql new file mode 100644 index 0000000..5899713 --- /dev/null +++ b/SqlAgent/v2/02_Test/4_Job_Maintenance/TriggerMissedJob.sql @@ -0,0 +1,9 @@ +USE [TestDUTASJobSchedule] +GO + +-- 1. Preview missed jobs (safe, no run): + EXEC dbo.usp_TriggerMissedJobs @DryRun = 1; + +-- 2. Actually trigger missed jobs: + EXEC dbo.usp_TriggerMissedJobs @DryRun = 0; + diff --git a/SqlAgent/v2/02_Test/5_PowerShell_Scripts/Execute-RemoteJob.ps1 b/SqlAgent/v2/02_Test/5_PowerShell_Scripts/Execute-RemoteJob.ps1 new file mode 100644 index 0000000..ddf3ea8 --- /dev/null +++ b/SqlAgent/v2/02_Test/5_PowerShell_Scripts/Execute-RemoteJob.ps1 @@ -0,0 +1,102 @@ +param( + [Parameter(Mandatory = $true)] + [string]$JobName, + + [Parameter(Mandatory = $true)] + [ValidateSet('DEVL', 'TEST', 'PROD')] + [string]$Env +) + +try { + Write-Host "Starting job $JobName in environment $Env at $(Get-Date)" + + # ------------------------------------------------------------ + # Extract JCL from JobName (ENV_FREQUENCY_JOB pattern) + # ------------------------------------------------------------ + $JCL = $JobName -replace '^[A-Z]+_[A-Z]+_', '' + Write-Host "Extracted JCL: $JCL from JobName: $JobName" -ForegroundColor Yellow + + # ------------------------------------------------------------ + # Environment-specific configuration + # ------------------------------------------------------------ + switch ($Env.ToUpper()) { + 'DEVL' { + $ComputerName = '10.57.110.120' + $DatabaseName = 'DevlDUTASJobSchedule' + } + 'TEST' { + $ComputerName = '10.57.110.141' + $DatabaseName = 'TestDUTASJobSchedule' + } + 'PROD' { + $ComputerName = '10.57.111.125' + $DatabaseName = 'ProdDUTASJobSchedule' + } + default { + throw "Invalid environment specified: $Env" + } + } + + # ------------------------------------------------------------ + # Remote credentials + # (recommend moving credentials to secure vault for production) + # ------------------------------------------------------------ + $username = "DUTASSQLAdminP@does.dcgov.priv" + $password = "4ho@3Pr&Xof8" | ConvertTo-SecureString -AsPlainText -Force + $credential = New-Object System.Management.Automation.PSCredential($username, $password) + + # ------------------------------------------------------------ + # Execute job remotely using the extracted JCL + # ------------------------------------------------------------ + Write-Host "Connecting to remote server $ComputerName ..." + $exitCode = Invoke-Command -ComputerName $ComputerName ` + -Credential $credential ` + -Authentication CredSSP ` + -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck) ` + -ArgumentList $JobName, $JCL, $Env ` + -ScriptBlock { + param($JobName, $JCL, $Env) + + Write-Host "Remote execution - JobName: $JobName, JCL: $JCL, Env: $Env" + + $process = Start-Process -FilePath "powershell.exe" ` + -ArgumentList "-ExecutionPolicy Bypass -File `"E:\PSScript\RCSubmit-Job.ps1`" -JobName `"$JCL`" -Env `"$Env`"" ` + -NoNewWindow -Wait -PassThru + return $process.ExitCode + } + + if ($exitCode -eq 0) { + Write-Host "Job $JobName (JCL: $JCL) completed successfully at $(Get-Date)" -ForegroundColor Green + } else { + Write-Error "Job $JobName (JCL: $JCL) failed with exit code: $exitCode" + } +} +catch { + Write-Error "Job $JobName failed with error: $($_.Exception.Message)" + $exitCode = 1 +} +finally { + # ------------------------------------------------------------ + # Log exit code to the appropriate database + # ------------------------------------------------------------ + try { + $connectionString = "Server=localhost;Database=$DatabaseName;Trusted_Connection=true;" + $connection = New-Object System.Data.SqlClient.SqlConnection($connectionString) + $connection.Open() + + $command = $connection.CreateCommand() + $command.CommandText = @" + INSERT INTO dbo.JobExitCodes (JobName, RunDate, ExitCode, RecordedTime) + VALUES ('$JobName', CAST(GETDATE() AS DATE), $exitCode, GETDATE()); +"@ + $command.ExecuteNonQuery() + $connection.Close() + Write-Host "Exit code $exitCode logged to database $DatabaseName for job $JobName" + } + catch { + $errorMsg = $_.Exception.Message + Write-Host "Failed to log exit code to database $DatabaseName`: $errorMsg" + } +} + +exit $exitCode \ No newline at end of file diff --git a/SqlAgent/v2/02_Test/5_PowerShell_Scripts/RCSubmit-Job.ps1 b/SqlAgent/v2/02_Test/5_PowerShell_Scripts/RCSubmit-Job.ps1 new file mode 100644 index 0000000..b9893d7 --- /dev/null +++ b/SqlAgent/v2/02_Test/5_PowerShell_Scripts/RCSubmit-Job.ps1 @@ -0,0 +1,108 @@ +param( + [string]$JobName, + [string]$Env +) + +# --- Parameter Validation --- +if (-not $JobName) { + Write-Host "JobName parameter is required" -ForegroundColor Red + exit 1 +} +if (-not $Env) { + Write-Host "Environment (Env) parameter is required" -ForegroundColor Red + exit 1 +} + +# --- Execute Job --- +Write-Host "Submitting job: $JobName in environment: $Env" -ForegroundColor Cyan +$output = & "$env:rcbin\submit.exe" -DSN="DOESTAX.$Env.JOBS.BATCH.LIB($JobName)" +$exitCode = [int]$LASTEXITCODE +$isSuccess = 0 + +# --- Parse SYSLOG Path --- +$syslogPath = $null +$syslogFolder = "Not found" +$content = @() +$summary = @() + +try { + $syslogPath = $output | Select-String -Pattern "SYSLOG=\[(.*)\]" | ForEach-Object { $_.Matches.Groups[1].Value } + + if ($syslogPath -and (Test-Path $syslogPath)) { + $syslogFolder = Split-Path $syslogPath -Parent + $content = Get-Content $syslogPath -ErrorAction Stop + $summary = $content | Select-String -Pattern "%Job Overall Stats:" -Context 0,7 | ForEach-Object { + $_.Context.PostContext | Select-Object -Skip 1 -First 5 + } + } else { + Write-Host "SYSLOG path not found or inaccessible: $syslogPath" -ForegroundColor Yellow + $summary = @("SYSLOG file not found in output", "Raw output:", $output -join "`n") + } +} +catch { + Write-Host "Error processing SYSLOG: $($_.Exception.Message)" -ForegroundColor Yellow + $summary = @("Error reading SYSLOG: $($_.Exception.Message)", "Raw output:", $output -join "`n") +} + +# --- Evaluate Return Codes --- +$successConditions = @( + { $JobName -eq "GSIRQ300" -and $exitCode -eq 50 }, + { $JobName -eq "DTSGWAGE" -and $exitCode -eq 8 }, + { $JobName -eq "DTSGCHKS" -and $exitCode -eq 8 }, + { $JobName -eq "DTSGPAYT" -and $exitCode -eq 8 }, + { $JobName -eq "DTSBXACH" -and $exitCode -eq 2 }, + { $JobName -eq "DTSBXREL" -and $exitCode -eq 2 }, + { $JobName -eq "DTSMIN02" -and $exitCode -eq 4 }, + { $JobName -eq "DTSBE405" -and $exitCode -eq 910 }, + { $JobName -eq "DTSBXREJ" -and $exitCode -eq 4 }, + { $JobName -eq "DTSRQ444" -and $exitCode -eq 4 }, + { $exitCode -eq 0 } +) + +if ($successConditions | Where-Object { & $_ }) { + Write-Host "Job $JobName succeeded with code $exitCode" -ForegroundColor Green + $isSuccess = 0 +} else { + Write-Host "Job $JobName failed with code $exitCode" -ForegroundColor Red + $isSuccess = 1 + # Only use error if we don't have a proper summary + if ($summary.Count -eq 0) { + $summary = @($Error[0]) + } +} + +# --- Email Notification --- +$smtpServer = "smtp4.dc.gov" +$fromEmail = "Dutas@dc.gov" +$toEmail = "zarath.lalputan@dc.gov" +$ccEmail = @("srujani.chandragiri@dc.gov") + +$emailBody = @" +
+DUTAS Batch Job: $JobName Execution Report
+==========================================
+$($summary -join "`n")
+==========================================
+
+Return Code: $exitCode
+Status: $(if ($isSuccess -eq 0) { "SUCCESS" } else { "FAILED" })
+JOBLOG Path: $syslogFolder
+
+"@ + +try { + Send-MailMessage -SmtpServer $smtpServer -Port 25 ` + -From $fromEmail -To $toEmail -Cc $ccEmail ` + -Subject "DUTAS-[$Env] Job Status: $JobName - $(if ($isSuccess -eq 0) { 'SUCCESS' } else { 'FAILED' })" ` + -Body $emailBody -BodyAsHtml + Write-Host "Email sent successfully to $toEmail" -ForegroundColor Cyan +} +catch { + Write-Host "Failed to send email: $($_.Exception.Message)" -ForegroundColor Yellow +} + +Write-Host "`n---------------------------------------------" +Write-Host "Job: $JobName | ExitCode: $exitCode | Status: $(if ($isSuccess -eq 0) { 'SUCCESS' } else { 'FAILED' })" +Write-Host "---------------------------------------------`n" + +exit $isSuccess \ No newline at end of file diff --git a/SqlAgent/v2/02_Test/6_Backup_Restore/Backup-Restore-Guide.docx b/SqlAgent/v2/02_Test/6_Backup_Restore/Backup-Restore-Guide.docx new file mode 100644 index 0000000..c19787a Binary files /dev/null and b/SqlAgent/v2/02_Test/6_Backup_Restore/Backup-Restore-Guide.docx differ diff --git a/SqlAgent/v2/02_Test/6_Backup_Restore/Backup-SQLAgent.ps1 b/SqlAgent/v2/02_Test/6_Backup_Restore/Backup-SQLAgent.ps1 new file mode 100644 index 0000000..e74cf14 --- /dev/null +++ b/SqlAgent/v2/02_Test/6_Backup_Restore/Backup-SQLAgent.ps1 @@ -0,0 +1,48 @@ +# =================================================================== +# SQL Agent Jobs Backup Script (PowerShell) +# Modern Version using SqlServer module +# & "E:\Neeraj\SqlAgent\v2\01_Test\6_Backup\Backup-SQLAgent.ps1" ` +# -ServerName "DOES-DUTAS-SQL1" ` +# -BackupPath "\\DOES-RAINVM-TST\E$\Neeraj\SqlAgent\Backup\" +# +# =================================================================== + +param ( + [Parameter(Mandatory = $true)] + [string]$ServerName, + + [Parameter(Mandatory = $true)] + [string]$BackupPath +) + +# Load SQL Server PowerShell module +Import-Module SqlServer -ErrorAction Stop + +# Create timestamp and output paths +$Timestamp = Get-Date -Format "yyyyMMdd_HHmmss" +$ZipFile = Join-Path $BackupPath "SQLAgentJobs_$Timestamp.zip" + +# Ensure backup folder exists +if (-not (Test-Path $BackupPath)) { + New-Item -ItemType Directory -Path $BackupPath | Out-Null +} + +# Connect to SQL Server +$server = New-Object Microsoft.SqlServer.Management.Smo.Server $ServerName + +# Export all jobs as individual SQL scripts +$JobFiles = @() +foreach ($job in $server.JobServer.Jobs) { + $SafeJobName = ($job.Name -replace '[\\/:*?"<>|]', '_') + $FileName = Join-Path $BackupPath "$SafeJobName`_$Timestamp.sql" + $job.Script() | Out-File -FilePath $FileName -Encoding UTF8 + $JobFiles += $FileName +} + +# Compress all SQL files into a single ZIP +Compress-Archive -Path $JobFiles -DestinationPath $ZipFile -Force + +# Optional: clean up individual .sql files +# Remove-Item -Path $JobFiles + +Write-Host "SQL Agent jobs backup complete: $ZipFile" -ForegroundColor Green diff --git a/SqlAgent/v2/02_Test/6_Backup_Restore/BackupDB.sql b/SqlAgent/v2/02_Test/6_Backup_Restore/BackupDB.sql new file mode 100644 index 0000000..0177bca --- /dev/null +++ b/SqlAgent/v2/02_Test/6_Backup_Restore/BackupDB.sql @@ -0,0 +1,19 @@ +USE master; +GO + +DECLARE @SrcDB NVARCHAR(128) = 'TestDUTASJobSchedule'; +DECLARE @BackupPath NVARCHAR(260) = '\\DOES-RAINVM-TST\E$\Neeraj\SqlAgent\Backup\' + @SrcDB + '.bak'; +DECLARE @SQL NVARCHAR(MAX); + +-- Dynamic SQL for backup +SET @SQL = ' +BACKUP DATABASE [' + @SrcDB + '] +TO DISK = N''' + @BackupPath + ''' +WITH INIT, COMPRESSION, STATS = 10; +'; + +-- Execute backup +EXEC(@SQL); + +PRINT 'Backup completed: ' + @BackupPath; +GO diff --git a/SqlAgent/v2/02_Test/6_Backup_Restore/Cleanup-SQLAgent.ps1 b/SqlAgent/v2/02_Test/6_Backup_Restore/Cleanup-SQLAgent.ps1 new file mode 100644 index 0000000..edcb054 --- /dev/null +++ b/SqlAgent/v2/02_Test/6_Backup_Restore/Cleanup-SQLAgent.ps1 @@ -0,0 +1,45 @@ +<# +.SYNOPSIS +Deletes SQL Agent jobs whose names start with a given environment prefix (e.g., DEVL, TEST, PROD). + +.PARAMETER ServerName +SQL Server instance name (use FCI virtual name if clustered). + +.PARAMETER Env +Environment prefix for job deletion (e.g., DEVL, TEST, PROD). + +.EXAMPLE +.\Cleanup-SQLAgent.ps1 -ServerName "DOES-DUTAS-SQL1" -Env "DEVL" +#> + +param ( + [Parameter(Mandatory = $true)] + [string]$ServerName, + + [Parameter(Mandatory = $true)] + [string]$Environment +) + +# Load SQL Server module +Import-Module SqlServer -ErrorAction Stop + +# Connect to SQL Server +$server = New-Object Microsoft.SqlServer.Management.Smo.Server $ServerName + +# Create log file path (same folder as script) +$ScriptRoot = Split-Path -Parent $MyInvocation.MyCommand.Definition +$LogPath = Join-Path $ScriptRoot "CleanupSQLAgent_$($Environment)_$(Get-Date -Format 'yyyyMMdd_HHmmss').log" + +"=== SQL Agent Cleanup Started for $Environment : $(Get-Date) ===" | Out-File $LogPath -Encoding UTF8 + +# Take a snapshot of all jobs first (avoids collection modification issue) +$jobsToDelete = @($server.JobServer.Jobs | Where-Object { $_.Name -like "$Environment*" }) + +foreach ($job in $jobsToDelete) { + Write-Host "Deleting job: $($job.Name)" -ForegroundColor Yellow + "Deleting job: $($job.Name)" | Out-File $LogPath -Append -Encoding UTF8 + $job.Drop() +} + +"=== Cleanup Complete for $Environment : $(Get-Date) ===" | Out-File $LogPath -Append -Encoding UTF8 +Write-Host "All $Environment SQL Agent jobs deleted successfully." -ForegroundColor Green diff --git a/SqlAgent/v2/02_Test/6_Backup_Restore/CleanupSQLAgent.sql b/SqlAgent/v2/02_Test/6_Backup_Restore/CleanupSQLAgent.sql new file mode 100644 index 0000000..43ff71d --- /dev/null +++ b/SqlAgent/v2/02_Test/6_Backup_Restore/CleanupSQLAgent.sql @@ -0,0 +1,27 @@ +USE msdb; +GO + +DECLARE @EnvPrefix NVARCHAR(50) = N'DEVL'; -- <<< Change this to your environment prefix +DECLARE @job_id UNIQUEIDENTIFIER; +DECLARE @job_name NVARCHAR(200); + +DECLARE JobCursor CURSOR FOR +SELECT job_id, name +FROM msdb.dbo.sysjobs +WHERE name LIKE @EnvPrefix + '%'; -- Only jobs starting with the given prefix + +OPEN JobCursor; +FETCH NEXT FROM JobCursor INTO @job_id, @job_name; + +WHILE @@FETCH_STATUS = 0 +BEGIN + PRINT 'Deleting job: ' + @job_name; + EXEC msdb.dbo.sp_delete_job @job_id = @job_id; + FETCH NEXT FROM JobCursor INTO @job_id, @job_name; +END + +CLOSE JobCursor; +DEALLOCATE JobCursor; + +PRINT 'All SQL Agent jobs starting with prefix ' + @EnvPrefix + ' deleted successfully.'; +GO diff --git a/SqlAgent/v2/02_Test/6_Backup_Restore/Extract_Backup-SQLAgent.ps1 b/SqlAgent/v2/02_Test/6_Backup_Restore/Extract_Backup-SQLAgent.ps1 new file mode 100644 index 0000000..760d123 --- /dev/null +++ b/SqlAgent/v2/02_Test/6_Backup_Restore/Extract_Backup-SQLAgent.ps1 @@ -0,0 +1,8 @@ +$BackupZip = "\\DOES-RAINVM-TST\E$\Neeraj\SqlAgent\Backup\SQLAgentJobs_20251018_153000.zip" +$ExtractPath = "\\DOES-RAINVM-TST\E$\Neeraj\SqlAgent\Restore\" + +# Create folder if not exist +if (-not (Test-Path $ExtractPath)) { New-Item -ItemType Directory -Path $ExtractPath | Out-Null } + +# Extract the ZIP +Expand-Archive -Path $BackupZip -DestinationPath $ExtractPath -Force diff --git a/SqlAgent/v2/02_Test/6_Backup_Restore/RestoreDB.sql b/SqlAgent/v2/02_Test/6_Backup_Restore/RestoreDB.sql new file mode 100644 index 0000000..d0ae5f7 --- /dev/null +++ b/SqlAgent/v2/02_Test/6_Backup_Restore/RestoreDB.sql @@ -0,0 +1,31 @@ +USE master; +GO + +DECLARE @SrcDB NVARCHAR(128) = 'DevlDUTASJobSchedule'; -- original database +DECLARE @NewDB NVARCHAR(128) = 'DevlDUTASJobSchedule'; -- database name to restore as +DECLARE @BackupPath NVARCHAR(260) = '\\DOES-RAINVM-TST\E$\Neeraj\SqlAgent\Backup\' + @SrcDB + '.bak'; +DECLARE @SQL NVARCHAR(MAX); + +-- Optional: check logical file names inside backup +-- RESTORE FILELISTONLY FROM DISK = @BackupPath; + +-- Dynamic SQL for restore +SET @SQL = ' +-- Optional: disconnect active connections +ALTER DATABASE [' + @NewDB + '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; + +RESTORE DATABASE [' + @NewDB + '] +FROM DISK = N''' + @BackupPath + ''' +WITH MOVE N''' + @SrcDB + ''' TO N''\\DOES-RAINVM-TST\E$\SQLData\' + @NewDB + '.mdf'', + MOVE N''' + @SrcDB + '_log'' TO N''\\DOES-RAINVM-TST\E$\SQLLogs\' + @NewDB + '_log.ldf'', + REPLACE, STATS = 10; + +-- Set database back to multi-user +ALTER DATABASE [' + @NewDB + '] SET MULTI_USER; +'; + +-- Execute restore +EXEC(@SQL); + +PRINT 'Database restored successfully as ' + @NewDB; +GO diff --git a/SqlAgent/v2/02_Test/6_Backup_Restore/RestoreSQLAgent.sql b/SqlAgent/v2/02_Test/6_Backup_Restore/RestoreSQLAgent.sql new file mode 100644 index 0000000..697baeb --- /dev/null +++ b/SqlAgent/v2/02_Test/6_Backup_Restore/RestoreSQLAgent.sql @@ -0,0 +1,12 @@ +# Connect to SQL Server +$ServerName = "DOES-DUTAS-SQL1" +$SqlInstance = "localhost" # or server instance name + +# Execute each script +$ScriptFiles = Get-ChildItem -Path $ExtractPath -Filter *.sql +foreach ($file in $ScriptFiles) { + Write-Host "Restoring job from: $($file.FullName)" + sqlcmd -S $SqlInstance -i $file.FullName +} + +Write-Host "All SQL Agent jobs restored successfully." diff --git a/SqlAgent/v2/03_Prod/1_Database_Setup/CreateDB.sql b/SqlAgent/v2/03_Prod/1_Database_Setup/CreateDB.sql new file mode 100644 index 0000000..ba6a525 --- /dev/null +++ b/SqlAgent/v2/03_Prod/1_Database_Setup/CreateDB.sql @@ -0,0 +1,83 @@ +-- Create the database +CREATE DATABASE ProdDUTASJobSchedule; +GO + +USE ProdDUTASJobSchedule; +GO + +-- Create the main control table +CREATE TABLE dbo.JobControl +( + JobID INT IDENTITY(1,1) NOT NULL, + JobName VARCHAR(50) NOT NULL, + ScheduledStartTime TIME(7) NOT NULL, + SchedulerAction VARCHAR(10) NOT NULL, -- STOP or CONTINUE + IsActive BIT NOT NULL CONSTRAINT DF_JobControl_IsActive DEFAULT (1), + CreatedDate DATETIME NOT NULL CONSTRAINT DF_JobControl_CreatedDate DEFAULT (GETDATE()), + Frequency CHAR(20) NOT NULL CONSTRAINT DF_JobControl_Frequency DEFAULT ('DAILY'), + FrequencyPattern NVARCHAR(500) NULL, -- JSON scheduling rule + + CONSTRAINT PK_JobControl PRIMARY KEY CLUSTERED (JobID ASC), + CONSTRAINT UQ_JobControl_JobName UNIQUE NONCLUSTERED (JobName ASC), + CONSTRAINT CK_JobControl_SchedulerAction CHECK (SchedulerAction IN ('STOP', 'CONTINUE')) +); +GO + +-- Create job dependencies table +CREATE TABLE dbo.JobDependencies ( + DependencyID INT IDENTITY(1,1) PRIMARY KEY, + JobName VARCHAR(50) NOT NULL, + PredecessorJobName VARCHAR(50) NULL, + FOREIGN KEY (JobName) REFERENCES dbo.JobControl(JobName) +); +GO + +-- Create execution history table +CREATE TABLE dbo.JobExecutionHistory ( + ExecutionID INT IDENTITY(1,1) PRIMARY KEY, + JobName VARCHAR(50) NOT NULL, + RunDate DATE NOT NULL, + ScheduledStartTime TIME NOT NULL, + ActualStartTime DATETIME NULL, + ActualEndTime DATETIME NULL, + Status VARCHAR(20) DEFAULT 'Pending' CHECK (Status IN ('Pending', 'Running', 'Success', 'Failed', 'ForceComplete')), + ErrorMessage VARCHAR(MAX) NULL, + OverrideFlag BIT DEFAULT 0, + OverrideBy VARCHAR(100) NULL, + OverrideDate DATETIME NULL +); +GO + +-- Create holidays table +CREATE TABLE dbo.FederalHolidays ( + HolidayID INT IDENTITY(1,1) PRIMARY KEY, + HolidayDate DATE NOT NULL UNIQUE, + HolidayName VARCHAR(100) NOT NULL, + Year INT NOT NULL +); +GO + +-- Create Exit Code table for PowerShell Script +CREATE TABLE dbo.JobExitCodes +( + JobExecutionID INT IDENTITY(1,1) PRIMARY KEY, -- unique ID per execution + JobName NVARCHAR(128) NOT NULL, -- job name + RunDate DATE NOT NULL, -- date of execution + ExitCode INT NOT NULL, -- exit code from job + RecordedTime DATETIME NOT NULL DEFAULT GETDATE() -- timestamp of execution +); +GO +-- Create JobSchedule table +CREATE TABLE dbo.JobSchedule ( + JobScheduleID INT IDENTITY(1,1) PRIMARY KEY, + JobName VARCHAR(100) NOT NULL, + Frequency VARCHAR(20) CHECK (Frequency IN ('Monthly','Quarterly')), + ScheduledRule NVARCHAR(500) NULL, -- Copy of JSON or rule text from JobControl + ScheduledDate DATE NOT NULL, -- Planned date (before adjustment) + AdjustedRunDate DATE NOT NULL, -- Final working-day adjusted date + MonthOfSchedule CHAR(7) NOT NULL, -- 'YYYY-MM' + YearOfSchedule INT NOT NULL, + CreatedOn DATETIME DEFAULT GETDATE(), + CreatedBy VARCHAR(50) DEFAULT SUSER_SNAME() +); +GO \ No newline at end of file diff --git a/SqlAgent/v2/03_Prod/1_Database_Setup/InsertHolidays.sql b/SqlAgent/v2/03_Prod/1_Database_Setup/InsertHolidays.sql new file mode 100644 index 0000000..9bef23e --- /dev/null +++ b/SqlAgent/v2/03_Prod/1_Database_Setup/InsertHolidays.sql @@ -0,0 +1,29 @@ +USE [ProdDUTASJobSchedule] +GO +SET IDENTITY_INSERT [dbo].[FederalHolidays] ON +GO +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (1, CAST(N'2025-01-01' AS Date), N'New Years Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (2, CAST(N'2025-01-20' AS Date), N'Martin Luther King Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (3, CAST(N'2025-02-17' AS Date), N'Presidents Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (4, CAST(N'2025-05-26' AS Date), N'Memorial Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (5, CAST(N'2025-06-19' AS Date), N'Juneteenth Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (6, CAST(N'2025-07-04' AS Date), N'Independence Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (7, CAST(N'2025-09-01' AS Date), N'Labor Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (8, CAST(N'2025-10-13' AS Date), N'Columbus Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (9, CAST(N'2025-11-11' AS Date), N'Veterans Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (10, CAST(N'2025-11-27' AS Date), N'Thanksgiving Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (11, CAST(N'2025-12-25' AS Date), N'Christmas Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (12, CAST(N'2026-01-01' AS Date), N'New Years Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (13, CAST(N'2026-01-19' AS Date), N'Martin Luther King Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (14, CAST(N'2026-02-16' AS Date), N'Presidents Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (15, CAST(N'2026-05-25' AS Date), N'Memorial Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (16, CAST(N'2026-06-19' AS Date), N'Juneteenth Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (17, CAST(N'2026-07-03' AS Date), N'Independence Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (18, CAST(N'2026-09-07' AS Date), N'Labor Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (19, CAST(N'2026-10-12' AS Date), N'Columbus Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (20, CAST(N'2026-11-11' AS Date), N'Veterans Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (21, CAST(N'2026-11-26' AS Date), N'Thanksgiving Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (22, CAST(N'2026-12-25' AS Date), N'Christmas Day', 2026) +GO +SET IDENTITY_INSERT [dbo].[FederalHolidays] OFF +GO diff --git a/SqlAgent/v2/03_Prod/1_Database_Setup/InsertJobControl.sql b/SqlAgent/v2/03_Prod/1_Database_Setup/InsertJobControl.sql new file mode 100644 index 0000000..6be4559 --- /dev/null +++ b/SqlAgent/v2/03_Prod/1_Database_Setup/InsertJobControl.sql @@ -0,0 +1,143 @@ +USE [ProdDUTASJobSchedule] +GO +SET IDENTITY_INSERT [dbo].[JobControl] ON +GO +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (1, N'PROD_DAILY_DTSBX215', CAST(N'04:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (2, N'PROD_DAILY_DTSBX305', CAST(N'04:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (3, N'PROD_DAILY_DTSGSID0', CAST(N'06:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (4, N'PROD_DAILY_GSIRQ300', CAST(N'06:05:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (5, N'PROD_DAILY_DTSRQ202', CAST(N'06:10:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (6, N'PROD_DAILY_DTSGSID1', CAST(N'06:15:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (7, N'PROD_DAILY_DTSBX202', CAST(N'07:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (8, N'PROD_DAILY_DTSFT202', CAST(N'08:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (9, N'PROD_DAILY_DTSBX432', CAST(N'08:30:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (10, N'PROD_DAILY_DTSGACHD', CAST(N'09:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (11, N'PROD_DAILY_DTSBX303', CAST(N'10:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (12, N'PROD_DAILY_DTSGWAGE', CAST(N'14:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (13, N'PROD_DAILY_DTSGCHKS', CAST(N'14:05:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (14, N'PROD_DAILY_DTSESDAY', CAST(N'14:05:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (15, N'PROD_DAILY_DTSGPAYT', CAST(N'14:10:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (16, N'PROD_DAILY_DTSDX145', CAST(N'16:05:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (17, N'PROD_DAILY_DTSBX629', CAST(N'16:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (18, N'PROD_DAILY_DTSBX630', CAST(N'16:30:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (19, N'PROD_DAILY_DTSFRAUD', CAST(N'16:30:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (20, N'PROD_DAILY_DTSRACHD', CAST(N'17:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (21, N'PROD_DAILY_DTSBXACH', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (22, N'PROD_DAILY_DTSBXREG', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (23, N'PROD_DAILY_DTSBX430', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (24, N'PROD_DAILY_DTSBX626', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (25, N'PROD_DAILY_DTSBX530', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (26, N'PROD_DAILY_DTSBXREL', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (27, N'PROD_DAILY_DTSBX450', CAST(N'17:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (28, N'PROD_DAILY_DTSBX451', CAST(N'17:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (29, N'PROD_DAILY_DTSPACHD', CAST(N'18:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (30, N'PROD_DAILY_DTSPX148', CAST(N'18:05:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (31, N'PROD_DAILY_DTSRQ325', CAST(N'18:05:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (32, N'PROD_DAILY_DTSBX427', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (33, N'PROD_DAILY_DTSPDAY1', CAST(N'18:10:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (34, N'PROD_DAILY_DTSW4WGE', CAST(N'18:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (35, N'PROD_DAILY_DTSGSID2', CAST(N'18:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (36, N'PROD_DAILY_DTSGSID9', CAST(N'18:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (37, N'PROD_DAILY_DTSMIN01', CAST(N'18:20:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (38, N'PROD_DAILY_DTSMIN02', CAST(N'18:20:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (39, N'PROD_DAILY_DTSRQ459', CAST(N'19:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (40, N'PROD_DAILY_DTSBXPFL', CAST(N'19:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (41, N'PROD_DAILY_DESBD427', CAST(N'19:05:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (42, N'PROD_DAILY_DTSBX403', CAST(N'20:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (43, N'PROD_DAILY_DTSBE405', CAST(N'20:15:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (44, N'PROD_DAILY_DTSBX405', CAST(N'20:15:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (45, N'PROD_DAILY_DTSRQ335', CAST(N'21:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (46, N'PROD_DAILY_DTSBX601', CAST(N'21:25:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (47, N'PROD_WEEKLY_DTSGSID0', CAST(N'06:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Sat","Sun"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (48, N'PROD_WEEKLY_DTSGSID1', CAST(N'06:15:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Sat","Sun"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (49, N'PROD_WEEKLY_DTSBX202', CAST(N'07:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Sat","Sun"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (50, N'PROD_WEEKLY_DTSFT202', CAST(N'08:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Sat","Sun"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (51, N'PROD_WEEKLY_DTSBX470', CAST(N'07:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (52, N'PROD_WEEKLY_DTSBXREJ', CAST(N'17:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Tue","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (53, N'PROD_WEEKLY_DTSPDAY7', CAST(N'19:10:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (54, N'PROD_WEEKLY_DTSBX122', CAST(N'19:14:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (55, N'PROD_WEEKLY_DTSRQ511', CAST(N'19:14:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (56, N'PROD_WEEKLY_DTSRQ444', CAST(N'07:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Mon"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (57, N'PROD_WEEKLY_DTSRQ126', CAST(N'09:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Mon"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (58, N'PROD_MONTHLY_DTSRQ414', CAST(N'18:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"FirstWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (59, N'PROD_MONTHLY_DTSPMON1', CAST(N'19:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (60, N'PROD_MONTHLY_DTSCHGVB', CAST(N'19:26:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (61, N'PROD_MONTHLY_DTSCHGVR', CAST(N'19:27:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (62, N'PROD_MONTHLY_DTSVBKUP', CAST(N'19:26:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (63, N'PROD_MONTHLY_DTSVRSTR', CAST(N'19:30:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (64, N'PROD_MONTHLY_DTSRQ442', CAST(N'19:37:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (65, N'PROD_MONTHLY_DTSBX460', CAST(N'19:35:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (66, N'PROD_MONTHLY_DTSRQ513', CAST(N'19:37:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (67, N'PROD_MONTHLY_DTSCHGDC', CAST(N'13:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"FirstWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (68, N'PROD_QUARTERLY_DTSRQ119', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Months":[3,6,9,12],"Day":3}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (69, N'PROD_QUARTERLY_DTSRQ902', CAST(N'18:16:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Months":[3,6,9,12],"Day":1}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (70, N'PROD_QUARTERLY_DTSBX500', CAST(N'21:25:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Months":[3,6,9,12],"Day":1}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (71, N'PROD_QUARTERLY_DTSRQ417', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":28},{"Month":5,"Day":31},{"Month":8,"Day":31},{"Month":11,"Day":30}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (72, N'PROD_QUARTERLY_DTSRQ320', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":10},{"Month":5,"Day":10},{"Month":8,"Day":10},{"Month":11,"Day":10}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (73, N'PROD_QUARTERLY_DTSRQ713', CAST(N'00:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":3,"Day":31},{"Month":6,"Day":30},{"Month":9,"Day":30},{"Month":12,"Day":31}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (74, N'PROD_QUARTERLY_DTSBX468', CAST(N'15:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":28},{"Month":5,"Day":30},{"Month":7,"Day":31},{"Month":10,"Day":30}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (75, N'PROD_QUARTERLY_DTSCHGQ1', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Rule":"FirstWorkdayOfQuarter"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (76, N'PROD_QUARTERLY_DTSCHGQ2', CAST(N'18:16:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Rule":"FirstWorkdayOfQuarter"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (77, N'PROD_QUARTERLY_DTSRQ327', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":7},{"Month":5,"Day":7},{"Month":8,"Day":7},{"Month":11,"Day":7}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (78, N'PROD_QUARTERLY_DTSRQ328', CAST(N'18:16:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":7},{"Month":5,"Day":7},{"Month":8,"Day":7},{"Month":11,"Day":7}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (79, N'PROD_QUARTERLY_DTSRQ412', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":1,"Day":15},{"Month":4,"Day":15},{"Month":7,"Day":15},{"Month":10,"Day":15}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (80, N'PROD_QUARTERLY_DTSRQ793', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (81, N'PROD_QUARTERLY_DTSWGE06', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (82, N'PROD_QUARTERLY_DTSCHGRT', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (83, N'PROD_QUARTERLY_DTSCHRGS', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (84, N'PROD_QUARTERLY_DTSRQ540', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (85, N'PROD_QUARTERLY_DTSRQ591', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (86, N'PROD_QUARTERLY_DTSRTCHG', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (87, N'PROD_QUARTERLY_DTSWGE01', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (88, N'PROD_QUARTERLY_DESBD426', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (89, N'PROD_ONDEMAND_DTSACH01', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (90, N'PROD_ONDEMAND_DTSBX415', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (91, N'PROD_ONDEMAND_DTSBX452', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (92, N'PROD_ONDEMAND_DTSBX453', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (93, N'PROD_ONDEMAND_DTSRQ120', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (94, N'PROD_ONDEMAND_DTSRQ123', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (95, N'PROD_ONDEMAND_DTSRQ125', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (96, N'PROD_ONDEMAND_DTSRQ305', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (97, N'PROD_ONDEMAND_DTSRQ306', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (98, N'PROD_ONDEMAND_DTSRQ308', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (99, N'PROD_ONDEMAND_DTSRQ311', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (100, N'PROD_ONDEMAND_DTSRQ410', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (101, N'PROD_ONDEMAND_DTSRQ411', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (102, N'PROD_ONDEMAND_DTSRQ423', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (103, N'PROD_ONDEMAND_DTSRQ426', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (104, N'PROD_ONDEMAND_DTSRQ429', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (105, N'PROD_ONDEMAND_DTSRQ439', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (106, N'PROD_ONDEMAND_DTSRQ602', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (107, N'PROD_ONDEMAND_DTSRQ606', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (108, N'PROD_ONDEMAND_DTSRQ607', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (109, N'PROD_ONDEMAND_DTSRQ609', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (110, N'PROD_ONDEMAND_DTSRQ611', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (111, N'PROD_ONDEMAND_DTSRQ612', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (112, N'PROD_ONDEMAND_DTSRQ717', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (113, N'PROD_ONDEMAND_DTSRQ718', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (114, N'PROD_ONDEMAND_DTSRQ720', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (115, N'PROD_ONDEMAND_DTSRQ721', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (116, N'PROD_ONDEMAND_DTSRT715', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (117, N'PROD_ONDEMAND_DTSRT716', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (118, N'PROD_ONDEMAND_DTSRT717', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (119, N'PROD_ONDEMAND_DTSRT718', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (120, N'PROD_ONDEMAND_DTSRT719', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (121, N'PROD_ONDEMAND_DTSRT720', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (122, N'PROD_ONDEMAND_DTSRT722', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (123, N'PROD_ONDEMAND_DTSRT723', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (124, N'PROD_YEARLY_DTSRQ722', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (125, N'PROD_YEARLY_DTSRQ451', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (126, N'PROD_YEARLY_DTSRQ127', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (127, N'PROD_YEARLY_DTSRQ321', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (128, N'PROD_YEARLY_DTSRQ455', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (129, N'PROD_YEARLY_DTSRQ500', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (130, N'PROD_YEARLY_DTSRQ517', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (131, N'PROD_YEARLY_DTSRQ518', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (132, N'PROD_YEARLY_DTSRQ616', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (133, N'PROD_YEARLY_DTSRQ701', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (134, N'PROD_YEARLY_DTSRQ702', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (135, N'PROD_YEARLY_DTSRQ704', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (136, N'PROD_YEARLY_DTSRQ910', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +GO +SET IDENTITY_INSERT [dbo].[JobControl] OFF +GO \ No newline at end of file diff --git a/SqlAgent/v2/03_Prod/1_Database_Setup/InsertJobDependencies.sql b/SqlAgent/v2/03_Prod/1_Database_Setup/InsertJobDependencies.sql new file mode 100644 index 0000000..dcb04d0 --- /dev/null +++ b/SqlAgent/v2/03_Prod/1_Database_Setup/InsertJobDependencies.sql @@ -0,0 +1,92 @@ +USE [ProdDUTASJobSchedule] +GO +SET IDENTITY_INSERT [dbo].[JobDependencies] ON +GO +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (1, N'PROD_DAILY_DTSGSID0', N'PROD_DAILY_DTSBX305') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (2, N'PROD_DAILY_GSIRQ300', N'PROD_DAILY_DTSBX305') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (3, N'PROD_DAILY_DTSRQ202', N'PROD_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (4, N'PROD_DAILY_DTSGSID1', N'PROD_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (5, N'PROD_DAILY_DTSBX202', N'PROD_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (6, N'PROD_DAILY_DTSFT202', N'PROD_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (7, N'PROD_DAILY_DTSBX432', N'PROD_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (8, N'PROD_DAILY_DTSGACHD', N'PROD_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (9, N'PROD_DAILY_DTSBX303', N'PROD_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (10, N'PROD_DAILY_DTSGWAGE', N'PROD_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (11, N'PROD_DAILY_DTSGCHKS', N'PROD_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (12, N'PROD_DAILY_DTSESDAY', N'PROD_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (13, N'PROD_DAILY_DTSGPAYT', N'PROD_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (14, N'PROD_DAILY_DTSDX145', N'PROD_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (15, N'PROD_DAILY_DTSBX629', N'PROD_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (16, N'PROD_DAILY_DTSBX630', N'PROD_DAILY_DTSBX629') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (17, N'PROD_DAILY_DTSFRAUD', N'PROD_DAILY_DTSBX629') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (18, N'PROD_DAILY_DTSRACHD', N'PROD_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (19, N'PROD_DAILY_DTSBXACH', N'PROD_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (20, N'PROD_DAILY_DTSBXREG', N'PROD_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (21, N'PROD_DAILY_DTSBX430', N'PROD_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (22, N'PROD_DAILY_DTSBX626', N'PROD_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (23, N'PROD_DAILY_DTSBX530', N'PROD_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (24, N'PROD_DAILY_DTSBXREL', N'PROD_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (25, N'PROD_DAILY_DTSBX450', N'PROD_DAILY_DTSBXACH') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (26, N'PROD_DAILY_DTSBX450', N'PROD_DAILY_DTSBXREG') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (27, N'PROD_DAILY_DTSBX450', N'PROD_DAILY_DTSBX430') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (28, N'PROD_DAILY_DTSBX450', N'PROD_DAILY_DTSBX626') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (29, N'PROD_DAILY_DTSBX450', N'PROD_DAILY_DTSBX530') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (30, N'PROD_DAILY_DTSBX450', N'PROD_DAILY_DTSBXREL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (31, N'PROD_DAILY_DTSBX451', N'PROD_DAILY_DTSBXACH') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (32, N'PROD_DAILY_DTSBX451', N'PROD_DAILY_DTSBXREG') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (33, N'PROD_DAILY_DTSBX451', N'PROD_DAILY_DTSBX430') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (34, N'PROD_DAILY_DTSBX451', N'PROD_DAILY_DTSBX626') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (35, N'PROD_DAILY_DTSBX451', N'PROD_DAILY_DTSBX530') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (36, N'PROD_DAILY_DTSBX451', N'PROD_DAILY_DTSBXREL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (37, N'PROD_DAILY_DTSPACHD', N'PROD_DAILY_DTSBX450') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (38, N'PROD_DAILY_DTSPACHD', N'PROD_DAILY_DTSBX451') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (39, N'PROD_DAILY_DTSPX148', N'PROD_DAILY_DTSPACHD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (40, N'PROD_DAILY_DTSRQ325', N'PROD_DAILY_DTSPACHD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (41, N'PROD_DAILY_DTSBX427', N'PROD_DAILY_DTSPX148') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (42, N'PROD_DAILY_DTSBX427', N'PROD_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (43, N'PROD_DAILY_DTSPDAY1', N'PROD_DAILY_DTSBX427') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (44, N'PROD_DAILY_DTSW4WGE', N'PROD_DAILY_DTSPDAY1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (45, N'PROD_DAILY_DTSGSID2', N'PROD_DAILY_DTSPDAY1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (46, N'PROD_DAILY_DTSGSID9', N'PROD_DAILY_DTSPDAY1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (47, N'PROD_DAILY_DTSMIN01', N'PROD_DAILY_DTSW4WGE') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (48, N'PROD_DAILY_DTSMIN01', N'PROD_DAILY_DTSGSID2') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (49, N'PROD_DAILY_DTSMIN01', N'PROD_DAILY_DTSGSID9') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (50, N'PROD_DAILY_DTSMIN02', N'PROD_DAILY_DTSW4WGE') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (51, N'PROD_DAILY_DTSMIN02', N'PROD_DAILY_DTSGSID2') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (52, N'PROD_DAILY_DTSMIN02', N'PROD_DAILY_DTSGSID9') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (53, N'PROD_DAILY_DTSRQ459', N'PROD_DAILY_DTSMIN01') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (54, N'PROD_DAILY_DTSRQ459', N'PROD_DAILY_DTSMIN02') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (55, N'PROD_DAILY_DTSBXPFL', N'PROD_DAILY_DTSRQ459') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (56, N'PROD_DAILY_DESBD427', N'PROD_DAILY_DTSBXPFL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (57, N'PROD_DAILY_DTSBX403', N'PROD_DAILY_DTSBXPFL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (58, N'PROD_DAILY_DTSBE405', N'PROD_DAILY_DTSBXPFL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (59, N'PROD_DAILY_DTSBX405', N'PROD_DAILY_DTSBXPFL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (60, N'PROD_DAILY_DTSRQ335', N'PROD_DAILY_DTSBXPFL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (61, N'PROD_DAILY_DTSBX601', N'PROD_DAILY_DTSRQ335') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (62, N'PROD_WEEKLY_DTSBXREJ', N'PROD_DAILY_DTSBXREL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (63, N'PROD_WEEKLY_DTSBX122', N'PROD_WEEKLY_DTSPDAY7') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (64, N'PROD_WEEKLY_DTSRQ511', N'PROD_WEEKLY_DTSPDAY7') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (65, N'PROD_MONTHLY_DTSRQ414', N'PROD_DAILY_DTSPDAY1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (66, N'PROD_MONTHLY_DTSCHGVB', N'PROD_MONTHLY_DTSPMON1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (67, N'PROD_MONTHLY_DTSCHGVR', N'PROD_MONTHLY_DTSCHGVB') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (68, N'PROD_MONTHLY_DTSVBKUP', N'PROD_MONTHLY_DTSPMON1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (69, N'PROD_MONTHLY_DTSVRSTR', N'PROD_MONTHLY_DTSVBKUP') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (70, N'PROD_MONTHLY_DTSRQ442', N'PROD_MONTHLY_DTSRQ513') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (71, N'PROD_QUARTERLY_DTSRQ119', N'PROD_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (72, N'PROD_QUARTERLY_DTSRQ417', N'PROD_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (73, N'PROD_QUARTERLY_DTSRQ320', N'PROD_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (74, N'PROD_QUARTERLY_DTSRQ793', N'PROD_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (75, N'PROD_QUARTERLY_DTSCHGQ1', N'PROD_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (76, N'PROD_QUARTERLY_DTSRQ327', N'PROD_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (77, N'PROD_QUARTERLY_DTSRQ412', N'PROD_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (78, N'PROD_QUARTERLY_DTSRQ591', N'PROD_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (79, N'PROD_QUARTERLY_DTSRQ902', N'PROD_DAILY_DTSPDAY1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (80, N'PROD_QUARTERLY_DTSCHGQ2', N'PROD_DAILY_DTSPDAY1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (81, N'PROD_QUARTERLY_DTSCHGRT', N'PROD_QUARTERLY_DTSRQ591') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (82, N'PROD_QUARTERLY_DTSRQ328', N'PROD_QUARTERLY_DTSRQ327') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (83, N'PROD_QUARTERLY_DTSBX500', N'PROD_QUARTERLY_DTSRQ417') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (84, N'PROD_QUARTERLY_DTSRQ713', N'PROD_MONTHLY_DTSPMON1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (85, N'PROD_QUARTERLY_DTSCHRGS', N'PROD_QUARTERLY_DTSCHGRT') +GO +SET IDENTITY_INSERT [dbo].[JobDependencies] OFF +GO diff --git a/SqlAgent/v2/03_Prod/2_Functions/fn_GetNextWorkday.sql b/SqlAgent/v2/03_Prod/2_Functions/fn_GetNextWorkday.sql new file mode 100644 index 0000000..2022e41 --- /dev/null +++ b/SqlAgent/v2/03_Prod/2_Functions/fn_GetNextWorkday.sql @@ -0,0 +1,17 @@ +USE ProdDUTASJobSchedule; +GO +-- Returns the next valid workday on or after the given date +CREATE OR ALTER FUNCTION dbo.fn_GetNextWorkday (@InputDate DATE) +RETURNS DATE +AS +BEGIN + DECLARE @Workday DATE = @InputDate; + + WHILE DATENAME(WEEKDAY, @Workday) IN ('Saturday','Sunday') + OR EXISTS (SELECT 1 FROM dbo.FederalHolidays WHERE HolidayDate = @Workday) + BEGIN + SET @Workday = DATEADD(DAY, 1, @Workday); + END + + RETURN @Workday; +END; diff --git a/SqlAgent/v2/03_Prod/2_Functions/fn_GetPreviousWorkday.sql b/SqlAgent/v2/03_Prod/2_Functions/fn_GetPreviousWorkday.sql new file mode 100644 index 0000000..970562d --- /dev/null +++ b/SqlAgent/v2/03_Prod/2_Functions/fn_GetPreviousWorkday.sql @@ -0,0 +1,17 @@ +USE ProdDUTASJobSchedule; +GO +-- Returns the most recent valid workday before or equal to the given date +CREATE OR ALTER FUNCTION dbo.fn_GetPreviousWorkday (@InputDate DATE) +RETURNS DATE +AS +BEGIN + DECLARE @Workday DATE = @InputDate; + + WHILE DATENAME(WEEKDAY, @Workday) IN ('Saturday','Sunday') + OR EXISTS (SELECT 1 FROM dbo.FederalHolidays WHERE HolidayDate = @Workday) + BEGIN + SET @Workday = DATEADD(DAY, -1, @Workday); + END + + RETURN @Workday; +END; diff --git a/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_CheckJobConditions.sql b/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_CheckJobConditions.sql new file mode 100644 index 0000000..60e8414 Binary files /dev/null and b/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_CheckJobConditions.sql differ diff --git a/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_CheckJobConditions_Generic.sql b/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_CheckJobConditions_Generic.sql new file mode 100644 index 0000000..c0ef0d1 Binary files /dev/null and b/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_CheckJobConditions_Generic.sql differ diff --git a/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_CreateDailyJobSchedule.sql b/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_CreateDailyJobSchedule.sql new file mode 100644 index 0000000..c2cd1ea --- /dev/null +++ b/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_CreateDailyJobSchedule.sql @@ -0,0 +1,98 @@ +USE msdb; +GO + +CREATE OR ALTER PROCEDURE dbo.usp_CreateDailyJobSchedule + @Env VARCHAR(10) = 'DEVL' -- Added parameter with default value +AS +BEGIN + SET NOCOUNT ON; + + DECLARE + @JobID INT, + @JobName SYSNAME, + @ScheduledStartTime TIME(0), + @Frequency NVARCHAR(20), + @FrequencyPattern NVARCHAR(MAX), + @ScheduleName SYSNAME, + @StartTimeInt INT, + @FreqInterval INT, + @TimeString VARCHAR(8), + @ActiveStartDate INT, + @dbName SYSNAME; -- Added variable for database name + + -- Determine database name based on environment + SET @dbName = CASE @Env + WHEN 'DEVL' THEN 'DevlDUTASJobSchedule' + WHEN 'TEST' THEN 'TestDUTASJobSchedule' + WHEN 'PROD' THEN 'ProdDUTASJobSchedule' + END; + + -- Prepare active start date as INT (YYYYMMDD) + SET @ActiveStartDate = CONVERT(INT, CONVERT(CHAR(8), GETDATE(), 112)); + + -- Dynamic SQL to fetch jobs from the appropriate database + DECLARE @Sql NVARCHAR(MAX); + SET @Sql = N' + DECLARE job_cursor CURSOR FOR + SELECT JobID, JobName, ScheduledStartTime, Frequency, FrequencyPattern + FROM ' + QUOTENAME(@dbName) + N'.dbo.JobControl + WHERE UPPER(Frequency) = ''DAILY'' + AND IsActive = 1;'; + + -- Execute dynamic SQL to declare cursor + EXEC sp_executesql @Sql; + + OPEN job_cursor; + FETCH NEXT FROM job_cursor INTO @JobID, @JobName, @ScheduledStartTime, @Frequency, @FrequencyPattern; + + WHILE @@FETCH_STATUS = 0 + BEGIN + -- Step 1: Convert ScheduledStartTime (TIME) to HH:MM:SS string + SET @TimeString = CONVERT(VARCHAR(8), @ScheduledStartTime, 108); + + -- Step 2: Remove colons and convert to INT (HHMMSS) + SET @StartTimeInt = CONVERT(INT, REPLACE(@TimeString, ':', '')); + + -- Step 3: Prepare schedule name + SET @ScheduleName = CONCAT(@JobName, '_DailySchedule'); + + -- Step 4: Fixed freq_interval for Monday to Friday + SET @FreqInterval = 62; -- Mon(2)+Tue(4)+Wed(8)+Thu(16)+Fri(32) = 62 + + -- Step 5: Delete existing schedule if it exists (idempotency) + IF EXISTS ( + SELECT 1 + FROM msdb.dbo.sysschedules s + JOIN msdb.dbo.sysjobschedules js ON s.schedule_id = js.schedule_id + JOIN msdb.dbo.sysjobs j ON j.job_id = js.job_id + WHERE j.name = @JobName AND s.name = @ScheduleName + ) + BEGIN + EXEC msdb.dbo.sp_delete_schedule @schedule_name = @ScheduleName; + END + + -- Step 6: Create weekly schedule (Monday to Friday) running once per day + EXEC msdb.dbo.sp_add_schedule + @schedule_name = @ScheduleName, + @enabled = 1, + @freq_type = 8, -- weekly + @freq_interval = @FreqInterval, + @freq_recurrence_factor = 1, -- every week + @active_start_time = @StartTimeInt, + @active_start_date = @ActiveStartDate; + + -- Step 7: Attach schedule to job + EXEC msdb.dbo.sp_attach_schedule + @job_name = @JobName, + @schedule_name = @ScheduleName; + + -- Fetch next job + FETCH NEXT FROM job_cursor INTO @JobID, @JobName, @ScheduledStartTime, @Frequency, @FrequencyPattern; + END + + CLOSE job_cursor; + DEALLOCATE job_cursor; + + PRINT 'Daily job schedules (Monday to Friday) created successfully for ' + @dbName; +END; +GO \ No newline at end of file diff --git a/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_CreateSQLAgentJob.sql b/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_CreateSQLAgentJob.sql new file mode 100644 index 0000000..cfba9e9 Binary files /dev/null and b/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_CreateSQLAgentJob.sql differ diff --git a/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_CreateWeeklySchedules.sql b/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_CreateWeeklySchedules.sql new file mode 100644 index 0000000..2021821 --- /dev/null +++ b/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_CreateWeeklySchedules.sql @@ -0,0 +1,223 @@ +USE [msdb]; +GO + +CREATE OR ALTER PROCEDURE dbo.usp_CreateWeeklySchedules + @Env VARCHAR(10) = 'DEVL' -- Added parameter with default value +AS +BEGIN + SET NOCOUNT ON; + + DECLARE + @JobName SYSNAME, + @FrequencyPattern NVARCHAR(MAX), + @StartTime VARCHAR(50), + @ScheduleName SYSNAME, + @StartTimeInt INT, + @FreqInterval INT, + @ActiveDate INT, + @computedFreq INT, + @dbName SYSNAME; -- Added variable for database name + + -- Determine database name based on environment + SET @dbName = CASE @Env + WHEN 'DEVL' THEN 'DevlDUTASJobSchedule' + WHEN 'TEST' THEN 'TestDUTASJobSchedule' + WHEN 'PROD' THEN 'ProdDUTASJobSchedule' + END; + + SET @ActiveDate = CONVERT(INT, CONVERT(CHAR(8), GETDATE(), 112)); + + -------------------------------------------------------------------------- + -- Dynamic SQL for cursor to fetch active weekly jobs from appropriate database + -------------------------------------------------------------------------- + DECLARE @Sql NVARCHAR(MAX); + SET @Sql = N' + DECLARE job_cursor CURSOR FAST_FORWARD FOR + SELECT + JobName, + FrequencyPattern, + ScheduledStartTime + FROM ' + QUOTENAME(@dbName) + N'.dbo.JobControl + WHERE UPPER(Frequency) = ''WEEKLY'' + AND IsActive = 1;'; + + -- Execute dynamic SQL to declare cursor + EXEC sp_executesql @Sql; + + OPEN job_cursor; + FETCH NEXT FROM job_cursor INTO @JobName, @FrequencyPattern, @StartTime; + + WHILE @@FETCH_STATUS = 0 + BEGIN + BEGIN TRY + ------------------------------------------------------------------ + -- Reset per-job variables + ------------------------------------------------------------------ + SET @FreqInterval = 0; + SET @computedFreq = 0; + SET @StartTimeInt = NULL; + SET @ScheduleName = NULL; + + ------------------------------------------------------------------ + -- Correctly format the start time (HHMMSS without extra zeros) + ------------------------------------------------------------------ + SET @StartTime = LTRIM(RTRIM(ISNULL(@StartTime, '00:00:00'))); + + -- Parse time and convert to HHMMSS integer + DECLARE @TimeParts TABLE (part NVARCHAR(10), idx INT); + INSERT INTO @TimeParts (part, idx) + SELECT value, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 + FROM STRING_SPLIT(LEFT(@StartTime, 8), ':'); + + DECLARE @Hours INT, @Minutes INT, @Seconds INT; + + SELECT @Hours = CAST(part AS INT) FROM @TimeParts WHERE idx = 0; + SELECT @Minutes = CAST(part AS INT) FROM @TimeParts WHERE idx = 1; + SELECT @Seconds = CAST(part AS INT) FROM @TimeParts WHERE idx = 2; + + -- Ensure valid time ranges + SET @Hours = ISNULL(@Hours, 0); + SET @Minutes = ISNULL(@Minutes, 0); + SET @Seconds = ISNULL(@Seconds, 0); + + IF @Hours < 0 OR @Hours > 23 SET @Hours = 0; + IF @Minutes < 0 OR @Minutes > 59 SET @Minutes = 0; + IF @Seconds < 0 OR @Seconds > 59 SET @Seconds = 0; + + SET @StartTimeInt = (@Hours * 10000) + (@Minutes * 100) + @Seconds; + + SET @ScheduleName = CONCAT(@JobName, '_WeeklySchedule'); + + ------------------------------------------------------------------ + -- Parse JSON days using a local temporary table + ------------------------------------------------------------------ + CREATE TABLE #Days (DayName NVARCHAR(10)); + + INSERT INTO #Days (DayName) + SELECT TRIM(value) + FROM OPENJSON(ISNULL(@FrequencyPattern, '{}'), '$.Days'); + + ------------------------------------------------------------------ + -- Compute bitmask correctly (values should be 1-127) + ------------------------------------------------------------------ + SELECT @computedFreq = ISNULL(SUM( + CASE UPPER(DayName) + WHEN 'SUN' THEN 1 + WHEN 'MON' THEN 2 + WHEN 'TUE' THEN 4 + WHEN 'WED' THEN 8 + WHEN 'THU' THEN 16 + WHEN 'FRI' THEN 32 + WHEN 'SAT' THEN 64 + ELSE 0 + END + ), 0) + FROM #Days; + + DROP TABLE #Days; -- Explicitly drop the temp table + + SET @FreqInterval = ISNULL(@computedFreq, 0); + + ------------------------------------------------------------------ + -- Validate freq_interval (must be 1..127) + ------------------------------------------------------------------ + IF @FreqInterval < 1 OR @FreqInterval > 127 + BEGIN + PRINT 'Warning: Weekly job ' + @JobName + + ' has invalid freq_interval (' + ISNULL(CAST(@FreqInterval AS VARCHAR(10)), 'NULL') + + '). Days found: ' + ISNULL(@FrequencyPattern, 'None') + '. Skipping.'; + FETCH NEXT FROM job_cursor INTO @JobName, @FrequencyPattern, @StartTime; + CONTINUE; + END + + ------------------------------------------------------------------ + -- Debug output to verify calculations + ------------------------------------------------------------------ + PRINT 'Job: ' + @JobName + + ', Days: ' + @FrequencyPattern + + ', FreqInterval: ' + CAST(@FreqInterval AS VARCHAR(3)) + + ', StartTime: ' + CAST(@StartTimeInt AS VARCHAR(6)); + + ------------------------------------------------------------------ + -- Safely detach and delete any existing schedule with this name + -- Use TRY/CATCH for schedule operations since non-existence is expected + ------------------------------------------------------------------ + BEGIN TRY + DECLARE @schedule_id INT; + DECLARE @attach_count INT; + + -- Check if schedule exists and get its ID + SELECT @schedule_id = s.schedule_id + FROM msdb.dbo.sysschedules s + JOIN msdb.dbo.sysjobschedules js ON s.schedule_id = js.schedule_id + JOIN msdb.dbo.sysjobs j ON j.job_id = js.job_id + WHERE j.name = @JobName AND s.name = @ScheduleName; + + IF @schedule_id IS NOT NULL + BEGIN + -- Detach from this job (if attached) + EXEC msdb.dbo.sp_detach_schedule + @job_name = @JobName, + @schedule_name = @ScheduleName; + + -- Check if schedule still attached to other jobs + SELECT @attach_count = COUNT(*) + FROM msdb.dbo.sysjobschedules js + WHERE js.schedule_id = @schedule_id; + + IF @attach_count = 0 + BEGIN + EXEC msdb.dbo.sp_delete_schedule + @schedule_name = @ScheduleName; + PRINT 'Existing schedule deleted: ' + @ScheduleName; + END + ELSE + BEGIN + PRINT 'Notice: schedule ' + @ScheduleName + ' could not be deleted because it is still attached to other jobs.'; + END + END + END TRY + BEGIN CATCH + -- Schedule operations might fail if schedule doesn't exist, which is fine + PRINT 'Notice: ' + ERROR_MESSAGE() + ' - proceeding with new schedule creation.'; + END CATCH + + ------------------------------------------------------------------ + -- Create the unified weekly schedule with subday config + ------------------------------------------------------------------ + EXEC msdb.dbo.sp_add_schedule + @schedule_name = @ScheduleName, + @enabled = 1, + @freq_type = 8, -- Weekly + @freq_interval = @FreqInterval, -- Bitmask of weekdays + @freq_recurrence_factor = 1, -- Every week + @freq_subday_type = 1, -- Once per day + @freq_subday_interval = 1, + @active_start_time = @StartTimeInt, + @active_start_date = @ActiveDate; + + ------------------------------------------------------------------ + -- Attach the schedule to the job + ------------------------------------------------------------------ + EXEC msdb.dbo.sp_attach_schedule + @job_name = @JobName, + @schedule_name = @ScheduleName; + + PRINT 'Weekly schedule created for job: ' + @JobName + + ' (Days=' + CAST(@FreqInterval AS VARCHAR(10)) + + ', Time=' + RIGHT('000000' + CAST(@StartTimeInt AS VARCHAR(6)), 6) + ')'; + + END TRY + BEGIN CATCH + PRINT 'Error scheduling job ' + ISNULL(@JobName, 'Unknown') + ': ' + ERROR_MESSAGE(); + END CATCH; + + FETCH NEXT FROM job_cursor INTO @JobName, @FrequencyPattern, @StartTime; + END + + CLOSE job_cursor; + DEALLOCATE job_cursor; + + PRINT 'All weekly job schedules processed for ' + @dbName; +END; +GO \ No newline at end of file diff --git a/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_ForceComplete.sql b/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_ForceComplete.sql new file mode 100644 index 0000000..cbd4142 Binary files /dev/null and b/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_ForceComplete.sql differ diff --git a/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_GenerateJobSchedule.sql b/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_GenerateJobSchedule.sql new file mode 100644 index 0000000..b15cd55 --- /dev/null +++ b/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_GenerateJobSchedule.sql @@ -0,0 +1,261 @@ +USE [ProdDUTASJobSchedule]; +GO + +CREATE OR ALTER PROCEDURE dbo.usp_GenerateJobSchedule + @Year INT +AS +BEGIN + SET NOCOUNT ON; + + ------------------------------------------------------------------------- + -- 1. Cleanup existing schedule data for this year + ------------------------------------------------------------------------- + DELETE FROM dbo.JobSchedule WHERE YearOfSchedule = @Year; + + ------------------------------------------------------------------------- + -- 2. Variable declarations + ------------------------------------------------------------------------- + DECLARE + @JobName VARCHAR(100), + @Frequency VARCHAR(20), + @Pattern NVARCHAR(2000), + @ScheduledTime TIME, + @RuleName NVARCHAR(100), + @Month INT, + @BaseDate DATE, + @ScheduledDate DATE, + @AdjustedDate DATE, + @FailSafeDate DATE = '9999-12-31'; + + ------------------------------------------------------------------------- + -- 3. Temporary table to process jobs more efficiently + ------------------------------------------------------------------------- + CREATE TABLE #JobProcessing ( + JobName VARCHAR(100), + Frequency VARCHAR(20), + Pattern NVARCHAR(2000), + ScheduledTime TIME, + RuleName NVARCHAR(100), + MonthsJSON NVARCHAR(MAX), + DayNum INT, + HasExplicitSchedule BIT + ); + + -- Populate temporary table with parsed JSON data + INSERT INTO #JobProcessing (JobName, Frequency, Pattern, ScheduledTime, RuleName, MonthsJSON, DayNum, HasExplicitSchedule) + SELECT + jc.JobName, + jc.Frequency, + jc.FrequencyPattern, + jc.ScheduledStartTime, + JSON_VALUE(jc.FrequencyPattern, '$.Rule'), + JSON_QUERY(jc.FrequencyPattern, '$.Months'), + JSON_VALUE(jc.FrequencyPattern, '$.Day'), + CASE WHEN JSON_QUERY(jc.FrequencyPattern, '$.Schedule') IS NOT NULL THEN 1 ELSE 0 END + FROM dbo.JobControl jc + WHERE UPPER(jc.Frequency) IN ('MONTHLY','QUARTERLY') + AND jc.IsActive = 1; + + ------------------------------------------------------------------------- + -- 4. Process MONTHLY jobs + ------------------------------------------------------------------------- + INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy) + SELECT + jp.JobName, + jp.Frequency, + jp.Pattern, + CASE + WHEN jp.RuleName = 'FirstWorkday' THEN dbo.fn_GetNextWorkday(DATEFROMPARTS(@Year, m.MonthNum, 1)) + WHEN jp.RuleName = 'LastWorkday' THEN dbo.fn_GetPreviousWorkday(EOMONTH(DATEFROMPARTS(@Year, m.MonthNum, 1))) + ELSE @FailSafeDate + END AS ScheduledDate, + CASE + WHEN jp.RuleName = 'FirstWorkday' THEN dbo.fn_GetNextWorkday(DATEFROMPARTS(@Year, m.MonthNum, 1)) + WHEN jp.RuleName = 'LastWorkday' THEN dbo.fn_GetPreviousWorkday(EOMONTH(DATEFROMPARTS(@Year, m.MonthNum, 1))) + ELSE @FailSafeDate + END AS AdjustedRunDate, + FORMAT(DATEFROMPARTS(@Year, m.MonthNum, 1), 'yyyy-MM'), + @Year, + GETDATE(), + SYSTEM_USER + FROM #JobProcessing jp + CROSS JOIN (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) m(MonthNum) + WHERE jp.Frequency = 'MONTHLY' + AND jp.RuleName IN ('FirstWorkday', 'LastWorkday'); + + -- Handle monthly jobs with unknown rules + INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy) + SELECT + jp.JobName, + jp.Frequency, + jp.Pattern, + @FailSafeDate, + @FailSafeDate, + FORMAT(DATEFROMPARTS(@Year, m.MonthNum, 1), 'yyyy-MM'), + @Year, + GETDATE(), + SYSTEM_USER + FROM #JobProcessing jp + CROSS JOIN (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) m(MonthNum) + WHERE jp.Frequency = 'MONTHLY' + AND jp.RuleName NOT IN ('FirstWorkday', 'LastWorkday'); + + ------------------------------------------------------------------------- + -- 5. Process QUARTERLY jobs - FirstWorkdayOfQuarter + ------------------------------------------------------------------------- + INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy) + SELECT + jp.JobName, + jp.Frequency, + jp.Pattern, + dbo.fn_GetNextWorkday(DATEFROMPARTS(@Year, q.StartMonth, 1)), + dbo.fn_GetNextWorkday(DATEFROMPARTS(@Year, q.StartMonth, 1)), + FORMAT(DATEFROMPARTS(@Year, q.StartMonth, 1), 'yyyy-MM'), + @Year, + GETDATE(), + SYSTEM_USER + FROM #JobProcessing jp + CROSS JOIN (VALUES (1),(4),(7),(10)) q(StartMonth) + WHERE jp.Frequency = 'QUARTERLY' + AND jp.RuleName = 'FirstWorkdayOfQuarter'; + + ------------------------------------------------------------------------- + -- 6. Process QUARTERLY jobs - Months array with Day number + ------------------------------------------------------------------------- + ;WITH QuarterlyMonths AS ( + SELECT + jp.JobName, + jp.Frequency, + jp.Pattern, + CAST(m.[value] AS INT) AS MonthNum, + jp.DayNum + FROM #JobProcessing jp + CROSS APPLY OPENJSON(jp.MonthsJSON) m + WHERE jp.Frequency = 'QUARTERLY' + AND jp.MonthsJSON IS NOT NULL + AND jp.DayNum IS NOT NULL + AND jp.RuleName IS NULL + AND jp.HasExplicitSchedule = 0 + ), + QuarterlyDates AS ( + SELECT + qm.JobName, + qm.Frequency, + qm.Pattern, + qm.MonthNum, + qm.DayNum, + CASE + WHEN qm.DayNum <= DAY(EOMONTH(DATEFROMPARTS(@Year, qm.MonthNum, 1))) + THEN DATEFROMPARTS(@Year, qm.MonthNum, qm.DayNum) + ELSE EOMONTH(DATEFROMPARTS(@Year, qm.MonthNum, 1)) + END AS BaseDate + FROM QuarterlyMonths qm + ) + INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy) + SELECT + qd.JobName, + qd.Frequency, + qd.Pattern, + qd.BaseDate, + CASE + WHEN DATENAME(WEEKDAY, qd.BaseDate) IN ('Saturday','Sunday') + OR EXISTS (SELECT 1 FROM dbo.FederalHolidays WHERE HolidayDate = qd.BaseDate) + THEN dbo.fn_GetPreviousWorkday(qd.BaseDate) + ELSE qd.BaseDate + END AS AdjustedRunDate, + FORMAT(qd.BaseDate, 'yyyy-MM'), + @Year, + GETDATE(), + SYSTEM_USER + FROM QuarterlyDates qd; + + ------------------------------------------------------------------------- + -- 7. Process QUARTERLY jobs - Explicit Schedule array + ------------------------------------------------------------------------- + ;WITH ExplicitSchedules AS ( + SELECT + jp.JobName, + jp.Frequency, + jp.Pattern, + s.[Month] AS MonthNum, + s.[Day] AS DayNum + FROM #JobProcessing jp + CROSS APPLY OPENJSON(jp.Pattern, '$.Schedule') + WITH ( + [Month] INT '$.Month', + [Day] INT '$.Day' + ) s + WHERE jp.Frequency = 'QUARTERLY' + AND jp.HasExplicitSchedule = 1 + ), + ExplicitScheduleDates AS ( + SELECT + es.JobName, + es.Frequency, + es.Pattern, + es.MonthNum, + es.DayNum, + CASE + WHEN es.DayNum <= DAY(EOMONTH(DATEFROMPARTS(@Year, es.MonthNum, 1))) + THEN DATEFROMPARTS(@Year, es.MonthNum, es.DayNum) + ELSE EOMONTH(DATEFROMPARTS(@Year, es.MonthNum, 1)) + END AS BaseDate + FROM ExplicitSchedules es + ) + INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy) + SELECT + esd.JobName, + esd.Frequency, + esd.Pattern, + esd.BaseDate, + CASE + WHEN DATENAME(WEEKDAY, esd.BaseDate) IN ('Saturday','Sunday') + OR EXISTS (SELECT 1 FROM dbo.FederalHolidays WHERE HolidayDate = esd.BaseDate) + THEN dbo.fn_GetPreviousWorkday(esd.BaseDate) + ELSE esd.BaseDate + END AS AdjustedRunDate, + FORMAT(esd.BaseDate, 'yyyy-MM'), + @Year, + GETDATE(), + SYSTEM_USER + FROM ExplicitScheduleDates esd; + + ------------------------------------------------------------------------- + -- 8. Handle any quarterly jobs that didn't match the patterns above + ------------------------------------------------------------------------- + INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy) + SELECT + jp.JobName, + jp.Frequency, + jp.Pattern, + @FailSafeDate, + @FailSafeDate, + FORMAT(DATEFROMPARTS(@Year, 1, 1), 'yyyy-MM'), + @Year, + GETDATE(), + SYSTEM_USER + FROM #JobProcessing jp + WHERE jp.Frequency = 'QUARTERLY' + AND NOT EXISTS ( + SELECT 1 FROM dbo.JobSchedule js + WHERE js.JobName = jp.JobName AND js.YearOfSchedule = @Year + ); + + ------------------------------------------------------------------------- + -- 9. Cleanup and output + ------------------------------------------------------------------------- + DROP TABLE #JobProcessing; + + -- Update any NULL dates to fail-safe date + UPDATE dbo.JobSchedule + SET ScheduledDate = @FailSafeDate, + AdjustedRunDate = @FailSafeDate + WHERE YearOfSchedule = @Year + AND (ScheduledDate IS NULL OR AdjustedRunDate IS NULL); + + DECLARE @RecordCount INT = (SELECT COUNT(*) FROM dbo.JobSchedule WHERE YearOfSchedule = @Year); + + PRINT 'Job schedule generation completed for year ' + CAST(@Year AS VARCHAR(4)) + + '. Total records created: ' + CAST(@RecordCount AS VARCHAR(10)); +END; +GO \ No newline at end of file diff --git a/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_ScheduleJob.sql b/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_ScheduleJob.sql new file mode 100644 index 0000000..f6c2ffa --- /dev/null +++ b/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_ScheduleJob.sql @@ -0,0 +1,160 @@ +USE [msdb] +GO + +/****** Object: StoredProcedure [dbo].[usp_ScheduleJob] Script Date: 10/18/2025 9:52:04 AM ******/ +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + +CREATE OR ALTER PROCEDURE [dbo].[usp_ScheduleJob] + @JobName NVARCHAR(100), + @Env CHAR(4), -- 'DEVL' | 'TEST' | 'PROD' + @RunDate DATE, + @RunTime TIME +AS +BEGIN + SET NOCOUNT ON; + + DECLARE + @JobId UNIQUEIDENTIFIER, + @ScheduleName NVARCHAR(200), + @dbName NVARCHAR(128), + @ActiveStartDate INT, + @ActiveStartTime INT, + @Sql NVARCHAR(MAX), + @JobExists BIT = 0, + @ScheduleId INT; + + -- Table variable must be declared separately and at the top level + DECLARE @ExistingSchedules TABLE ( + schedule_id INT, + schedule_name NVARCHAR(200) + ); + + -- Map environment to actual DB name + SET @dbName = CASE @Env + WHEN 'DEVL' THEN 'DevlDUTASJobSchedule' + WHEN 'TEST' THEN 'TestDUTASJobSchedule' + WHEN 'PROD' THEN 'ProdDUTASJobSchedule' + ELSE 'DevlDUTASJobSchedule' + END; + + -- Validate parameters + IF @Env NOT IN ('DEVL','TEST','PROD') + BEGIN + RAISERROR('Env must be one of: DEVL, TEST, PROD.', 16, 1); + RETURN; + END + + IF @RunDate < CAST(GETDATE() AS DATE) + BEGIN + RAISERROR('RunDate cannot be in the past.', 16, 1); + RETURN; + END; + + -- Check if job exists in JobControl table + SET @Sql = N'SELECT @JobExists = 1 FROM ' + QUOTENAME(@dbName) + '.dbo.JobControl WHERE JobName = @JobNameParam'; + + EXEC sp_executesql @Sql, + N'@JobNameParam NVARCHAR(100), @JobExists BIT OUTPUT', + @JobNameParam = @JobName, + @JobExists = @JobExists OUTPUT; + + IF @JobExists = 0 + BEGIN + RAISERROR('Job %s not found in JobControl table.', 16, 1, @JobName); + RETURN; + END; + + -- Activate job in control table + SET @Sql = N'UPDATE ' + QUOTENAME(@dbName) + '.dbo.JobControl SET IsActive = 1 WHERE JobName = @JobNameParam'; + EXEC sp_executesql @Sql, + N'@JobNameParam NVARCHAR(100)', + @JobNameParam = @JobName; + + PRINT 'Job activated in JobControl.'; + + -- Convert date/time to SQL Agent format + SET @ActiveStartDate = CONVERT(INT, CONVERT(CHAR(8), @RunDate, 112)); + SET @ActiveStartTime = DATEPART(HOUR, @RunTime) * 10000 + + DATEPART(MINUTE, @RunTime) * 100 + + DATEPART(SECOND, @RunTime); + + SET @ScheduleName = @JobName + '_MonthlySchedule'; + + -- Get job id + SELECT @JobId = job_id + FROM msdb.dbo.sysjobs + WHERE name = @JobName; + + IF @JobId IS NULL + BEGIN + RAISERROR('SQL Agent job "%s" not found.', 16, 1, @JobName); + RETURN; + END; + + BEGIN TRY + BEGIN TRANSACTION; + + -- Detach and delete all existing schedules for this job + INSERT INTO @ExistingSchedules (schedule_id, schedule_name) + SELECT s.schedule_id, s.name + FROM msdb.dbo.sysschedules AS s + INNER JOIN msdb.dbo.sysjobschedules AS js ON s.schedule_id = js.schedule_id + WHERE js.job_id = @JobId; + + DECLARE @OldScheduleId INT, @OldScheduleName NVARCHAR(200); + + DECLARE cur CURSOR LOCAL FAST_FORWARD FOR + SELECT schedule_id, schedule_name FROM @ExistingSchedules; + + OPEN cur; + FETCH NEXT FROM cur INTO @OldScheduleId, @OldScheduleName; + + WHILE @@FETCH_STATUS = 0 + BEGIN + PRINT 'Detaching old schedule: ' + @OldScheduleName; + EXEC msdb.dbo.sp_detach_schedule @job_id = @JobId, @schedule_name = @OldScheduleName; + + PRINT 'Deleting old schedule: ' + @OldScheduleName; + EXEC msdb.dbo.sp_delete_schedule @schedule_name = @OldScheduleName; + + FETCH NEXT FROM cur INTO @OldScheduleId, @OldScheduleName; + END + + CLOSE cur; + DEALLOCATE cur; + + -- Create new one-time schedule + EXEC msdb.dbo.sp_add_schedule + @schedule_name = @ScheduleName, + @enabled = 1, + @freq_type = 1, -- One-time + @active_start_date = @ActiveStartDate, + @active_start_time = @ActiveStartTime; + + -- Attach schedule to job + EXEC msdb.dbo.sp_attach_schedule + @job_id = @JobId, + @schedule_name = @ScheduleName; + + COMMIT TRANSACTION; + + PRINT 'New schedule created for job "' + @JobName + + '" on ' + CONVERT(VARCHAR(10), @RunDate, 120) + + ' at ' + CONVERT(VARCHAR(8), @RunTime, 108); + END TRY + BEGIN CATCH + IF @@TRANCOUNT > 0 + ROLLBACK TRANSACTION; + + DECLARE @ErrorMessage NVARCHAR(4000) = ERROR_MESSAGE(); + RAISERROR('Error creating schedule: %s', 16, 1, @ErrorMessage); + END CATCH; +END; +GO + + diff --git a/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_ScheduleJobsForMonth.sql b/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_ScheduleJobsForMonth.sql new file mode 100644 index 0000000..0fa2de9 --- /dev/null +++ b/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_ScheduleJobsForMonth.sql @@ -0,0 +1,39 @@ +USE ProdDUTASJobSchedule; +GO + +CREATE OR ALTER PROCEDURE dbo.usp_ScheduleJobsForMonth +AS +BEGIN + SET NOCOUNT ON; + + DECLARE @MonthKey CHAR(7) = FORMAT(GETDATE(), 'yyyy-MM'); + DECLARE @Year INT = YEAR(GETDATE()); + DECLARE @JobName VARCHAR(100); + DECLARE @RunDate DATE; + DECLARE @RunTime TIME; + DECLARE @Env VARCHAR(10) = 'PROD'; -- configurable per environment + + DECLARE job_cursor CURSOR FOR + SELECT js.JobName, js.AdjustedRunDate, jc.ScheduledStartTime + FROM dbo.JobSchedule js + INNER JOIN dbo.JobControl jc ON js.JobName = jc.JobName + WHERE js.MonthOfSchedule = @MonthKey + AND jc.IsActive = 1; + + OPEN job_cursor; + FETCH NEXT FROM job_cursor INTO @JobName, @RunDate, @RunTime; + + WHILE @@FETCH_STATUS = 0 + BEGIN + EXEC msdb.dbo.usp_ScheduleJob + @JobName = @JobName, + @Env = @Env, + @RunDate = @RunDate, + @RunTime = @RunTime; + + FETCH NEXT FROM job_cursor INTO @JobName, @RunDate, @RunTime; + END + + CLOSE job_cursor; + DEALLOCATE job_cursor; +END diff --git a/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_TriggerMissedJobs.sql b/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_TriggerMissedJobs.sql new file mode 100644 index 0000000..c5fd42f Binary files /dev/null and b/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_TriggerMissedJobs.sql differ diff --git a/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_UpdateJobStatus_Generic.sql b/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_UpdateJobStatus_Generic.sql new file mode 100644 index 0000000..20c3f41 Binary files /dev/null and b/SqlAgent/v2/03_Prod/3_Stored_Procedures/usp_UpdateJobStatus_Generic.sql differ diff --git a/SqlAgent/v2/03_Prod/4_Job_Maintenance/ActivateOnDemandJob.sql b/SqlAgent/v2/03_Prod/4_Job_Maintenance/ActivateOnDemandJob.sql new file mode 100644 index 0000000..f745ba3 --- /dev/null +++ b/SqlAgent/v2/03_Prod/4_Job_Maintenance/ActivateOnDemandJob.sql @@ -0,0 +1,10 @@ +USE msdb; +GO + +-- Schedule PROD OnDemand Job on 03 Nov at 18:15 PM +------------------------------------------------ +EXEC dbo.usp_ScheduleJob + @JobName='PROD_MONTHLY_DTSRQ414', + @Env='PROD', + @RunDate='2025-11-03', + @RunTime='18:15:00'; diff --git a/SqlAgent/v2/03_Prod/4_Job_Maintenance/AddAllJobsToSQLAgent.sql b/SqlAgent/v2/03_Prod/4_Job_Maintenance/AddAllJobsToSQLAgent.sql new file mode 100644 index 0000000..e7367cd --- /dev/null +++ b/SqlAgent/v2/03_Prod/4_Job_Maintenance/AddAllJobsToSQLAgent.sql @@ -0,0 +1,141 @@ +USE [msdb] +GO + +-- Execute the stored procedure for each job +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX215', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX305', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSGSID0', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_GSIRQ300', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSRQ202', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSGSID1', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX202', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSFT202', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX432', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSGACHD', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX303', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSGWAGE', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSGCHKS', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSESDAY', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSGPAYT', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSDX145', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX629', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX630', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSFRAUD', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSRACHD', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBXACH', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBXREG', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX430', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX626', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX530', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBXREL', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX450', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX451', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSPACHD', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSPX148', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSRQ325', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX427', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSPDAY1', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSW4WGE', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSGSID2', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSGSID9', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSMIN01', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSMIN02', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSRQ459', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBXPFL', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DESBD427', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX403', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBE405', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX405', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSRQ335', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX601', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_WEEKLY_DTSGSID0', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_WEEKLY_DTSGSID1', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_WEEKLY_DTSBX202', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_WEEKLY_DTSFT202', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_WEEKLY_DTSBX470', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_WEEKLY_DTSBXREJ', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_WEEKLY_DTSPDAY7', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_WEEKLY_DTSBX122', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_WEEKLY_DTSRQ511', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_WEEKLY_DTSRQ444', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_WEEKLY_DTSRQ126', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_MONTHLY_DTSRQ414', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_MONTHLY_DTSPMON1', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_MONTHLY_DTSCHGVB', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_MONTHLY_DTSCHGVR', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_MONTHLY_DTSVBKUP', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_MONTHLY_DTSVRSTR', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_MONTHLY_DTSRQ442', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_MONTHLY_DTSBX460', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_MONTHLY_DTSRQ513', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_MONTHLY_DTSCHGDC', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSRQ119', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSRQ902', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSBX500', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSRQ417', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSRQ320', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSRQ713', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSBX468', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSCHGQ1', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSCHGQ2', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSRQ327', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSRQ328', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSRQ412', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSRQ793', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSWGE06', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSCHGRT', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSCHRGS', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSRQ540', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSRQ591', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSRTCHG', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSWGE01', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DESBD426', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSACH01', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSBX415', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSBX452', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSBX453', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ120', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ123', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ125', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ305', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ306', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ308', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ311', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ410', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ411', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ423', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ426', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ429', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ439', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ602', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ606', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ607', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ609', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ611', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ612', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ717', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ718', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ720', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ721', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRT715', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRT716', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRT717', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRT718', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRT719', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRT720', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRT722', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRT723', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_YEARLY_DTSRQ722', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_YEARLY_DTSRQ451', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_YEARLY_DTSRQ127', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_YEARLY_DTSRQ321', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_YEARLY_DTSRQ455', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_YEARLY_DTSRQ500', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_YEARLY_DTSRQ517', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_YEARLY_DTSRQ518', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_YEARLY_DTSRQ616', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_YEARLY_DTSRQ701', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_YEARLY_DTSRQ702', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_YEARLY_DTSRQ704', @Env = 'PROD'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_YEARLY_DTSRQ910', @Env = 'PROD'; +GO \ No newline at end of file diff --git a/SqlAgent/v2/03_Prod/4_Job_Maintenance/AddDailyJobSchedule.sql b/SqlAgent/v2/03_Prod/4_Job_Maintenance/AddDailyJobSchedule.sql new file mode 100644 index 0000000..b740c61 --- /dev/null +++ b/SqlAgent/v2/03_Prod/4_Job_Maintenance/AddDailyJobSchedule.sql @@ -0,0 +1 @@ +EXEC msdb.dbo.usp_CreateDailyJobSchedule @Env = 'PROD'; \ No newline at end of file diff --git a/SqlAgent/v2/03_Prod/4_Job_Maintenance/AddNewJobToSQLAgent.sql b/SqlAgent/v2/03_Prod/4_Job_Maintenance/AddNewJobToSQLAgent.sql new file mode 100644 index 0000000..345b3b7 --- /dev/null +++ b/SqlAgent/v2/03_Prod/4_Job_Maintenance/AddNewJobToSQLAgent.sql @@ -0,0 +1,5 @@ +USE [msdb] +GO + +-- Create a job in SQL Agent (With Standard 3 steps approach) +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX215', @Env = 'PROD'; \ No newline at end of file diff --git a/SqlAgent/v2/03_Prod/4_Job_Maintenance/AddWeeklyJobSchedule.sql b/SqlAgent/v2/03_Prod/4_Job_Maintenance/AddWeeklyJobSchedule.sql new file mode 100644 index 0000000..9608202 --- /dev/null +++ b/SqlAgent/v2/03_Prod/4_Job_Maintenance/AddWeeklyJobSchedule.sql @@ -0,0 +1 @@ +EXEC msdb.dbo.usp_CreateWeeklySchedules @Env = 'PROD'; \ No newline at end of file diff --git a/SqlAgent/v2/03_Prod/4_Job_Maintenance/DailyJobScheduleLookup.sql b/SqlAgent/v2/03_Prod/4_Job_Maintenance/DailyJobScheduleLookup.sql new file mode 100644 index 0000000..b893457 --- /dev/null +++ b/SqlAgent/v2/03_Prod/4_Job_Maintenance/DailyJobScheduleLookup.sql @@ -0,0 +1,86 @@ +/******************************************************************************************** + Section 1: Daily Job Schedule Lookup + -------------------------------------------------------------------------------------------- + Description: + Returns all SQL Agent jobs scheduled to run on a given date, along with their control + status (IsActive) and configured runtime from JobControl. + + Parameters: + @CheckDate - The date to check job schedules for. + + Notes: + • Uses MSDB’s internal schedule definitions (sysschedules, sysjobschedules). + • Supports One-time, Daily, Weekly, and Monthly schedule types. + • Can easily be adapted for DEVL / TEST / PROD by changing @DbName. + +********************************************************************************************/ +USE msdb; +GO + +DECLARE @CheckDate DATE = CAST(GETDATE() AS DATE); -- Change if needed +DECLARE @CheckWeekday INT = DATEPART(WEEKDAY, @CheckDate); +DECLARE @Env SYSNAME = 'DEVL'; -- Change for TEST or PROD +DECLARE @DbName SYSNAME; + +-- Map environment to the right control DB +SET @DbName = CASE @Env + WHEN 'DEVL' THEN 'DevlDUTASJobSchedule' + WHEN 'TEST' THEN 'TestDUTASJobSchedule' + WHEN 'PROD' THEN 'ProdDUTASJobSchedule' + END; + +DECLARE @Sql NVARCHAR(MAX); +SET @Sql = N' +SELECT + j.name AS SQLAgentJobName, + jc.JobName AS ControlJobName, + jc.ScheduledStartTime, + jc.IsActive, + s.name AS ScheduleName, + s.freq_type, + s.freq_interval, + s.freq_subday_type, + s.freq_subday_interval, + s.active_start_date, + CASE s.freq_type + WHEN 1 THEN ''One-time'' + WHEN 4 THEN ''Daily'' + WHEN 8 THEN ''Weekly'' + WHEN 16 THEN ''Monthly'' + ELSE ''Other'' + END AS FrequencyType, + CASE + WHEN s.freq_type = 1 + AND s.active_start_date = CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112)) + THEN 1 + WHEN s.freq_type = 4 + AND s.active_start_date <= CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112)) + THEN 1 + WHEN s.freq_type = 8 -- Weekly + AND (POWER(2, @CheckWeekdayParam - 1) & s.freq_interval) > 0 + THEN 1 + WHEN s.freq_type = 16 -- Monthly + AND DAY(@CheckDateParam) = s.freq_interval + THEN 1 + ELSE 0 + END AS IsScheduledToday +FROM msdb.dbo.sysjobs j +JOIN msdb.dbo.sysjobschedules js ON j.job_id = js.job_id +JOIN msdb.dbo.sysschedules s ON js.schedule_id = s.schedule_id +LEFT JOIN ' + QUOTENAME(@DbName) + '.dbo.JobControl jc ON jc.JobName = j.name +WHERE jc.IsActive = 1 + AND ( + (s.freq_type = 1 AND s.active_start_date = CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112))) -- One-time + OR (s.freq_type = 4 AND s.active_start_date <= CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112))) -- Daily + OR (s.freq_type = 8 AND (POWER(2, @CheckWeekdayParam - 1) & s.freq_interval) > 0) -- Weekly + OR (s.freq_type = 16 AND DAY(@CheckDateParam) = s.freq_interval) -- Monthly + ) +ORDER BY jc.ScheduledStartTime; +'; + +EXEC sp_executesql + @Sql, + N'@CheckDateParam DATE, @CheckWeekdayParam INT', + @CheckDateParam = @CheckDate, + @CheckWeekdayParam = @CheckWeekday; +GO diff --git a/SqlAgent/v2/03_Prod/4_Job_Maintenance/DeactivateJob.sql b/SqlAgent/v2/03_Prod/4_Job_Maintenance/DeactivateJob.sql new file mode 100644 index 0000000..57c1e61 --- /dev/null +++ b/SqlAgent/v2/03_Prod/4_Job_Maintenance/DeactivateJob.sql @@ -0,0 +1,12 @@ +USE ProdDUTASJobSchedule; +GO + +UPDATE dbo.JobControl +SET IsActive = 0 +WHERE Frequency = 'MONTHLY'; +GO + +-- Optional: Verify changes +SELECT JobName, Frequency, IsActive +FROM dbo.JobControl +WHERE Frequency = 'MONTHLY'; diff --git a/SqlAgent/v2/03_Prod/4_Job_Maintenance/DeleteSchedule.sql b/SqlAgent/v2/03_Prod/4_Job_Maintenance/DeleteSchedule.sql new file mode 100644 index 0000000..77de122 --- /dev/null +++ b/SqlAgent/v2/03_Prod/4_Job_Maintenance/DeleteSchedule.sql @@ -0,0 +1,27 @@ +USE msdb; +GO + +DECLARE @EnvPrefix NVARCHAR(50) = N'PROD'; -- <<< Change this to your environment prefix +DECLARE @schedule_id INT; +DECLARE @schedule_name NVARCHAR(128); + +DECLARE Sched_Cursor CURSOR FOR +SELECT schedule_id, name +FROM msdb.dbo.sysschedules +WHERE name LIKE @EnvPrefix + '%'; -- Only schedules starting with the given prefix + +OPEN Sched_Cursor; +FETCH NEXT FROM Sched_Cursor INTO @schedule_id, @schedule_name; + +WHILE @@FETCH_STATUS = 0 +BEGIN + PRINT 'Deleting schedule: ' + @schedule_name; + EXEC msdb.dbo.sp_delete_schedule @schedule_id = @schedule_id; + FETCH NEXT FROM Sched_Cursor INTO @schedule_id, @schedule_name; +END + +CLOSE Sched_Cursor; +DEALLOCATE Sched_Cursor; + +PRINT 'All SQL Agent schedules starting with prefix ' + @EnvPrefix + ' deleted successfully.'; +GO diff --git a/SqlAgent/v2/03_Prod/4_Job_Maintenance/DetachDeleteScheduleByName.sql b/SqlAgent/v2/03_Prod/4_Job_Maintenance/DetachDeleteScheduleByName.sql new file mode 100644 index 0000000..c6ddedc --- /dev/null +++ b/SqlAgent/v2/03_Prod/4_Job_Maintenance/DetachDeleteScheduleByName.sql @@ -0,0 +1,13 @@ +-- If you know both the job name and schedule name +DECLARE @JobName NVARCHAR(100) = 'PROD_MONTHLY_DTSCHGDC'; +DECLARE @ScheduleName NVARCHAR(200) = 'PROD_MONTHLY_DTSCHGDC_MonthlySchedule'; +DECLARE @JobId UNIQUEIDENTIFIER; + +-- Get job ID +SELECT @JobId = job_id FROM msdb.dbo.sysjobs WHERE name = @JobName; + +-- Detach from specific job +EXEC msdb.dbo.sp_detach_schedule @job_id = @JobId, @schedule_name = @ScheduleName; + +-- Then delete +EXEC msdb.dbo.sp_delete_schedule @schedule_name = @ScheduleName; diff --git a/SqlAgent/v2/03_Prod/4_Job_Maintenance/ForceCompleteJob.sql b/SqlAgent/v2/03_Prod/4_Job_Maintenance/ForceCompleteJob.sql new file mode 100644 index 0000000..452037f --- /dev/null +++ b/SqlAgent/v2/03_Prod/4_Job_Maintenance/ForceCompleteJob.sql @@ -0,0 +1,16 @@ +USE ProdDUTASJobSchedule; +GO + +-- 1. Check today's job status +SELECT JobName, Status, ErrorMessage +FROM dbo.JobExecutionHistory +WHERE RunDate = CAST(GETDATE() AS DATE) +AND JobName = 'PROD_WEEKLY_DTSGSID1'; + +-- 2. Mark DTSBX305 as manually overridden +EXEC dbo.usp_ForceComplete 'PROD_WEEKLY_DTSGSID1', 'Neeraj.Kumar'; + +-- 3. Verify the override +SELECT JobName, Status, OverrideBy, OverrideDate +FROM dbo.JobExecutionHistory +WHERE JobName = 'PROD_WEEKLY_DTSGSID1' AND RunDate = CAST(GETDATE() AS DATE); \ No newline at end of file diff --git a/SqlAgent/v2/03_Prod/4_Job_Maintenance/GenerateJobScheduleTable.sql b/SqlAgent/v2/03_Prod/4_Job_Maintenance/GenerateJobScheduleTable.sql new file mode 100644 index 0000000..7a1224f --- /dev/null +++ b/SqlAgent/v2/03_Prod/4_Job_Maintenance/GenerateJobScheduleTable.sql @@ -0,0 +1,10 @@ +USE ProdDUTASJobSchedule; +GO + +-- Set Job Schedule for the Year 2025 +EXEC dbo.usp_GenerateJobSchedule @Year = 2025; +GO + +-- Set Job Schedule for the Year 2026 +EXEC dbo.usp_GenerateJobSchedule @Year = 2026; +GO \ No newline at end of file diff --git a/SqlAgent/v2/03_Prod/4_Job_Maintenance/JobInfo.sql b/SqlAgent/v2/03_Prod/4_Job_Maintenance/JobInfo.sql new file mode 100644 index 0000000..b4a0514 --- /dev/null +++ b/SqlAgent/v2/03_Prod/4_Job_Maintenance/JobInfo.sql @@ -0,0 +1,47 @@ +USE msdb; +GO + +PRINT '================================================================================'; +PRINT 'SECTION 1: JOB CONTROL INFORMATION'; +PRINT '================================================================================'; +GO + +-- View all active jobs +SELECT JobName, ScheduledStartTime, Frequency, IsActive +FROM ProdDUTASJobSchedule.dbo.JobControl +WHERE IsActive = 1 +ORDER BY Frequency, ScheduledStartTime; +GO + +-- View all inactive jobs +SELECT JobName, Frequency, ScheduledStartTime +FROM ProdDUTASJobSchedule.dbo.JobControl +WHERE IsActive = 0 +ORDER BY Frequency; +GO + +-- Find weekly/monthly jobs +SELECT JobName, Frequency, ScheduledStartTime +FROM ProdDUTASJobSchedule.dbo.JobControl +WHERE Frequency IN ('WEEKLY', 'MONTHLY') +ORDER BY Frequency, ScheduledStartTime; +GO + +PRINT '================================================================================'; +PRINT 'SECTION 2: JOB DEPENDENCIES'; +PRINT '================================================================================'; +GO + +-- Check dependencies for a job +DECLARE @Job NVARCHAR(100) = 'PROD_MONTHLY_DTSCHGVR'; +SELECT JobName, PredecessorJobName +FROM ProdDUTASJobSchedule.dbo.JobDependencies +WHERE JobName = @Job; +GO + +-- Show dependency chain overview +SELECT d.JobName, d.PredecessorJobName, jc.ScheduledStartTime, jc.Frequency +FROM ProdDUTASJobSchedule.dbo.JobDependencies d +JOIN ProdDUTASJobSchedule.dbo.JobControl jc ON d.JobName = jc.JobName +ORDER BY jc.Frequency, jc.ScheduledStartTime; +GO diff --git a/SqlAgent/v2/03_Prod/4_Job_Maintenance/SQLAgentInfo.sql b/SqlAgent/v2/03_Prod/4_Job_Maintenance/SQLAgentInfo.sql new file mode 100644 index 0000000..d63458e --- /dev/null +++ b/SqlAgent/v2/03_Prod/4_Job_Maintenance/SQLAgentInfo.sql @@ -0,0 +1,42 @@ +USE msdb; +GO + +PRINT '================================================================================'; +PRINT 'SECTION 1: SQL AGENT JOB STATUS'; +PRINT '================================================================================'; +GO + +-- List all jobs in SQL Agent +SELECT name AS JobName, enabled, date_created, date_modified +FROM msdb.dbo.sysjobs +ORDER BY name; +GO + +-- Job schedule summary +SELECT j.name AS JobName, s.name AS ScheduleName, + s.enabled, s.freq_type, s.active_start_date, s.active_start_time +FROM msdb.dbo.sysjobs j +JOIN msdb.dbo.sysjobschedules js ON j.job_id = js.job_id +JOIN msdb.dbo.sysschedules s ON js.schedule_id = s.schedule_id +ORDER BY j.name; +GO + +-- Last job run details +SELECT j.name AS JobName, + h.run_status, + CASE h.run_status + WHEN 0 THEN 'Failed' + WHEN 1 THEN 'Succeeded' + WHEN 2 THEN 'Retry' + WHEN 3 THEN 'Canceled' + WHEN 4 THEN 'In Progress' + END AS StatusDescription, + msdb.dbo.agent_datetime(h.run_date, h.run_time) AS RunDateTime, + h.run_duration +FROM dbo.sysjobs j +LEFT JOIN dbo.sysjobhistory h ON j.job_id = h.job_id +WHERE h.instance_id IN ( + SELECT MAX(instance_id) FROM dbo.sysjobhistory GROUP BY job_id +) +ORDER BY RunDateTime DESC; +GO \ No newline at end of file diff --git a/SqlAgent/v2/03_Prod/4_Job_Maintenance/ScheduleJobsMonthly.sql b/SqlAgent/v2/03_Prod/4_Job_Maintenance/ScheduleJobsMonthly.sql new file mode 100644 index 0000000..508ebbc --- /dev/null +++ b/SqlAgent/v2/03_Prod/4_Job_Maintenance/ScheduleJobsMonthly.sql @@ -0,0 +1,3 @@ +USE ProdDUTASJobSchedule; +GO +EXEC dbo.usp_ScheduleJobsForMonth; diff --git a/SqlAgent/v2/03_Prod/4_Job_Maintenance/TodaysExecution.sql b/SqlAgent/v2/03_Prod/4_Job_Maintenance/TodaysExecution.sql new file mode 100644 index 0000000..e116c74 --- /dev/null +++ b/SqlAgent/v2/03_Prod/4_Job_Maintenance/TodaysExecution.sql @@ -0,0 +1,21 @@ +USE ProdDUTASJobSchedule; +GO + +DECLARE @Runday DATE = DATEADD(day, +0, CAST(GETDATE() AS DATE)); -- -1 for Yesterday + +SELECT + jeh.ExecutionID, + jeh.JobName, + jeh.RunDate, + jc.ScheduledStartTime, + jeh.ActualStartTime, + jeh.ActualEndTime, + jeh.Status, + jeh.ErrorMessage, + jeh.OverrideFlag, + jeh.OverrideBy +FROM dbo.JobExecutionHistory jeh +INNER JOIN dbo.JobControl jc + ON jeh.JobName = jc.JobName +WHERE jeh.RunDate = @Runday +ORDER BY jc.ScheduledStartTime, jeh.ActualStartTime; diff --git a/SqlAgent/v2/03_Prod/4_Job_Maintenance/TriggerMissedJob.sql b/SqlAgent/v2/03_Prod/4_Job_Maintenance/TriggerMissedJob.sql new file mode 100644 index 0000000..950d722 --- /dev/null +++ b/SqlAgent/v2/03_Prod/4_Job_Maintenance/TriggerMissedJob.sql @@ -0,0 +1,9 @@ +USE [ProdDUTASJobSchedule] +GO + +-- 1. Preview missed jobs (safe, no run): + EXEC dbo.usp_TriggerMissedJobs @DryRun = 1; + +-- 2. Actually trigger missed jobs: + EXEC dbo.usp_TriggerMissedJobs @DryRun = 0; + diff --git a/SqlAgent/v2/03_Prod/5_PowerShell_Scripts/Execute-RemoteJob.ps1 b/SqlAgent/v2/03_Prod/5_PowerShell_Scripts/Execute-RemoteJob.ps1 new file mode 100644 index 0000000..ddf3ea8 --- /dev/null +++ b/SqlAgent/v2/03_Prod/5_PowerShell_Scripts/Execute-RemoteJob.ps1 @@ -0,0 +1,102 @@ +param( + [Parameter(Mandatory = $true)] + [string]$JobName, + + [Parameter(Mandatory = $true)] + [ValidateSet('DEVL', 'TEST', 'PROD')] + [string]$Env +) + +try { + Write-Host "Starting job $JobName in environment $Env at $(Get-Date)" + + # ------------------------------------------------------------ + # Extract JCL from JobName (ENV_FREQUENCY_JOB pattern) + # ------------------------------------------------------------ + $JCL = $JobName -replace '^[A-Z]+_[A-Z]+_', '' + Write-Host "Extracted JCL: $JCL from JobName: $JobName" -ForegroundColor Yellow + + # ------------------------------------------------------------ + # Environment-specific configuration + # ------------------------------------------------------------ + switch ($Env.ToUpper()) { + 'DEVL' { + $ComputerName = '10.57.110.120' + $DatabaseName = 'DevlDUTASJobSchedule' + } + 'TEST' { + $ComputerName = '10.57.110.141' + $DatabaseName = 'TestDUTASJobSchedule' + } + 'PROD' { + $ComputerName = '10.57.111.125' + $DatabaseName = 'ProdDUTASJobSchedule' + } + default { + throw "Invalid environment specified: $Env" + } + } + + # ------------------------------------------------------------ + # Remote credentials + # (recommend moving credentials to secure vault for production) + # ------------------------------------------------------------ + $username = "DUTASSQLAdminP@does.dcgov.priv" + $password = "4ho@3Pr&Xof8" | ConvertTo-SecureString -AsPlainText -Force + $credential = New-Object System.Management.Automation.PSCredential($username, $password) + + # ------------------------------------------------------------ + # Execute job remotely using the extracted JCL + # ------------------------------------------------------------ + Write-Host "Connecting to remote server $ComputerName ..." + $exitCode = Invoke-Command -ComputerName $ComputerName ` + -Credential $credential ` + -Authentication CredSSP ` + -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck) ` + -ArgumentList $JobName, $JCL, $Env ` + -ScriptBlock { + param($JobName, $JCL, $Env) + + Write-Host "Remote execution - JobName: $JobName, JCL: $JCL, Env: $Env" + + $process = Start-Process -FilePath "powershell.exe" ` + -ArgumentList "-ExecutionPolicy Bypass -File `"E:\PSScript\RCSubmit-Job.ps1`" -JobName `"$JCL`" -Env `"$Env`"" ` + -NoNewWindow -Wait -PassThru + return $process.ExitCode + } + + if ($exitCode -eq 0) { + Write-Host "Job $JobName (JCL: $JCL) completed successfully at $(Get-Date)" -ForegroundColor Green + } else { + Write-Error "Job $JobName (JCL: $JCL) failed with exit code: $exitCode" + } +} +catch { + Write-Error "Job $JobName failed with error: $($_.Exception.Message)" + $exitCode = 1 +} +finally { + # ------------------------------------------------------------ + # Log exit code to the appropriate database + # ------------------------------------------------------------ + try { + $connectionString = "Server=localhost;Database=$DatabaseName;Trusted_Connection=true;" + $connection = New-Object System.Data.SqlClient.SqlConnection($connectionString) + $connection.Open() + + $command = $connection.CreateCommand() + $command.CommandText = @" + INSERT INTO dbo.JobExitCodes (JobName, RunDate, ExitCode, RecordedTime) + VALUES ('$JobName', CAST(GETDATE() AS DATE), $exitCode, GETDATE()); +"@ + $command.ExecuteNonQuery() + $connection.Close() + Write-Host "Exit code $exitCode logged to database $DatabaseName for job $JobName" + } + catch { + $errorMsg = $_.Exception.Message + Write-Host "Failed to log exit code to database $DatabaseName`: $errorMsg" + } +} + +exit $exitCode \ No newline at end of file diff --git a/SqlAgent/v2/03_Prod/5_PowerShell_Scripts/RCSubmit-Job.ps1 b/SqlAgent/v2/03_Prod/5_PowerShell_Scripts/RCSubmit-Job.ps1 new file mode 100644 index 0000000..b9893d7 --- /dev/null +++ b/SqlAgent/v2/03_Prod/5_PowerShell_Scripts/RCSubmit-Job.ps1 @@ -0,0 +1,108 @@ +param( + [string]$JobName, + [string]$Env +) + +# --- Parameter Validation --- +if (-not $JobName) { + Write-Host "JobName parameter is required" -ForegroundColor Red + exit 1 +} +if (-not $Env) { + Write-Host "Environment (Env) parameter is required" -ForegroundColor Red + exit 1 +} + +# --- Execute Job --- +Write-Host "Submitting job: $JobName in environment: $Env" -ForegroundColor Cyan +$output = & "$env:rcbin\submit.exe" -DSN="DOESTAX.$Env.JOBS.BATCH.LIB($JobName)" +$exitCode = [int]$LASTEXITCODE +$isSuccess = 0 + +# --- Parse SYSLOG Path --- +$syslogPath = $null +$syslogFolder = "Not found" +$content = @() +$summary = @() + +try { + $syslogPath = $output | Select-String -Pattern "SYSLOG=\[(.*)\]" | ForEach-Object { $_.Matches.Groups[1].Value } + + if ($syslogPath -and (Test-Path $syslogPath)) { + $syslogFolder = Split-Path $syslogPath -Parent + $content = Get-Content $syslogPath -ErrorAction Stop + $summary = $content | Select-String -Pattern "%Job Overall Stats:" -Context 0,7 | ForEach-Object { + $_.Context.PostContext | Select-Object -Skip 1 -First 5 + } + } else { + Write-Host "SYSLOG path not found or inaccessible: $syslogPath" -ForegroundColor Yellow + $summary = @("SYSLOG file not found in output", "Raw output:", $output -join "`n") + } +} +catch { + Write-Host "Error processing SYSLOG: $($_.Exception.Message)" -ForegroundColor Yellow + $summary = @("Error reading SYSLOG: $($_.Exception.Message)", "Raw output:", $output -join "`n") +} + +# --- Evaluate Return Codes --- +$successConditions = @( + { $JobName -eq "GSIRQ300" -and $exitCode -eq 50 }, + { $JobName -eq "DTSGWAGE" -and $exitCode -eq 8 }, + { $JobName -eq "DTSGCHKS" -and $exitCode -eq 8 }, + { $JobName -eq "DTSGPAYT" -and $exitCode -eq 8 }, + { $JobName -eq "DTSBXACH" -and $exitCode -eq 2 }, + { $JobName -eq "DTSBXREL" -and $exitCode -eq 2 }, + { $JobName -eq "DTSMIN02" -and $exitCode -eq 4 }, + { $JobName -eq "DTSBE405" -and $exitCode -eq 910 }, + { $JobName -eq "DTSBXREJ" -and $exitCode -eq 4 }, + { $JobName -eq "DTSRQ444" -and $exitCode -eq 4 }, + { $exitCode -eq 0 } +) + +if ($successConditions | Where-Object { & $_ }) { + Write-Host "Job $JobName succeeded with code $exitCode" -ForegroundColor Green + $isSuccess = 0 +} else { + Write-Host "Job $JobName failed with code $exitCode" -ForegroundColor Red + $isSuccess = 1 + # Only use error if we don't have a proper summary + if ($summary.Count -eq 0) { + $summary = @($Error[0]) + } +} + +# --- Email Notification --- +$smtpServer = "smtp4.dc.gov" +$fromEmail = "Dutas@dc.gov" +$toEmail = "zarath.lalputan@dc.gov" +$ccEmail = @("srujani.chandragiri@dc.gov") + +$emailBody = @" +
+DUTAS Batch Job: $JobName Execution Report
+==========================================
+$($summary -join "`n")
+==========================================
+
+Return Code: $exitCode
+Status: $(if ($isSuccess -eq 0) { "SUCCESS" } else { "FAILED" })
+JOBLOG Path: $syslogFolder
+
+"@ + +try { + Send-MailMessage -SmtpServer $smtpServer -Port 25 ` + -From $fromEmail -To $toEmail -Cc $ccEmail ` + -Subject "DUTAS-[$Env] Job Status: $JobName - $(if ($isSuccess -eq 0) { 'SUCCESS' } else { 'FAILED' })" ` + -Body $emailBody -BodyAsHtml + Write-Host "Email sent successfully to $toEmail" -ForegroundColor Cyan +} +catch { + Write-Host "Failed to send email: $($_.Exception.Message)" -ForegroundColor Yellow +} + +Write-Host "`n---------------------------------------------" +Write-Host "Job: $JobName | ExitCode: $exitCode | Status: $(if ($isSuccess -eq 0) { 'SUCCESS' } else { 'FAILED' })" +Write-Host "---------------------------------------------`n" + +exit $isSuccess \ No newline at end of file diff --git a/SqlAgent/v2/03_Prod/6_Backup_Restore/Backup-Restore-Guide.docx b/SqlAgent/v2/03_Prod/6_Backup_Restore/Backup-Restore-Guide.docx new file mode 100644 index 0000000..c19787a Binary files /dev/null and b/SqlAgent/v2/03_Prod/6_Backup_Restore/Backup-Restore-Guide.docx differ diff --git a/SqlAgent/v2/03_Prod/6_Backup_Restore/Backup-SQLAgent.ps1 b/SqlAgent/v2/03_Prod/6_Backup_Restore/Backup-SQLAgent.ps1 new file mode 100644 index 0000000..aa269ef --- /dev/null +++ b/SqlAgent/v2/03_Prod/6_Backup_Restore/Backup-SQLAgent.ps1 @@ -0,0 +1,48 @@ +# =================================================================== +# SQL Agent Jobs Backup Script (PowerShell) +# Modern Version using SqlServer module +# & "E:\Neeraj\SqlAgent\v2\01_Prod\6_Backup\Backup-SQLAgent.ps1" ` +# -ServerName "DOES-DUTAS-SQL" ` +# -BackupPath "\\DOES-RAINVM-PRD\E$\Neeraj\SqlAgent\Backup\" +# +# =================================================================== + +param ( + [Parameter(Mandatory = $true)] + [string]$ServerName, + + [Parameter(Mandatory = $true)] + [string]$BackupPath +) + +# Load SQL Server PowerShell module +Import-Module SqlServer -ErrorAction Stop + +# Create timestamp and output paths +$Timestamp = Get-Date -Format "yyyyMMdd_HHmmss" +$ZipFile = Join-Path $BackupPath "SQLAgentJobs_$Timestamp.zip" + +# Ensure backup folder exists +if (-not (Test-Path $BackupPath)) { + New-Item -ItemType Directory -Path $BackupPath | Out-Null +} + +# Connect to SQL Server +$server = New-Object Microsoft.SqlServer.Management.Smo.Server $ServerName + +# Export all jobs as individual SQL scripts +$JobFiles = @() +foreach ($job in $server.JobServer.Jobs) { + $SafeJobName = ($job.Name -replace '[\\/:*?"<>|]', '_') + $FileName = Join-Path $BackupPath "$SafeJobName`_$Timestamp.sql" + $job.Script() | Out-File -FilePath $FileName -Encoding UTF8 + $JobFiles += $FileName +} + +# Compress all SQL files into a single ZIP +Compress-Archive -Path $JobFiles -DestinationPath $ZipFile -Force + +# Optional: clean up individual .sql files +# Remove-Item -Path $JobFiles + +Write-Host "SQL Agent jobs backup complete: $ZipFile" -ForegroundColor Green diff --git a/SqlAgent/v2/03_Prod/6_Backup_Restore/BackupDB.sql b/SqlAgent/v2/03_Prod/6_Backup_Restore/BackupDB.sql new file mode 100644 index 0000000..dbaf325 --- /dev/null +++ b/SqlAgent/v2/03_Prod/6_Backup_Restore/BackupDB.sql @@ -0,0 +1,19 @@ +USE master; +GO + +DECLARE @SrcDB NVARCHAR(128) = 'ProdDUTASJobSchedule'; +DECLARE @BackupPath NVARCHAR(260) = '\\DOES-RAINVM-PRD\E$\Neeraj\SqlAgent\Backup\' + @SrcDB + '.bak'; +DECLARE @SQL NVARCHAR(MAX); + +-- Dynamic SQL for backup +SET @SQL = ' +BACKUP DATABASE [' + @SrcDB + '] +TO DISK = N''' + @BackupPath + ''' +WITH INIT, COMPRESSION, STATS = 10; +'; + +-- Execute backup +EXEC(@SQL); + +PRINT 'Backup completed: ' + @BackupPath; +GO diff --git a/SqlAgent/v2/03_Prod/6_Backup_Restore/Cleanup-SQLAgent.ps1 b/SqlAgent/v2/03_Prod/6_Backup_Restore/Cleanup-SQLAgent.ps1 new file mode 100644 index 0000000..dc1c4aa --- /dev/null +++ b/SqlAgent/v2/03_Prod/6_Backup_Restore/Cleanup-SQLAgent.ps1 @@ -0,0 +1,45 @@ +<# +.SYNOPSIS +Deletes SQL Agent jobs whose names start with a given environment prefix (e.g., DEVL, TEST, PROD). + +.PARAMETER ServerName +SQL Server instance name (use FCI virtual name if clustered). + +.PARAMETER Env +Environment prefix for job deletion (e.g., DEVL, TEST, PROD). + +.EXAMPLE +.\Cleanup-SQLAgent.ps1 -ServerName "DOES-DUTAS-SQL" -Env "PROD" +#> + +param ( + [Parameter(Mandatory = $true)] + [string]$ServerName, + + [Parameter(Mandatory = $true)] + [string]$Environment +) + +# Load SQL Server module +Import-Module SqlServer -ErrorAction Stop + +# Connect to SQL Server +$server = New-Object Microsoft.SqlServer.Management.Smo.Server $ServerName + +# Create log file path (same folder as script) +$ScriptRoot = Split-Path -Parent $MyInvocation.MyCommand.Definition +$LogPath = Join-Path $ScriptRoot "CleanupSQLAgent_$($Environment)_$(Get-Date -Format 'yyyyMMdd_HHmmss').log" + +"=== SQL Agent Cleanup Started for $Environment : $(Get-Date) ===" | Out-File $LogPath -Encoding UTF8 + +# Take a snapshot of all jobs first (avoids collection modification issue) +$jobsToDelete = @($server.JobServer.Jobs | Where-Object { $_.Name -like "$Environment*" }) + +foreach ($job in $jobsToDelete) { + Write-Host "Deleting job: $($job.Name)" -ForegroundColor Yellow + "Deleting job: $($job.Name)" | Out-File $LogPath -Append -Encoding UTF8 + $job.Drop() +} + +"=== Cleanup Complete for $Environment : $(Get-Date) ===" | Out-File $LogPath -Append -Encoding UTF8 +Write-Host "All $Environment SQL Agent jobs deleted successfully." -ForegroundColor Green diff --git a/SqlAgent/v2/03_Prod/6_Backup_Restore/CleanupSQLAgent.sql b/SqlAgent/v2/03_Prod/6_Backup_Restore/CleanupSQLAgent.sql new file mode 100644 index 0000000..d25424b --- /dev/null +++ b/SqlAgent/v2/03_Prod/6_Backup_Restore/CleanupSQLAgent.sql @@ -0,0 +1,27 @@ +USE msdb; +GO + +DECLARE @EnvPrefix NVARCHAR(50) = N'PROD'; -- <<< Change this to your environment prefix +DECLARE @job_id UNIQUEIDENTIFIER; +DECLARE @job_name NVARCHAR(200); + +DECLARE JobCursor CURSOR FOR +SELECT job_id, name +FROM msdb.dbo.sysjobs +WHERE name LIKE @EnvPrefix + '%'; -- Only jobs starting with the given prefix + +OPEN JobCursor; +FETCH NEXT FROM JobCursor INTO @job_id, @job_name; + +WHILE @@FETCH_STATUS = 0 +BEGIN + PRINT 'Deleting job: ' + @job_name; + EXEC msdb.dbo.sp_delete_job @job_id = @job_id; + FETCH NEXT FROM JobCursor INTO @job_id, @job_name; +END + +CLOSE JobCursor; +DEALLOCATE JobCursor; + +PRINT 'All SQL Agent jobs starting with prefix ' + @EnvPrefix + ' deleted successfully.'; +GO diff --git a/SqlAgent/v2/03_Prod/6_Backup_Restore/Extract_Backup-SQLAgent.ps1 b/SqlAgent/v2/03_Prod/6_Backup_Restore/Extract_Backup-SQLAgent.ps1 new file mode 100644 index 0000000..d452a56 --- /dev/null +++ b/SqlAgent/v2/03_Prod/6_Backup_Restore/Extract_Backup-SQLAgent.ps1 @@ -0,0 +1,8 @@ +$BackupZip = "\\DOES-RAINVM-PRD\E$\Neeraj\SqlAgent\Backup\SQLAgentJobs_20251018_153000.zip" +$ExtractPath = "\\DOES-RAINVM-PRD\E$\Neeraj\SqlAgent\Restore\" + +# Create folder if not exist +if (-not (Test-Path $ExtractPath)) { New-Item -ItemType Directory -Path $ExtractPath | Out-Null } + +# Extract the ZIP +Expand-Archive -Path $BackupZip -DestinationPath $ExtractPath -Force diff --git a/SqlAgent/v2/03_Prod/6_Backup_Restore/RestoreDB.sql b/SqlAgent/v2/03_Prod/6_Backup_Restore/RestoreDB.sql new file mode 100644 index 0000000..a9f1c12 --- /dev/null +++ b/SqlAgent/v2/03_Prod/6_Backup_Restore/RestoreDB.sql @@ -0,0 +1,31 @@ +USE master; +GO + +DECLARE @SrcDB NVARCHAR(128) = 'ProdDUTASJobSchedule'; -- original database +DECLARE @NewDB NVARCHAR(128) = 'ProdDUTASJobSchedule'; -- database name to restore as +DECLARE @BackupPath NVARCHAR(260) = '\\DOES-RAINVM-PRD\E$\Neeraj\SqlAgent\Backup\' + @SrcDB + '.bak'; +DECLARE @SQL NVARCHAR(MAX); + +-- Optional: check logical file names inside backup +-- RESTORE FILELISTONLY FROM DISK = @BackupPath; + +-- Dynamic SQL for restore +SET @SQL = ' +-- Optional: disconnect active connections +ALTER DATABASE [' + @NewDB + '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; + +RESTORE DATABASE [' + @NewDB + '] +FROM DISK = N''' + @BackupPath + ''' +WITH MOVE N''' + @SrcDB + ''' TO N''\\DOES-RAINVM-PRD\E$\SQLData\' + @NewDB + '.mdf'', + MOVE N''' + @SrcDB + '_log'' TO N''\\DOES-RAINVM-PRD\E$\SQLLogs\' + @NewDB + '_log.ldf'', + REPLACE, STATS = 10; + +-- Set database back to multi-user +ALTER DATABASE [' + @NewDB + '] SET MULTI_USER; +'; + +-- Execute restore +EXEC(@SQL); + +PRINT 'Database restored successfully as ' + @NewDB; +GO diff --git a/SqlAgent/v2/03_Prod/6_Backup_Restore/RestoreSQLAgent.sql b/SqlAgent/v2/03_Prod/6_Backup_Restore/RestoreSQLAgent.sql new file mode 100644 index 0000000..1808f8f --- /dev/null +++ b/SqlAgent/v2/03_Prod/6_Backup_Restore/RestoreSQLAgent.sql @@ -0,0 +1,12 @@ +# Connect to SQL Server +$ServerName = "DOES-DUTAS-SQL" +$SqlInstance = "localhost" # or server instance name + +# Execute each script +$ScriptFiles = Get-ChildItem -Path $ExtractPath -Filter *.sql +foreach ($file in $ScriptFiles) { + Write-Host "Restoring job from: $($file.FullName)" + sqlcmd -S $SqlInstance -i $file.FullName +} + +Write-Host "All SQL Agent jobs restored successfully." diff --git a/SqlAgent/v2/DUTAS_SQLAgent_Config_v0.3.docx b/SqlAgent/v2/DUTAS_SQLAgent_Config_v0.3.docx new file mode 100644 index 0000000..4b23160 Binary files /dev/null and b/SqlAgent/v2/DUTAS_SQLAgent_Config_v0.3.docx differ