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

189 lines
7.3 KiB
Transact-SQL

USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[AMR_Check]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[AMR_Check]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[AMR_Check]
@in_debug int = null,
@in_CheckType smallint
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette SP sert à controler le nombre d'AMR générés et traités par la connectique
Contexte d'utilisation
----------------------
Cette SP est appelée par le job DR92130 - Monitoring AMR
Parametres
----------
@in_debug : non utilisé
@in_CheckType : 1 = Sauvegarde du nombre d'AMR générés et traités
2 = Check si nombre d'AMR important (>= 50 0000)
Creation : 24.05.18 / FLA
Modification :
03.07.19 / SPE - TFS53431 - Optimize MonitoringAMR into HCITools
08.04.21 / SPE - Add (NOLOCK) in select AMR table
17.03.22 / FLA : Change DBA mail
12.02.24 / FLA : Remove ArizonaCASH
=============================================================================*/
set nocount on;
declare @result_sp int,
@errno int,
@errmsg varchar(255)
/*------------------- Declaration des variables --------------------*/
declare @Message varchar(8000),
@OutParam varchar(255),
@DatabaseName varchar(255),
@ConnecticUser varchar(255),
@LatestReplicatedNonPriorizedMonitorRowId int,
@LatestReplicatedNonPriorizedMonitorRowIdCASH int,
@LatestReplicatedPriorizedMonitorRowId int,
@LatestReplicatedPriorizedMonitorRowIdCASH int,
@MaxDate DateTime,
@Threshold int,
@Table sysname,
@RowsPrioToDo int,
@RowsToDo int,
@Hour tinyint,
@Minutes tinyint,
@dateRef Datetime
/*------------ Affectation des parametres aux variables ------------*/
SET @message = ''
SET @DatabaseName = 'Arizona'
EXEC Arizona.dbo.sp_bmc_Bmc_Applic_Default @in_job_type = 3, @in_param_int_1 = NULL, @in_param_int_2 = NULL, @in_param_varchar_1 = 'cvConnecticAMRUser', @out_default_value = @OutParam OUTPUT, @out_param_int_1 = NULL
SET @ConnecticUser = @OutParam
SET @dateRef = dateadd(minute,-16,GETDATE())
SELECT @LatestReplicatedNonPriorizedMonitorRowId = ActiveSystemServer.amr.GetLatestReplicatedMonitorRowId(@DatabaseName,0)
SELECT @LatestReplicatedPriorizedMonitorRowId = ActiveSystemServer.amr.GetLatestReplicatedMonitorRowId(@DatabaseName,1)
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
IF (@in_CheckType = 1)
BEGIN
INSERT INTO HCITools.dbo.[MonitoringAMR]
SELECT GETDATE(),
@DatabaseName [Database],
amt.AMT_table_name [Table],
SUM(CASE WHEN (amr.AMR_user = @ConnecticUser) and (amr.APS_monitor_row_id > @LatestReplicatedPriorizedMonitorRowId) THEN 1 ELSE 0 END), -- AMR priorisés non traités
SUM(CASE WHEN (amr.AMR_user = @ConnecticUser) and (amr.APS_monitor_row_id <= @LatestReplicatedPriorizedMonitorRowId) THEN 1 ELSE 0 END), -- AMR priorisés traités
SUM(CASE WHEN (ISNULL(amr.AMR_user, '') <> @ConnecticUser) and (amr.APS_monitor_row_id > @LatestReplicatedNonPriorizedMonitorRowId) THEN 1 ELSE 0 END),
SUM(CASE WHEN (ISNULL(amr.AMR_user, '') <> @ConnecticUser) and (amr.APS_monitor_row_id <= @LatestReplicatedNonPriorizedMonitorRowId) THEN 1 ELSE 0 END)
FROM Arizona.dbo.APS_monitor_row amr (nolock)
INNER JOIN Arizona.dbo.APS_monitor_table amt (nolock)
ON amr.AMR_APS_monitor_table = amt.APS_monitor_table_id
WHERE amr.AMR_row_GUID IS NOT NULL
-- Remove non transactional and not committed records.
AND NOT (amt.AMT_wait_for_commit = 1 AND amr.AMR_user = @ConnecticUser AND amr.AMR_type_of_change <> 6)
AND amt.AMT_used_by_connectic = 1
AND AMR_APS_TS >= @dateRef
GROUP BY amt.AMT_table_name
END
ELSE IF (@in_CheckType = 2)
BEGIN
select @Hour = DATEPART(HOUR,GETDATE())
select @Minutes = DATEPART(MINUTE,GETDATE())
IF (@Hour in (8,12,16) AND @Minutes < 15)
BEGIN
select @MaxDate = MAX(MA_Date)
from [dbo].[MonitoringAMR]
SELECT @Threshold = SUM(MA_RowsPrioToDo+MA_RowsToDo)
FROM [dbo].[MonitoringAMR]
WHERE MA_Date = @MaxDate
IF @Threshold >= 50000
BEGIN
SET @message = @message +'AMR to process in pharmacy :'+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)
+'Database'+CHAR(9)+CHAR(9)
+'Table'+CHAR(9)+CHAR(9)+CHAR(9)+CHAR(9)
+'Prioritized AMR'+CHAR(9)+CHAR(9)+CHAR(9)
+'Not prioritized AMR'+CHAR(13)+CHAR(10)
declare c_AMR cursor local forward_only static for
SELECT MA_Database,MA_Table,MA_RowsPrioToDo,MA_RowsToDo
FROM [dbo].[MonitoringAMR]
WHERE MA_Date = @MaxDate
AND (MA_RowsPrioToDo+MA_RowsToDo) > 0
ORDER BY MA_Database,MA_Table
open c_AMR
FETCH NEXT FROM c_AMR
into @DatabaseName, @Table, @RowsPrioToDo, @RowsToDo
while @@fetch_status <> -1
begin
SET @message = @message + @DatabaseName +CHAR(9)+CHAR(9)+CHAR(9)
+ @Table +CHAR(9)+CHAR(9)+CHAR(9)+CHAR(9)
+ CAST(@RowsPrioToDo AS VARCHAR(50)) +CHAR(9)+CHAR(9)+CHAR(9)+CHAR(9)
+ CAST(@RowsToDo AS VARCHAR(50))+CHAR(13)+CHAR(10)
FETCH NEXT FROM c_AMR
into @DatabaseName, @Table, @RowsPrioToDo, @RowsToDo
END
close c_AMR
deallocate c_AMR
END
IF @message <> ''
BEGIN
exec aps_Send_Mail_with_template
@in_param_varchar_2 = 'DBA_operator;',
@in_job_type = 3, /* 3 = warning */
@in_param_varchar_3 = @Message
END
END
END
ELSE IF (@in_CheckType = 3) /* Purge history < 3 Months */
BEGIN
DELETE [dbo].[MonitoringAMR]
WHERE MA_Date < DATEADD(MONTH, -3, GETDATE())
END
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
GO