Files
sql-scripts/TPDT-268 - ACP in task sequence/dba_storedProcedures/Check_Critical_Job.sql
2024-03-07 16:52:14 +01:00

374 lines
15 KiB
Transact-SQL

USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[mon].[Check_Critical_Job]') AND type in (N'P', N'PC'))
DROP PROCEDURE [mon].[Check_Critical_Job]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [mon].[Check_Critical_Job]
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
La SP va vérifier la bonne execution des jobs critiques et envoyer un SMS de rapport aux personnes de piquet
Contexte d'utilisation
----------------------
Appelé depuis le job D92210 - Check Critical Jobs
Creation : 26.02.19 / FLA
Modifications : 13.03.19 / FLA : utilisation de la table DBA_Mailing_list plutôt que SMSOperator
changement du schema des objets dans [mon]
15.03.19 / FLA : changement du format d'envoi de mail
18.03.19 / FLA : centralisation du calendrier + mailing list opérateur de piquet
ajout du type de calendrier (1=Critical Jobs)
24.05.19 / FLA : add WITH (NOLOCK) to avoid locking system table
27.06.19 / FLA : deplacement du status dans l'object du mail
02.09.19 / FLA : ajout check état des steps du job même si job success
12.09.19 / FLA : correction bug check état des steps du job
10.02.20 / SPE : Modification du compte sqlMonDBACalendar
03.03.20 / RTC : correction bug, rajout check session
23.06.20 / SPE : Ajout du monitoring dans DBA_monitoring_alerts_history
06.08.20 / SPE : Mise a jour de la SP complete bug60296
06.10.20 / SPE : Critical job not always send a status bug60296
27.10.20 / RTC : Migrate DBACC to HCIMON
16.08.21 / SPE : Replace hardcoded password in sp and scripts
17.03.22 / FLA : Change DBA mail
=============================================================================*/
SET NOCOUNT ON;
/*------------------- Declaration des variables --------------------*/
DECLARE @cmd nvarchar(max),
@Message varchar(500),
@Operator varchar(500),
@JobName varchar(100),
@JobDescription varchar(100),
@JobStatus varchar(20),
@Format varchar(4),
@BouquetID uniqueidentifier,
@StepID tinyint,
@EndJobExecution tinyint,
@LastStepID tinyint,
@NbStepFailed tinyint,
@EndBouquetExecution tinyint,
@StartBouquetExecution datetime
/*------------ Affectation des parametres aux variables ------------*/
SET @Operator = 'DBA_operator'
SET @JobDescription = ''
SET @JobStatus = ''
SET @Message = ''
SET @EndJobExecution = 0
SET @EndBouquetExecution = 0
SET @LastStepID = 0
SET @NbStepFailed = 0
SET @StartBouquetExecution = NULL
/*-------------------------- Traitement ---------------------------*/
/* Get operator if SMS is needed */
BEGIN TRY
SELECT @Operator = @Operator /*+';'+ORS.DML_Recipients
FROM OPENROWSET('SQLNCLI', 'DRIVER={SQL Server};SERVER=hcimon.centralinfra.net;UID=sqlMonDBACalendar;PWD=',
'SELECT DML.DML_Recipients
FROM HCITools.[mon].[SMSCalendar] SC
INNER JOIN HCITools.[mon].[SMSCalendarDBAMailingListLink] SCDMLL
ON SC.SMSCalendarID = SCDMLL.SCDMLLCalendarID
AND SC.SCType = 1 -- Critical jobs type
INNER JOIN HCITools.dbo.DBA_Mailing_list DML
ON DML.DBA_Mailing_list_ID = SCDMLL.SCDMLLDBAMailingListID
WHERE GETDATE() BETWEEN SC.SCStartDate AND SC.SCEndDate') as ORS */
END TRY
BEGIN CATCH
PRINT('ERROR during openrowset on DBACC, skip this')
END CATCH
BEGIN TRY
DECLARE c_Jobs CURSOR LOCAL FORWARD_ONLY STATIC FOR
SELECT sjs.step_id,sjc.SJCFormat,sjc.SJCJobName,sjc.SJCJobDescription,sj.job_id
FROM HCITools.[mon].SMSJobCheck sjc
LEFT JOIN msdb.dbo.sysjobsteps sjs WITH (NOLOCK)
ON sjs.step_name like '%Start job %'+ sjc.SJCJobName +'%'
INNER JOIN msdb.dbo.sysjobs sj WITH (NOLOCK)
ON sjs.job_id = sj.job_id
ORDER BY sjc.SJCNextExecution, step_id
OPEN c_Jobs
FETCH NEXT FROM c_Jobs
INTO @StepID,@Format,@JobName,@JobDescription,@BouquetID
WHILE @@fetch_status = 0
BEGIN
IF @StepID IS NOT NULL
BEGIN
WHILE (isnull(@LastStepID,0) < @StepID AND @EndBouquetExecution = 0)
BEGIN
SELECT @StartBouquetExecution = sja.start_execution_date,
@EndBouquetExecution = CASE WHEN sja.stop_execution_date IS NULL THEN 0 ELSE 1 END,
@LastStepID = sja.last_executed_step_id
FROM msdb.dbo.sysjobactivity sja WITH (NOLOCK)
INNER JOIN HCITools.[mon].SMSJobCheck sjc
ON sja.job_id = @BouquetID
AND sjc.SJCJobName = @JobName
AND sjc.SJCNextExecution <= sja.start_execution_date
WAITFOR DELAY '00:01:00'
END -- WHILE (@EndJobExecution = 0 AND @EndBouquetExecution = 0)
IF (@LastStepID >= @StepID)
BEGIN
IF EXISTS (SELECT 1
FROM msdb.dbo.sysjobhistory sjh WITH (NOLOCK)
WHERE sjh.job_id = @BouquetID
AND sjh.step_id = @StepID
AND msdb.dbo.agent_datetime(sjh.run_date,sjh.run_time)>=@StartBouquetExecution)
BEGIN
WHILE @EndJobExecution = 0
BEGIN
IF @Format IN ('SUN','AMA','AAI','RUEG')
BEGIN
SELECT @JobStatus = CASE WHEN sjh.run_status = 1 THEN 'OK' ELSE 'FAILED' END,
@EndJobExecution = CASE WHEN sja.stop_execution_date IS NULL THEN 0 ELSE 1 END
FROM msdb.dbo.sysjobs sj WITH (NOLOCK)
INNER JOIN msdb.dbo.sysjobactivity sja WITH (NOLOCK)
ON sj.name = @JobName
AND sj.job_id = sja.job_id
AND sja.start_execution_date >= @StartBouquetExecution
INNER JOIN msdb.dbo.sysjobhistory sjh WITH (NOLOCK)
ON sja.job_history_id = sjh.instance_id
IF @JobStatus = 'OK' AND @EndJobExecution = 1 /* Check step even if @jobstatus = OK */
BEGIN
SELECT @NbStepFailed = @NbStepFailed + COUNT(*)
FROM msdb.dbo.sysjobhistory jh WITH (NOLOCK)
INNER JOIN msdb.dbo.sysjobactivity ja WITH (NOLOCK)
ON ja.job_id = jh.job_id
INNER JOIN msdb.dbo.sysjobs j WITH (NOLOCK)
ON j.job_id = ja.job_id
WHERE j.name = @JobName
AND run_status = 0 --and ja.stop_execution_date is null--
AND ja.session_id = (SELECT TOP 1 session_id FROM msdb.dbo.syssessions WITH (NOLOCK) ORDER BY agent_start_date DESC)
AND start_execution_date is not null
AND stop_execution_date is not null
AND msdb.dbo.agent_datetime(run_date, run_time) >= start_execution_date
/* Gestion des Query Timeout Error */
SELECT @NbStepFailed = @NbStepFailed + COUNT(*)
FROM msdb.dbo.sysjobhistory jh WITH (NOLOCK)
INNER JOIN msdb.dbo.sysjobactivity ja WITH (NOLOCK)
ON ja.job_id = jh.job_id
INNER JOIN msdb.dbo.sysjobs j WITH (NOLOCK)
ON j.job_id = ja.job_id
WHERE j.name = @JobName
AND run_status = 1 --and ja.stop_execution_date is null--
AND ja.session_id = (SELECT TOP 1 session_id FROM msdb.dbo.syssessions WITH (NOLOCK) ORDER BY agent_start_date DESC)
AND start_execution_date is not null
AND stop_execution_date is not null
AND jh.sql_message_id = 7412
AND msdb.dbo.agent_datetime(run_date, run_time) >= start_execution_date
IF @NbStepFailed > 0
BEGIN
SET @JobStatus = 'FAILED'
END
END
END
ELSE IF @Format = 'AMAR'
BEGIN
SET @cmd = 'SELECT @JobStatus = CASE WHEN sjh.run_status = 1 THEN ''OK'' ELSE ''FAILED'' END,
@EndJobExecution = CASE WHEN sja.stop_execution_date IS NULL THEN 0 ELSE 1 END
FROM AMAVITALIVEAPS.msdb.dbo.sysjobs sj WITH (NOLOCK)
INNER JOIN AMAVITALIVEAPS.msdb.dbo.sysjobactivity sja WITH (NOLOCK)
ON sj.name = @JobName
AND sj.job_id = sja.job_id
AND sja.start_execution_date >= @StartBouquetExecution
INNER JOIN AMAVITALIVEAPS.msdb.dbo.sysjobhistory sjh WITH (NOLOCK)
ON sja.job_history_id = sjh.instance_id
IF @JobStatus = ''OK'' AND @EndJobExecution = 1 /* Check step even if @jobstatus = OK */
BEGIN
SELECT @NbStepFailed = @NbStepFailed + COUNT(*)
FROM AMAVITALIVEAPS.msdb.dbo.sysjobhistory jh WITH (NOLOCK)
INNER JOIN AMAVITALIVEAPS.msdb.dbo.sysjobactivity ja WITH (NOLOCK)
ON ja.job_id = jh.job_id
INNER JOIN AMAVITALIVEAPS.msdb.dbo.sysjobs j WITH (NOLOCK)
ON j.job_id = ja.job_id
WHERE j.name = @JobName
AND run_status = 0 --and ja.stop_execution_date is null--
AND ja.session_id = (SELECT TOP 1 session_id FROM AMAVITALIVEAPS.msdb.dbo.syssessions WITH (NOLOCK) ORDER BY agent_start_date DESC)
AND start_execution_date is not null
AND stop_execution_date is not null
AND msdb.dbo.agent_datetime(run_date, run_time) >= start_execution_date
/* Gestion des Query Timeout Error */
SELECT @NbStepFailed = @NbStepFailed + COUNT(*)
FROM AMAVITALIVEAPS.msdb.dbo.sysjobhistory jh WITH (NOLOCK)
INNER JOIN AMAVITALIVEAPS.msdb.dbo.sysjobactivity ja WITH (NOLOCK)
ON ja.job_id = jh.job_id
INNER JOIN AMAVITALIVEAPS.msdb.dbo.sysjobs j WITH (NOLOCK)
ON j.job_id = ja.job_id
WHERE j.name = @JobName AND run_status = 1 --and ja.stop_execution_date is null--
AND ja.session_id = (SELECT TOP 1 session_id FROM AMAVITALIVEAPS.msdb.dbo.syssessions WITH (NOLOCK) ORDER BY agent_start_date DESC)
AND start_execution_date is not null
AND stop_execution_date is not null
AND jh.sql_message_id = 7412
AND msdb.dbo.agent_datetime(run_date, run_time) >= start_execution_date
IF @NbStepFailed > 0
BEGIN
SET @JobStatus = ''FAILED''
END
END
'
EXEC sp_executesql @cmd, N'@EndJobExecution tinyint OUTPUT,@JobStatus varchar(20) OUTPUT, @JobName varchar(100), @StartBouquetExecution datetime, @NbStepFailed tinyint', @JobStatus=@JobStatus OUTPUT, @EndJobExecution=@EndJobExecution OUTPUT, @JobName=@JobName, @StartBouquetExecution=@StartBouquetExecution, @NbStepFailed=@NbStepFailed
END
WAITFOR DELAY '00:01:00'
END -- WHILE @EndJobExecution IS NULL
END -- IF EXISTS
ELSE
BEGIN
SET @JobStatus = 'NO EXECUTION'
END
SET @Message = isnull(@JobDescription,'no job description') + ' : ' + isnull(@JobStatus,'no job status')
END -- IF (@LastStepID >= @StepID)
END -- IF @StepID IS NOT NULL
ELSE
BEGIN
SET @Message = isnull(@JobDescription,'no job description') + ' : Le job a changé de nom'
END
IF @Message <> ''
BEGIN
DECLARE @machine VARCHAR(255)
SET @machine = ''
BEGIN TRY
EXEC arizona.dbo.aps_Retrieve_info_of_current_system @out_current_system = @machine OUTPUT
END TRY
BEGIN CATCH
SET @machine = ''
END CATCH
SET @Message = isnull(@machine,'no machine name') + ' - ' + isnull(@Message,'no message')
BEGIN TRY
DECLARE @AlertID int
IF CHARINDEX('Interbase',@JobDescription, 0) > 0
BEGIN
SELECT @AlertID = DBA_monitoring_alerts_ID FROM [HCITools].[mon].[DBA_monitoring_alerts] WHERE DBAMA_key = 'SyncI'
END
IF CHARINDEX('Synchro H',@JobDescription, 0) > 0
BEGIN
SELECT @AlertID = DBA_monitoring_alerts_ID FROM [HCITools].[mon].[DBA_monitoring_alerts] WHERE DBAMA_key = 'SyncH'
END
IF CHARINDEX('Synchro V',@JobDescription, 0) > 0
BEGIN
SELECT @AlertID = DBA_monitoring_alerts_ID FROM [HCITools].[mon].[DBA_monitoring_alerts] WHERE DBAMA_key = 'SyncVExtract'
END
IF CHARINDEX('PharmIndex',@JobDescription, 0) > 0
BEGIN
SELECT @AlertID = DBA_monitoring_alerts_ID FROM [HCITools].[mon].[DBA_monitoring_alerts] WHERE DBAMA_key = 'PHIDX'
END
IF RIGHT(@Message,2) = 'OK'
BEGIN
INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message)
VALUES (@AlertID, 0, getdate(), @message)
END
ELSE
BEGIN
INSERT INTO [HCITools].[mon].[DBA_monitoring_alerts_history] (DBAMAH_monitoring_alerts, DBAMAH_criticity_level, DBAMAH_event_date, DBAMAH_long_message)
VALUES (@AlertID, 2, getdate(), @message)
END
END TRY
BEGIN CATCH
EXEC aps_Send_Mail_with_template @in_param_varchar_2 = @Operator, @in_param_subject = 'Problème avec le check du monitoring', @in_job_type = 4;
END CATCH
EXEC aps_Send_Mail_with_template @in_param_varchar_2 = @Operator, @in_param_subject = @message, @in_job_type = 4;
END
FETCH NEXT FROM c_Jobs
INTO @StepID,@Format,@JobName,@JobDescription,@BouquetID
SET @EndJobExecution = 0
SET @Message = ''
SET @NbStepFailed = 0
END -- while @@fetch_status = 0
CLOSE c_Jobs
DEALLOCATE c_Jobs
SET @EndBouquetExecution = 1
WHILE @EndBouquetExecution <> 0
BEGIN
SELECT @EndBouquetExecution = SUM(CASE WHEN sja.stop_execution_date IS NULL THEN 1 ELSE 0 END)
FROM HCITools.[mon].SMSJobCheck sjc
INNER JOIN msdb.dbo.sysjobsteps sjs WITH (NOLOCK)
ON sjs.step_name like '%Start job %'+ sjc.SJCJobName +'%'
INNER JOIN msdb.dbo.sysjobs sj WITH (NOLOCK)
ON sjs.job_id = sj.job_id
INNER JOIN msdb.dbo.sysjobactivity sja WITH (NOLOCK)
ON sja.job_id = sj.job_id
INNER JOIN msdb.dbo.syssessions AS sse
ON sja.session_id = sse.session_id
INNER JOIN (SELECT MAX(agent_start_date) as agent_start_date FROM msdb.dbo.syssessions) AS mss
ON sse.agent_start_date = mss.agent_start_date
WHERE sja.start_execution_date >= SJCNextExecution
WAITFOR DELAY '00:02:00'
END
UPDATE sjc SET SJCNextExecution = sja.next_scheduled_run_date
FROM HCITools.[mon].SMSJobCheck sjc
INNER JOIN msdb.dbo.sysjobsteps sjs WITH (NOLOCK)
ON sjs.step_name like '%Start job %'+ sjc.SJCJobName +'%'
INNER JOIN msdb.dbo.sysjobs sj WITH (NOLOCK)
ON sjs.job_id = sj.job_id
INNER JOIN msdb.dbo.sysjobactivity sja WITH (NOLOCK)
ON sja.job_id = sj.job_id
INNER JOIN msdb.dbo.syssessions AS sse
ON sja.session_id = sse.session_id
INNER JOIN (SELECT MAX(agent_start_date) as agent_start_date FROM msdb.dbo.syssessions) AS mss
ON sse.agent_start_date = mss.agent_start_date
WHERE sja.start_execution_date >= ISNULL(SJCNextExecution,GETDATE()-1)
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
GO