Files
DUTAS/SqlAgent/02_Test/3_Stored_Procedures/usp_CreateSQLAgentJob.sql
2025-11-02 14:50:48 -05:00

175 lines
12 KiB
Transact-SQL
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

USE [msdb];
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
CREATE OR ALTER PROCEDURE [dbo].[usp_CreateSQLAgentJob]
(
@JobName VARCHAR(100), -- e.g. 'DEVL_DAILY_DTSBX215'
@Env CHAR(4) -- 'DEVL' | 'TEST' | 'PROD'
)
AS
BEGIN
SET NOCOUNT ON;
DECLARE
@ReturnCode INT = 0,
@jobId UNIQUEIDENTIFIER,
@categoryName NVARCHAR(128),
@dbName NVARCHAR(128),
@scriptPath NVARCHAR(4000),
@step1Cmd NVARCHAR(MAX),
@step2Cmd NVARCHAR(MAX),
@step3Cmd NVARCHAR(MAX),
@SafeJobName SYSNAME,
@step2Name NVARCHAR(128),
@step3Name NVARCHAR(128);
-- Basic validation
IF @JobName IS NULL OR LTRIM(RTRIM(@JobName)) = ''
BEGIN
RAISERROR('JobName is required.', 16, 1);
RETURN;
END
IF @Env NOT IN ('DEVL','TEST','PROD')
BEGIN
RAISERROR('Env must be one of: DEVL, TEST, PROD.', 16, 1);
RETURN;
END
-- Job category based only on environment
SET @categoryName = @Env;
-- Map environment to the actual DB name
SET @dbName = CASE @Env
WHEN 'DEVL' THEN 'DevlDUTASJobSchedule'
WHEN 'TEST' THEN 'TestDUTASJobSchedule'
WHEN 'PROD' THEN 'ProdDUTASJobSchedule'
END;
-- Map environment to script path
SET @scriptPath = CASE @Env
WHEN 'DEVL' THEN '\\DOES-RAINVM-DEV\E$\PSScript\Execute-RemoteJob.ps1'
WHEN 'TEST' THEN '\\DOES-RAINVM-TST\E$\PSScript\Execute-RemoteJob.ps1'
WHEN 'PROD' THEN '\\DOES-RAINVM-PRD\E$\PSScript\Execute-RemoteJob.ps1'
END;
-- Safe job name
SET @SafeJobName = REPLACE(@JobName, '''', '''''');
-- Step names
SET @step2Name = N'Run ' + @JobName;
SET @step3Name = N'Update Execution Status';
-- Build step commands
SET @step1Cmd = N'EXEC dbo.usp_CheckJobConditions_Generic ''' + @SafeJobName + N''';';
SET @step2Cmd = N'powershell.exe -ExecutionPolicy Bypass -File "' + @scriptPath
+ N'" -JobName "' + @SafeJobName + N'" -Env "' + @Env + N'"';
SET @step3Cmd =
N'DECLARE @ExitCode INT;
DECLARE @Today DATE = CAST(GETDATE() AS DATE);
SELECT TOP 1 @ExitCode = ExitCode
FROM dbo.JobExitCodes
WHERE JobName = ''' + @SafeJobName + N''' AND RunDate = @Today
ORDER BY RecordedTime DESC;
SET @ExitCode = ISNULL(@ExitCode, 1);
PRINT ''Using exit code: '' + CAST(@ExitCode AS VARCHAR(10));
EXEC dbo.usp_UpdateJobStatus_Generic ''' + @SafeJobName + N''', @ExitCode;';
BEGIN TRY
BEGIN TRANSACTION;
-- Ensure category exists
IF NOT EXISTS (
SELECT 1 FROM msdb.dbo.syscategories
WHERE name = @categoryName AND category_class = 1
)
BEGIN
EXEC msdb.dbo.sp_add_category
@class = N'JOB',
@type = N'LOCAL',
@name = @categoryName;
END
-- Create job
EXEC @ReturnCode = msdb.dbo.sp_add_job
@job_name = @JobName,
@enabled = 1,
@notify_level_eventlog = 2,
@description = N'Auto-generated DUTAS job.',
@category_name = @categoryName,
@owner_login_name = N'DOES\DUTASSQLADMINP',
@job_id = @jobId OUTPUT;
IF @ReturnCode <> 0
RAISERROR('sp_add_job failed with code %d', 16, 1, @ReturnCode);
-- Step 1: Check Conditions (T-SQL)
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep
@job_id = @jobId,
@step_name = N'Check Conditions',
@subsystem = N'TSQL',
@command = @step1Cmd,
@database_name = @dbName,
@on_success_action = 3, -- go to next step
@on_fail_action = 2; -- quit job reporting failure
IF @ReturnCode <> 0
RAISERROR('sp_add_jobstep (step1) failed with code %d', 16, 1, @ReturnCode);
-- Step 2: Run PowerShell (CmdExec)
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep
@job_id = @JobId,
@step_name = @step2Name,
@subsystem = N'CmdExec',
@command = @step2Cmd,
@on_success_action = 3, -- proceed to next step
@on_fail_action = 3; -- proceed to Step 3
IF @ReturnCode <> 0
RAISERROR('sp_add_jobstep (step2) failed with code %d', 16, 1, @ReturnCode);
-- Step 3: Update Execution Status (T-SQL)
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep
@job_id = @JobId,
@step_name = @step3Name,
@subsystem = N'TSQL',
@command = @step3Cmd,
@database_name = @dbName,
@on_success_action = 1, -- quit with success
@on_fail_action = 2; -- quit with failure
IF @ReturnCode <> 0
RAISERROR('sp_add_jobstep (step3) failed with code %d', 16, 1, @ReturnCode);
-- Set the job to start at step 1
EXEC @ReturnCode = msdb.dbo.sp_update_job
@job_id = @jobId,
@start_step_id = 1;
IF @ReturnCode <> 0
RAISERROR('sp_update_job failed with code %d', 16, 1, @ReturnCode);
-- Attach job to local server
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver
@job_id = @jobId,
@server_name = N'(local)';
IF @ReturnCode <> 0
RAISERROR('sp_add_jobserver failed with code %d', 16, 1, @ReturnCode);
COMMIT TRANSACTION;
PRINT 'Job [' + @JobName + '] created successfully under category [' + @categoryName + '].';
PRINT 'Job contains 3 steps: Check Conditions, Run PowerShell, Update Execution Status.';
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
DECLARE @ErrMsg NVARCHAR(4000) = ERROR_MESSAGE();
DECLARE @ErrNum INT = ERROR_NUMBER();
RAISERROR('Job creation failed. Msg=%s Num=%d', 16, 1, @ErrMsg, @ErrNum);
RETURN;
END CATCH
END;
GO