339 lines
14 KiB
Transact-SQL
339 lines
14 KiB
Transact-SQL
|
|
USE [HCITOOLS]
|
|
GO
|
|
|
|
IF EXISTS (SELECT * FROM sys.objects o JOIN sys.schemas s ON o.schema_id = s.schema_id WHERE o.name = 'sp_Monitor_AMR_Central' AND OBJECTPROPERTY(object_id,N'IsProcedure') = 1 AND s.name = 'dba')
|
|
DROP PROCEDURE [dba].[sp_Monitor_AMR_Central]
|
|
GO
|
|
|
|
SET ANSI_NULLS ON
|
|
SET QUOTED_IDENTIFIER ON
|
|
GO
|
|
|
|
|
|
|
|
CREATE PROCEDURE [dba].[sp_Monitor_AMR_Central]
|
|
|
|
AS
|
|
/*=============================================================================
|
|
|
|
Explication du traitement realise par la SP
|
|
-------------------------------------------
|
|
Monitoring du nombre d'AMR sur une pharmacie et d'envoi d'alertes mails et/ou sms selon le total.
|
|
Cette SP est exécutée depuis le job _D90290 - SYNC - Monitor AMR - Central
|
|
|
|
Parametres
|
|
----------
|
|
|
|
Creation : 01.05.2019 / SPE
|
|
|
|
Modifications : 05.02.2020 / SPE - Modification of bmcarizona password
|
|
16.08.2021 / SPE : Replace hardcoded password in sp and scripts
|
|
17.03.2022 / FLA : Change DBA mail
|
|
30.11.2022 / FLA : keep SMS alert only for production environment
|
|
|
|
=============================================================================*/
|
|
|
|
SET ANSI_NULLS ON;
|
|
SET QUOTED_IDENTIFIER ON;
|
|
SET CONCAT_NULL_YIELDS_NULL ON;
|
|
SET ANSI_WARNINGS ON;
|
|
SET ANSI_PADDING ON;
|
|
SET NOCOUNT ON;
|
|
|
|
/*------------------- Declaration des variables --------------------*/
|
|
DECLARE @errno int,
|
|
@niveau_alerte_AMR int,
|
|
@niveau_alerte_AMR_Med int,
|
|
@niveau_alerte_AMR_Sup int,
|
|
@amr_count_total int,
|
|
@amr_count_total_limit int,
|
|
@current_max int,
|
|
@AMT_table_name_LEN int,
|
|
@Today varchar(10),
|
|
@pharmacy varchar(21),
|
|
@errmsg varchar(255),
|
|
@email varchar(255),
|
|
@SMSPiket varchar(255),
|
|
@password varchar(255),
|
|
@Result_as_string varchar(max),
|
|
@message varchar(max),
|
|
@sqlstmt varchar(max),
|
|
@Type VARCHAR(5)
|
|
|
|
|
|
|
|
|
|
/*------------ Affectation des parametres aux variables ------------*/
|
|
|
|
/* A partir de cette valeur pour une table une alerte mail prioritaire est envoyée*/
|
|
SET @niveau_alerte_AMR = 5000
|
|
SET @niveau_alerte_AMR_Med = 10000
|
|
|
|
/* A partir de cette valeur pour une table une alerte sms est envoyée*/
|
|
SET @niveau_alerte_AMR_Sup = 50000
|
|
|
|
/* Si le total des amr atteint cette valeur, une alerte sms est envoyée */
|
|
SET @amr_count_total_limit = 100000;
|
|
|
|
/* La date d'aujourd'hui en format YYYY-MM-DD */
|
|
SET @Today = convert(varchar(10), getdate(), 121);
|
|
|
|
/* Set current pharmacy from customer */
|
|
SELECT @pharmacy = CASE
|
|
WHEN customer = 'AMA' THEN 'ama004aps.amavita.ch'
|
|
WHEN customer = 'SUN' THEN 'sun111aps.sunstore.ch'
|
|
WHEN customer = 'AAI' THEN 'aai002aps.aai.local'
|
|
WHEN customer = 'RUEG' THEN 'aai003aps.aai.local' END
|
|
from master.cfg.[Identity]
|
|
|
|
/* Set email list from customer */
|
|
SELECT @email = CASE
|
|
WHEN customer = 'AMA' THEN 'DBA_operator;HCI_Dev_DataMonitoring_Operators;[HCI_Connectic_Managers];HCI_Consultants_Centrale_GaleniCare'
|
|
WHEN customer = 'SUN' THEN 'DBA_operator;HCI_Dev_DataMonitoring_Operators;[HCI_Connectic_Managers];HCI_Consultants_Centrale_GaleniCare'
|
|
WHEN customer = 'AAI' THEN 'DBA_operator;HCI_Dev_DataMonitoring_Operators'
|
|
WHEN customer = 'RUEG' THEN 'DBA_operator;HCI_Dev_DataMonitoring_Operators' END
|
|
from master.cfg.[Identity]
|
|
|
|
SELECT @SMSPiket = DML_Recipients FROM [Arizona].[dbo].[DBA_Mailing_list] WHERE DML_Code = 'HCI_SMS'
|
|
|
|
SELECT @Type = type FROM [master].[cfg].[InstanceContext]
|
|
|
|
/*-------------------------- Traitement ---------------------------*/
|
|
|
|
BEGIN TRY
|
|
|
|
/******************************/
|
|
/* EN PHARMACIE : Recupere les tables monitorees en pharmacie pour APOS */
|
|
/******************************/
|
|
|
|
/* Create temp table */
|
|
IF NOT EXISTS (select 1 from tempdb.dbo.sysobjects o where o.xtype in ('U') and o.id = object_id(N'tempdb..#aps_monitor_table_MAG'))
|
|
BEGIN
|
|
CREATE TABLE #aps_monitor_table_MAG (
|
|
AMT_table_name varchar(255) NULL,
|
|
AMT_monitoring_type smallint NULL,
|
|
AMT_vertical_synchronization bit NOT NULL,
|
|
AMT_horizontal_synchronization bit NOT NULL);
|
|
END
|
|
|
|
/* Set pharmacy from Identity table */
|
|
SELECT @password = dbo.fn_Decrypt(0x01000000CB57766E65B2870616508D6B1E3996D8AA04932A5637822356196C4D3D7523A36EB5277FE69D2C21661533909D6AEDBA4E287822DEAD22C59FF2B5F5CE313BE0)
|
|
|
|
SET @sqlstmt = 'INSERT INTO #aps_monitor_table_MAG
|
|
SELECT AMT_table_name,
|
|
AMT_monitoring_type,
|
|
AMT_vertical_synchronization,
|
|
AMT_horizontal_synchronization
|
|
FROM OPENROWSET(''SQLOLEDB'',
|
|
''' + @pharmacy + ''';
|
|
''bmcarizona'';
|
|
''' + @password + ''',
|
|
''SELECT AMT_table_name, AMT_monitoring_type, AMT_vertical_synchronization, AMT_horizontal_synchronization FROM Arizona.dbo.APS_monitor_table WHERE AMT_monitoring_type > 1'');'
|
|
|
|
EXEC (@sqlstmt)
|
|
|
|
|
|
/******************************/
|
|
/* A LA CENTRALE : COMPTAGE DES AMR EN ATTENTE DE SYNCHRONISATION */
|
|
/******************************/
|
|
DECLARE @aps_monitor_row_CENTRAL table (
|
|
AMT_table_name varchar(255) NULL,
|
|
AMR_count int,
|
|
AMR_APS_TS_min datetime,
|
|
AMR_APS_TS_max datetime,
|
|
AMR_count_00_08 int,
|
|
AMR_count_08_10 int,
|
|
AMR_count_10_12 int,
|
|
AMR_count_12_14 int,
|
|
AMR_count_14_16 int,
|
|
AMR_count_16_18 int,
|
|
AMR_count_18_20 int,
|
|
AMR_count_20_00 int);
|
|
|
|
INSERT INTO @aps_monitor_row_CENTRAL
|
|
SELECT PivotTable.amt_table_name,
|
|
[<8] + [8..10] + [10..12] + [12..14] + [14..16] + [16..18] + [18..20] + [>20] 'Total AMR en attente',
|
|
min(AMR_APS_TS),
|
|
max(AMR_APS_TS),
|
|
[<8],
|
|
[8..10],
|
|
[10..12],
|
|
[12..14],
|
|
[14..16],
|
|
[16..18],
|
|
[18..20],
|
|
[>20]
|
|
FROM ( SELECT DISTINCT amr.amr_row_guid,
|
|
amr.amr_aps_monitor_table,
|
|
amt.amt_table_name,
|
|
CASE
|
|
WHEN amr.amr_aps_ts < @Today + ' 08:00' THEN '<8'
|
|
WHEN amr.amr_aps_ts < @Today + ' 10:00' THEN '8..10'
|
|
WHEN amr.amr_aps_ts < @Today + ' 12:00' THEN '10..12'
|
|
WHEN amr.amr_aps_ts < @Today + ' 14:00' THEN '12..14'
|
|
WHEN amr.amr_aps_ts < @Today + ' 16:00' THEN '14..16'
|
|
WHEN amr.amr_aps_ts < @Today + ' 18:00' THEN '16..18'
|
|
WHEN amr.amr_aps_ts < @Today + ' 20:00' THEN '18..20'
|
|
ELSE '>20' END 'AMR_Period'
|
|
FROM [Arizona].[dbo].aps_monitor_row amr (nolock)
|
|
JOIN [Arizona].[dbo].aps_monitor_table amt (nolock)
|
|
ON aps_monitor_table_id = amr_aps_monitor_table
|
|
AND AMT_monitoring_type > 1
|
|
AND AMT_vertical_synchronization = 1
|
|
JOIN #aps_monitor_table_MAG amtM
|
|
ON amtM.amt_table_name = amt.amt_table_name
|
|
WHERE amr.amr_extraction_timestamp is null) AS SourceTable
|
|
PIVOT ( count(amr_row_guid)
|
|
FOR AMR_Period in ([<8], [8..10], [10..12], [12..14], [14..16], [16..18], [18..20], [>20])) AS PivotTable
|
|
JOIN [Arizona].[dbo].aps_monitor_row amr (nolock)
|
|
ON amr.amr_aps_monitor_table = PivotTable.amr_aps_monitor_table
|
|
AND amr_extraction_timestamp is null
|
|
GROUP BY PivotTable.amt_table_name,
|
|
[<8],
|
|
[8..10],
|
|
[10..12],
|
|
[12..14],
|
|
[14..16],
|
|
[16..18],
|
|
[18..20],
|
|
[>20]
|
|
ORDER BY [<8] + [8..10] + [10..12] + [12..14] + [14..16] + [16..18] + [18..20] + [>20] desc,
|
|
PivotTable.amt_table_name;
|
|
|
|
SELECT @current_max = MAX(AMR_count) FROM @aps_monitor_row_CENTRAL
|
|
SELECT @amr_count_total = SUM(AMR_count) FROM @aps_monitor_row_CENTRAL
|
|
|
|
/* DROP Temp table */
|
|
IF EXISTS (select 1 from tempdb.dbo.sysobjects o where o.xtype in ('U') and o.id = object_id(N'tempdb..#aps_monitor_table_MAG'))
|
|
BEGIN
|
|
DROP TABLE #aps_monitor_table_MAG
|
|
END
|
|
|
|
/* bloc alertes mail normal */
|
|
IF @current_max >= @niveau_alerte_AMR AND @current_max < @niveau_alerte_AMR_Med
|
|
BEGIN
|
|
|
|
SELECT @AMT_table_name_LEN = 2 + max(len(AMT_table_name))
|
|
FROM @aps_monitor_row_CENTRAL;
|
|
SELECT @Result_as_string
|
|
= '' + convert(char(10), 'Nb_AMR') + left(convert(char(100), 'Table'), @AMT_table_name_LEN)
|
|
+ convert(char(10), '<8h') + convert(char(10), '8h-10h') + convert(char(10), '10h-12h')
|
|
+ convert(char(10), '12h-14h') + convert(char(10), '14h-16h') + convert(char(10), '16h-18h')
|
|
+ convert(char(10), '18h-20h') + convert(char(10), '>20h') + convert(char(18), 'MIN amr_aps_ts')
|
|
+ convert(char(18), 'MAX amr_aps_ts')
|
|
+ '
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------
|
|
' ;
|
|
SELECT @Result_as_string
|
|
= @Result_as_string + convert(char(10), AMR_count)
|
|
+ left(convert(char(100), AMT_table_name), @AMT_table_name_LEN) + convert(char(10), AMR_count_00_08)
|
|
+ convert(char(10), AMR_count_08_10) + convert(char(10), AMR_count_10_12)
|
|
+ convert(char(10), AMR_count_12_14) + convert(char(10), AMR_count_14_16)
|
|
+ convert(char(10), AMR_count_16_18) + convert(char(10), AMR_count_18_20)
|
|
+ convert(char(10), AMR_count_20_00) + convert(char(18), convert(varchar(16), AMR_APS_TS_min, 121))
|
|
+ convert(char(18), convert(varchar(16), AMR_APS_TS_max, 121)) + '
|
|
'
|
|
FROM @aps_monitor_row_CENTRAL
|
|
ORDER BY AMR_count desc,
|
|
AMT_table_name;
|
|
SELECT @Result_as_string
|
|
= @Result_as_string
|
|
+ '-------------------------------------------------------------------------------------------------------------------------------------------------
|
|
' ;
|
|
SET @message
|
|
= 'AMR en attente de synchronisation verticale, et synchronisation ensuite par la connectique !
|
|
|
|
' + @Result_as_string;
|
|
EXEC [Arizona].[dbo].aps_Send_Mail_with_template @in_param_varchar_2 = @email,
|
|
@in_param_varchar_3 = @message,
|
|
@in_job_type = 0;
|
|
END
|
|
|
|
/* bloc alertes mail prioritaire */
|
|
IF @current_max >= @niveau_alerte_AMR_Med
|
|
or @amr_count_total >= @amr_count_total_limit
|
|
BEGIN
|
|
|
|
SELECT @AMT_table_name_LEN = 2 + max(len(AMT_table_name))
|
|
FROM @aps_monitor_row_CENTRAL;
|
|
SELECT @Result_as_string
|
|
= '' + convert(char(10), 'Nb_AMR') + left(convert(char(100), 'Table'), @AMT_table_name_LEN)
|
|
+ convert(char(10), '<8h') + convert(char(10), '8h-10h') + convert(char(10), '10h-12h')
|
|
+ convert(char(10), '12h-14h') + convert(char(10), '14h-16h') + convert(char(10), '16h-18h')
|
|
+ convert(char(10), '18h-20h') + convert(char(10), '>20h') + convert(char(18), 'MIN amr_aps_ts')
|
|
+ convert(char(18), 'MAX amr_aps_ts')
|
|
+ '
|
|
-------------------------------------------------------------------------------------------------------------------------------------------------
|
|
' ;
|
|
SELECT @Result_as_string
|
|
= @Result_as_string + convert(char(10), AMR_count)
|
|
+ left(convert(char(100), AMT_table_name), @AMT_table_name_LEN) + convert(char(10), AMR_count_00_08)
|
|
+ convert(char(10), AMR_count_08_10) + convert(char(10), AMR_count_10_12)
|
|
+ convert(char(10), AMR_count_12_14) + convert(char(10), AMR_count_14_16)
|
|
+ convert(char(10), AMR_count_16_18) + convert(char(10), AMR_count_18_20)
|
|
+ convert(char(10), AMR_count_20_00) + convert(char(18), convert(varchar(16), AMR_APS_TS_min, 121))
|
|
+ convert(char(18), convert(varchar(16), AMR_APS_TS_max, 121)) + '
|
|
'
|
|
FROM @aps_monitor_row_CENTRAL
|
|
ORDER BY AMR_count desc,
|
|
AMT_table_name;
|
|
SELECT @Result_as_string
|
|
= @Result_as_string
|
|
+ '-------------------------------------------------------------------------------------------------------------------------------------------------
|
|
' ;
|
|
SELECT @message
|
|
= 'AMR en attente de synchronisation verticale, et synchronisation ensuite par la connectique !
|
|
|
|
' + @Result_as_string;
|
|
EXEC [Arizona].[dbo].aps_Send_Mail_with_template @in_param_varchar_2 = @email,
|
|
@in_param_varchar_3 = @message,
|
|
@in_job_type = 3;
|
|
END
|
|
|
|
IF @Type = 'PROD'
|
|
BEGIN
|
|
|
|
/* bloc rajouté pour les alertes sms */
|
|
IF @current_max >= @niveau_alerte_AMR_Sup
|
|
OR @amr_count_total >= @amr_count_total_limit
|
|
BEGIN
|
|
|
|
DECLARE @subject varchar(20);
|
|
SELECT @subject = 'AMR alert:' + cast(SERVERPROPERTY('machinename') as varchar(20))
|
|
SELECT @AMT_table_name_LEN = 2 + max(len(AMT_table_name))
|
|
FROM @aps_monitor_row_CENTRAL;
|
|
SELECT @Result_as_string = 'Total ' + convert(varchar(10), @amr_count_total);
|
|
SELECT TOP 5 @Result_as_string
|
|
= @Result_as_string + +CHAR(13) + CHAR(10)
|
|
+ left(convert(varchar(30), AMT_table_name), @AMT_table_name_LEN) + ' '
|
|
+ convert(varchar(10), AMR_count) + ''
|
|
FROM @aps_monitor_row_CENTRAL
|
|
ORDER BY AMR_count desc,
|
|
AMT_table_name;
|
|
SELECT @Result_as_string = @Result_as_string;
|
|
SELECT @message = left(@Result_as_string, 100);
|
|
EXEC [Arizona].[dbo].aps_Send_Mail_with_template @in_param_recipient = @SMSPiket,
|
|
@in_param_subject = @subject,
|
|
@in_param_message = @message,
|
|
@in_job_type = 40;
|
|
END
|
|
END
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @errno = 70003,
|
|
@errmsg = 'Monitoring AMR Central error!'
|
|
goto error_99
|
|
END CATCH;
|
|
|
|
/*------------------ Retour au programme appelant -----------------*/
|
|
|
|
RETURN(@@error);
|
|
|
|
/*---------------------- Traitement des erreurs ----------------------*/
|
|
error_99:
|
|
RAISERROR (@errmsg, 16, 1);
|
|
RETURN(@errno);
|
|
|
|
GO
|