175 lines
12 KiB
Transact-SQL
175 lines
12 KiB
Transact-SQL
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
|