This commit is contained in:
2024-03-07 16:52:14 +01:00
parent bb404b6ce6
commit 859a324c7e
203 changed files with 68602 additions and 0 deletions

View File

@@ -0,0 +1,188 @@
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

View File

@@ -0,0 +1,56 @@
USE [HCITools];
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Backup_Simple_Databases]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[Backup_Simple_Databases]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
CREATE PROCEDURE [dbo].[Backup_Simple_Databases]
WITH ENCRYPTION
AS
/*===================================================================================
Procedure to backup all database in simple recovery mode
Backkup only if database update occurs during last 24h
Creation : 10.01.2023 / RTC
=====================================================================================*/
IF EXISTS ( SELECT 1
FROM ActivePos_read.[upd].[DatabaseHistory]
WHERE VersionDate > DATEADD(hh, -24, GETDATE()))
BEGIN
/* select only databases in simple recovery mode */
DECLARE @database_list VARCHAR(4000);
SELECT @database_list = '';
SELECT @database_list = @database_list + name + ',' --,name, *
FROM master.sys.databases
WHERE recovery_model_desc = 'SIMPLE'
AND name NOT IN ( 'tempdb' );
SET @database_list = SUBSTRING(@database_list, 1, (LEN(@database_list) - 1));
DECLARE @password VARCHAR(255);
SET @password
= HCITools.dbo.fn_Decrypt(
0x01000000C2811DD6D0339FF2EFE6AE1181B3469D18798020836E3E0A1E4BC96D548B4FCDFFB77F264E1A4F42AD91F785284A6F5D4F3E533B0355E88F91A61E7E671472D3F580FC36CCF0AE48858099190C1B7E3A1A2A292A3E8809B40EAB6EAECF3C0FF6871CAF54A3928615C21830602BCB12F1F973E4B4B1F34A613B342C397372596025DB62CB426319AE916D0DC5CCAED8A62675D7602D592A92);
/* BACKUP TARGET DATABASES */
EXEC HCITools.[dba].[Commvault_Operation] @in_type = 'Backup',
@in_username = 'CLI_SQL_Backup',
@in_password = @password,
@in_subclientName = 'OnDemand',
@in_databasetobackup = @database_list,
@in_callerApp = 'DBA backup';
END;

View File

@@ -0,0 +1,138 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dba].[Backup_principal_permission]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dba].[Backup_principal_permission]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dba].[Backup_principal_permission]
@in_param_database_name varchar (255) = null,
@in_param_label datetime,
@in_debug int = null
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette Sp sert a créer une copie de sauvegarde des droits la base Arizona,
et sécurités pour une base donnée.
Contexte d'utilisation
----------------------
Cette Sp est utilisée lors de la mise à jour des environnements afin de ,
restaurer les droits à la fin de la mise à jour.
Parametres
----------
@in_database_name = nom de la base
@@in_label = Label de l'extraction
Creation : 15.11.16 / rtc
Dossier : #35262# + Security - Backup and restore SQL objects security
Modifications :
DD.MM.YY / xxx :
=============================================================================*/
set nocount on;
declare @result_sp int,
@errno int,
@errmsg varchar(255);
/*------------------------ Test des parametres input ------------------------*/
if (@in_param_database_name is null)
begin
select @errno = 70003,
@errmsg = '(APS) Invalid input parameter database name !'
goto error_99
end
/*------------------- Declaration des variables --------------------*/
declare @cmd varchar (8000);
declare @label varchar(255),
@database_name varchar (255),
@database_id int;
/*------------ Affectation des parametres aux variables ------------*/
select @label = CONVERT(varchar(255),@in_param_label,121);
select @database_name = @in_param_database_name,
@label = isnull (@label, CONVERT(varchar(255),GETDATE(),121))
select top 1 @database_id = database_id
from sys.databases
where name = @database_name
/*-------------------------- Traitement ---------------------------*/
begin try
select @cmd = '
INSERT INTO HCITools.dba.[Principal_Permission]
SELECT ' + '''' + @database_name + '''' + ' [PP_database_name],
QUOTENAME(OBJECT_SCHEMA_NAME(ob.object_id,'+ CONVERT(varchar(100),@database_id)+')) [PP_schema],
ob.name [PP_object],
QUOTENAME(dpr.name) PP_user_name,
dp.type PP_permission_type,
dp.permission_name PP_permission_name,
dp.state PP_permission_state,
dp.state_desc PP_state_desc,
CASE WHEN state <> ''W''
THEN state_desc
ELSE ''GRANT''
END
+ '' '' + permission_name + '' ON ''+ QUOTENAME(OBJECT_SCHEMA_NAME(ob.object_id,'
+ CONVERT(varchar(100),@database_id)+')) + ''.'' + QUOTENAME(ob.name) +
CASE WHEN sc.column_id IS NULL
THEN SPACE(0)
ELSE '' (''+ QUOTENAME(sc.name) +'')''
END
+ '' TO'' + SPACE(1) + QUOTENAME(dpr.name) COLLATE database_default +
CASE WHEN dp.state <> ''W'' THEN ''''
ELSE + '' WITH GRANT OPTION''
END [PP_apply_permission_command],
CONVERT(datetime, '+ ''''+@label +''''+',121) [PP_timestamp]
FROM ' + @database_name + '.sys.database_permissions dp
JOIN '+ @database_name +' .sys.objects ob
ON dp.major_id = ob.object_id
JOIN '+ @database_name +'.sys.database_principals dpr
ON dp.grantee_principal_id = dpr.principal_id
LEFT JOIN '+ @database_name +'.sys.columns sc
ON sc.column_id = dp.minor_id
AND dp.major_id = sc.object_id
ORDER BY 1, 2, 3, 5'
if (@in_Debug = 1)
print @cmd
else
exec (@cmd)
end try
begin catch
select @errno = 70000,
@errmsg = 'Error during backup principals !! ' + ERROR_MESSAGE()
;
goto error_99
end catch
/*------------------ Retour au programme appelant -----------------*/
return(@@error);
/*---------------------- Traitement des erreurs ----------------------*/
error_99:
raiserror(@errmsg, 14, 1)
return(@errno)
;
go

View File

@@ -0,0 +1,76 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CheckMaintenanceWindow]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[CheckMaintenanceWindow]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CheckMaintenanceWindow]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[CheckMaintenanceWindow] AS'
END
GO
ALTER PROCEDURE [dbo].[CheckMaintenanceWindow]
@in_debug int = null,
@in_JobName sysname
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette SP sert à savoir si le job appelant peut s'executer ou s'il est dans la plage de maintenance
Contexte d'utilisation
----------------------
Cette SP est appelée via les jobs [D91040 - Backup of simple databases] et [D91050 - Backup of full databases]
Parametres
----------
@in_debug : non utilisé
Creation : 16.12.20 / FLA
Modifications : 04.05.21 / FLA : changement du comportement par défaut si la centrale n'est pas joignable
18.01.22 / SPE : OCTPDBA-92 : Adapt [HCITools].[dbo].[CheckMaintenanceWindow] stored procedure to get information from the new S10 maintenance windows
=============================================================================*/
set nocount on;
/*------------------- Declaration des variables --------------------*/
declare @DateFROM datetime = '',
@DateTO datetime = ''
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
SELECT @DateFROM = convert(datetime,[ITCS_value]) FROM [Arizona].[dbo].[IT_config_setting] WHERE [ITCS_key] = 'SCCMMWStart'
SELECT @DateTO = convert(datetime,[ITCS_value]) FROM [Arizona].[dbo].[IT_config_setting] WHERE [ITCS_key] = 'SCCMMWEnd'
IF @DateFROM is not null and @DateTO is not null
BEGIN
IF (GETDATE() BETWEEN convert(datetime,@DateFROM) AND convert(datetime,@DateTO))
BEGIN
EXEC msdb.dbo.sp_stop_job @job_name = @in_JobName
RAISERROR('This server is actually in a SCCM Maintenance window, execution of this job is cancelled!',16,1)
END
END
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
GO

View File

@@ -0,0 +1,373 @@
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

View File

@@ -0,0 +1,96 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Check_SQL_Dumps]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[Check_SQL_Dumps]
GO
/****** Object: StoredProcedure [dbo].[Check_SQL_Dumps] Script Date: 12/14/2018 13:07:58 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[Check_SQL_Dumps]
@in_debug int = null
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette SP vérifie le log SQL des 2 dernières heures et envoie une alerte par mail si des dumps SQL ont été générés.
Contexte d'utilisation
----------------------
Cette SP est appelée par le job SQL DR92120 - Check Stack Dump
Parametres
----------
@in_debug : Si 1 alors on fait un print des commandes
Creation : 14.12.18 / SPE
Modifications : 17.03.2022 - FLA : Change DBA mail
=============================================================================*/
set nocount on;
declare @result_sp int,
@errno int,
@errmsg varchar(255)
/*------------------- Declaration des variables --------------------*/
DECLARE @dateFrom datetime,
@dateTo datetime,
@totDumps int,
@msg varchar(8000)
/*------------ Affectation des parametres aux variables ------------*/
SET @dateFrom = DATEADD(minute, -120, GETDATE())
SET @dateTo = GETDATE()
SET @msg = ''
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
CREATE TABLE #t_totDumps(LogDate datetime, ProcessInfo varchar(20), Textlog varchar(20) );
INSERT INTO #t_totDumps(LogDate,ProcessInfo,Textlog)
EXEC sys.xp_readerrorlog 0, 1, '* BEGIN STACK DUMP:', NULL, @dateFrom, @dateTo, N'desc'
SELECT @totDumps = COUNT(*) FROM #t_totDumps
DROP TABLE #t_totDumps;
IF @totDumps <> 0
BEGIN
SET @msg = 'WARNING: ' + convert(varchar,@totDumps) + ' SQL crash dumps found during the last 2 hours!';
EXEC hcitools.dbo.aps_Send_Mail_with_template
@in_param_varchar_2 = 'DBA_operator;',
@in_job_type = 3, /* 3 = warning */
@in_param_varchar_3 = @msg
END
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
GO

View File

@@ -0,0 +1,118 @@
USE [HCITools]
GO
IF EXISTS(SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CleanUp_History]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[CleanUp_History]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[CleanUp_History]
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
La SP va purger l'historique des jobs plus ancien de 3 mois
Contexte d'utilisation
----------------------
Appelé depuis le job D93010 - Daily clean-up
Parametres
----------
Creation : 28.10.16 / FLA
Modifications : 08.03.2018 / RTC Reduce history for Repl-Distribution category jobs
09.02.2021 / SPE #TFS63542# - Adapt purge DR jobs daily treatment
18.02.2021 / SPE #TFS63542# - Adapt purge DR jobs daily treatment - Resolve bug Oldest_date at the top of cursor
=============================================================================*/
SET NOCOUNT ON
DECLARE @job_id UNIQUEIDENTIFIER,
@Oldest_date DATETIME,
@tot INT,
@daycount SMALLINT
BEGIN TRY
/* PURGE MORE THAN 3 MONTHS */
SET @Oldest_date = dateadd(mm,-3,GETDATE())
EXEC msdb..sp_delete_backuphistory @oldest_date=@Oldest_date
EXEC msdb..sp_maintplan_delete_log @oldest_time=@Oldest_date
EXEC msdb..sysmail_delete_mailitems_sp @sent_before=@Oldest_date
DECLARE c_jobs CURSOR LOCAL FORWARD_ONLY STATIC FOR
SELECT jobs.job_id
FROM msdb..sysjobs jobs
OPEN c_jobs
FETCH NEXT FROM c_jobs
INTO @job_id
WHILE @@fetch_status <> -1
BEGIN
IF @@fetch_status <> -2
BEGIN
SET @Oldest_date = dateadd(mm,-3,GETDATE())
/* PURGE MORE THAN 3 MONTHS JOB BY JOB */
EXEC msdb.dbo.sp_purge_jobhistory
@job_id = @job_id,
@oldest_date = @Oldest_date
/* PURGE ALL IF MORE THAN 2000 HISTORY DAY BY DAY */
SELECT @tot = count(*)
FROM msdb.dbo.sysjobhistory h with (nolock)
JOIN msdb.dbo.sysjobs j with (nolock)
ON j.job_id = h.job_id
WHERE j.job_id = @job_id
SET @daycount = -90
WHILE (@tot > 2000)
BEGIN
SET @Oldest_date = dateadd(dd,@daycount,GETDATE())
EXEC msdb.dbo.sp_purge_jobhistory
@job_id = @job_id,
@oldest_date = @Oldest_date
SET @daycount = @daycount + 1
SELECT @tot = count(*)
FROM msdb.dbo.sysjobhistory h with (nolock)
JOIN msdb.dbo.sysjobs j with (nolock)
ON j.job_id = h.job_id
WHERE j.job_id = @job_id
END
END
FETCH NEXT FROM c_jobs
INTO @job_id
END
CLOSE c_jobs
DEALLOCATE c_jobs
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
GO

View File

@@ -0,0 +1,66 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CleanUp_Objects_Security_History]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[CleanUp_Objects_Security_History]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[CleanUp_Objects_Security_History]
@in_debug tinyint = 0
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
This SP will delete objects security history according to type of environnement.
Context
----------------------
Call by job W93140 - Backup objects security
Parameters
----------
@in_debug : not used
Create date : 05.10.2018 / RTC
=============================================================================*/
set nocount on;
/*------------------- Declaration des variables --------------------*/
declare @Oldest_date datetime
BEGIN TRY
IF EXISTS ( SELECT *
FROM [master].[cfg].[InstanceContext]
WHERE Type in ( 'VALI', 'DEV' ))
SELECT @Oldest_date = dateadd(m, -3, getdate())
ELSE
SELECT @Oldest_date = dateadd(m, -6, getdate())
DELETE FROM [HCITools].[dba].[Principal_Permission]
WHERE [PP_timestamp] < @Oldest_date
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Error management with RaiseError */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
GO

View File

@@ -0,0 +1,363 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DBA_Check]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[DBA_Check]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[DBA_Check]
@in_debug int = null,
@in_CheckType smallint
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette SP sert à vérifier un ensemble de points critiques sur une instance SQL Server
Contexte d'utilisation
----------------------
Cette SP est appelée par le job D92100 - DBA Check
Parametres
----------
@in_debug : non utilisé
@in_CheckType : 1 = Check du recovery mode des bases de données
2 = Check de l'existance d'un backup (De base et/ou de log) en fonction du recovery mode de la base de données
3 = Check d'évenements relatifs aux serveurs liés la veille
4 = Check des triggers d'AMR manquants
Creation : 30.03.16 / FLA
Modifications : 30.01.18 - FLA - Ajout d'un check d'événements relatifs aux serveurs liés
20.06.16 - FLA - Bug sur test de la version SQL, suppression du test car inutile
05.10.10 - FLA - Ajout de la gestion des environnements pour le test du recovery mode
01.10.20 - FLA - Ajout du check des triggers d'AMR
06.10.20 - FLA - Suppresion du raiseerror
10.11.20 - FLA - Check if Arizona exist for check 4
23.11.20 - SPE - Monitor Scanned Documents
23.11.20 - SPE - Add check log level of services (trace, debug, info)
25.02.21 - RTC - Remove check 5 for pending Scan : ask by CCA
05.08.21 - SPE - Remove check linkedservers if ActivePharmacyReplicationPlugin
16.08.21 - SPE - Add check activepos_read size
17.03.22 - FLA : Change DBA mail
20.06.23 - RTC : Update Backup check to allign to Commvault random schedule
=============================================================================*/
set nocount on;
declare @result_sp int,
@errno int,
@errmsg varchar(255)
/*------------------- Declaration des variables --------------------*/
declare @DatabaseName sysname,
@Message varchar(8000),
@xml XML,
@delimiter VARCHAR(1),
@param_group_counter_list NVARCHAR(3000),
@LastBackUpTime datetime,
@RecoveryMode varchar(10),
@Type varchar(10),
@Event varchar(400),
@TableName sysname,
@totImages int,
@ModeUsed varchar(255)
/*------------ Affectation des parametres aux variables ------------*/
SET @Message = ''
SET @totImages = 0
SET @ModeUsed = ''
SELECT @param_group_counter_list = HCIP_value FROM dbo.HCI_PARAMS WHERE HCIP_key = 'BKP_NOT_DB'
SET @delimiter = ','
SET @xml = CAST(('<X>'+REPLACE(@param_group_counter_list, @delimiter, '</X><X>')+'</X>') AS XML)
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
IF @in_CheckType = 1
BEGIN
IF EXISTS (SELECT type FROM master.cfg.InstanceContext WHERE type = 'PROD')
BEGIN
declare c_backup cursor local forward_only static for
select name
from sys.databases
where name in ('Arizona','ArizonaCash') /* On vérifie que Arizona et ArizonaCash ne sont pas en mode SIMPLE */
AND recovery_model_desc = 'SIMPLE'
open c_backup
FETCH NEXT FROM c_backup
into @DatabaseName
while @@fetch_status = 0
begin
SET @Message = @Message + 'La base '+@DatabaseName+' est en recovery SIMPLE ' + CHAR(13)
FETCH NEXT FROM c_backup
into @DatabaseName
end
close c_backup
deallocate c_backup
END
END
ELSE IF @in_CheckType = 2
BEGIN
declare c_backup cursor local forward_only static for
select DatabaseName, LastBackUpTime,recovery_model_desc,type
FROM
(SELECT sdb.Name AS DatabaseName,sdb.recovery_model_desc,sdb.type,MAX(bus.backup_finish_date) AS LastBackUpTime
FROM
(select sd.name,sd.recovery_model_desc, a.type
FROM sys.databases sd WITH (NOLOCK)
LEFT OUTER JOIN
(SELECT 'FULL' as recovery_model_desc,'D' as type
UNION
SELECT 'FULL','L'
UNION
SELECT 'SIMPLE','D') a
ON a.recovery_model_desc = sd.recovery_model_desc
where name <> 'model') sdb
LEFT OUTER JOIN msdb.dbo.backupset bus WITH (NOLOCK)
ON bus.database_name = sdb.name
AND (bus.type = 'D' OR bus.type = 'L')
AND bus.type = sdb.type
AND is_snapshot = 0
GROUP BY sdb.name,sdb.recovery_model_desc,sdb.type) b
WHERE (DATEDIFF(HOUR, CAST(b.LastBackUpTime as DATETIME), CAST(GETDATE() as DATETIME )) > 20 OR b.LastBackUpTime is null)
AND LOWER(DatabaseName) not in (SELECT C.value('.', 'varchar(3000)') AS value FROM @xml.nodes('X') AS X(C))
open c_backup
FETCH NEXT FROM c_backup
into @DatabaseName, @LastBackUpTime, @RecoveryMode, @Type
while @@fetch_status = 0
begin
SET @Message = @Message + 'Il n''y a pas eu de backup de '+REPLACE(REPLACE(@Type,'D','Database'),'L','Log')+' sur la base '+@DatabaseName+' en recovery mode '+@RecoveryMode+' depuis '+ isnull(CONVERT(varchar(50),@LastBackUpTime,121),'toujours') + CHAR(13)
FETCH NEXT FROM c_backup
into @DatabaseName, @LastBackUpTime, @RecoveryMode, @Type
end
close c_backup
deallocate c_backup
END
ELSE IF @in_CheckType = 3
BEGIN
IF EXISTS (SELECT *
FROM [master].sys.objects o WITH (NOLOCK)
WHERE o.name = 'DDL_audit'
AND o.type IN (N'U'))
BEGIN
declare c_lksrv cursor local forward_only static for
SELECT 'Linked Server Event :'+CHAR(13)+CHAR(10)+
'Login : '+DA_Event_Xml.value('(./EVENT_INSTANCE/LoginName)[1]','VARCHAR(50)')+CHAR(13)+CHAR(10)+
'Name : '+DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectName)[1]','VARCHAR(50)')+CHAR(13)+CHAR(10)+
'Event : '+DA_Event_Xml.value('(./EVENT_INSTANCE/EventType)[1]','VARCHAR(50)')+CHAR(13)+CHAR(10)+
'With : '+[DA_App_Name]+CHAR(13)+CHAR(10)+
'From : '+[DA_Host_Name]+CHAR(13)+CHAR(10)+
'At : '+DA_Event_Xml.value('(./EVENT_INSTANCE/PostTime)[1]','VARCHAR(50)')+CHAR(13)+CHAR(10) as Mail
FROM [master].[dba].[DDL_audit]
where DA_App_Name <> 'ActivePharmacyReplicationPlugin' AND DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectType)[1]','VARCHAR(50)') = 'LINKED SERVER'
AND DA_Event_Xml.value('(./EVENT_INSTANCE/PostTime)[1]','DATETIME') > GETDATE()-1
AND NOT ((DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectName)[1]','VARCHAR(50)') LIKE 'WA%'
OR DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectName)[1]','VARCHAR(50)') LIKE 'WCV%'
OR DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectName)[1]','VARCHAR(50)') LIKE 'WS%')
AND DA_Event_Xml.value('(./EVENT_INSTANCE/EventType)[1]','VARCHAR(50)') = 'ALTER_LINKED_SERVER'
AND ([DA_App_Name] = 'SQLCMD' OR [DA_App_Name] = 'Microsoft SQL Server' OR [DA_App_Name] = 'ActivePharmacy.ArizonaServerService'))
AND NOT (DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectName)[1]','VARCHAR(50)') like 'AZLD_%'
AND [DA_App_Name] like 'SQLAgent%')
AND NOT (DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectName)[1]','VARCHAR(50)') like 'DWH_%'
AND [DA_App_Name] like 'SQLAgent%')
open c_lksrv
FETCH NEXT FROM c_lksrv
into @Event
while @@fetch_status = 0
begin
SET @Message = @Message + @Event
FETCH NEXT FROM c_lksrv
into @Event
end
close c_lksrv
deallocate c_lksrv
END
END
ELSE IF @in_CheckType = 4
BEGIN
IF EXISTS (SELECT 1 FROM sys.databases where name = 'Arizona')
BEGIN
declare c_MON_Triggers cursor local forward_only static for
SELECT AMT.AMT_table_name
FROM Arizona.dbo.aps_monitor_table AMT
LEFT JOIN Arizona.sys.triggers TR
ON TR.name like 'aps[_]tIUD[_]MON[_]%'
AND OBJECT_NAME(TR.parent_id,DB_ID('Arizona')) = AMT.AMT_table_name
WHERE AMT.AMT_monitoring_type > 1
AND TR.name IS NULL
open c_MON_Triggers
FETCH NEXT FROM c_MON_Triggers
into @TableName
while @@fetch_status = 0
begin
SET @Message = @Message + 'Il manque le trigger de monitoring sur la table '+@TableName + CHAR(13)
FETCH NEXT FROM c_MON_Triggers
into @TableName
end
close c_MON_Triggers
deallocate c_MON_Triggers
END
END
ELSE IF @in_CheckType = 6
BEGIN
IF EXISTS (SELECT 1 FROM sys.databases where name = 'ActivePos_server')
BEGIN
IF EXISTS(SELECT 1 FROM [ActivePos_server].[dbo].[Settings] where SettingId = 'Values.Diagnostics.MinLogLevel' and SettingValue <> 'Info')
BEGIN
SELECT @ModeUsed = SettingValue FROM [ActivePos_server].[dbo].[Settings] where SettingId = 'Values.Diagnostics.MinLogLevel' and SettingValue <> 'Info'
IF (@ModeUsed = 'Error' OR @ModeUsed = 'Warn' OR @ModeUsed = 'Fatal')
BEGIN
SET @Message = @Message + 'The log level in ActivePos_server is: '+@ModeUsed +' we can skip some important log.' + CHAR(13)
END
ELSE IF (@ModeUsed = 'Debug' OR @ModeUsed = 'Trace')
BEGIN
SET @Message = @Message + 'The log level in ActivePos_server is: '+@ModeUsed +' this cause some performances issues.' + CHAR(13)
END
ELSE
BEGIN
SET @Message = @Message + 'The log level in ActivePos_server is: '+@ModeUsed +' This value is not supported.' + CHAR(13)
END
END
END
IF EXISTS (SELECT 1 FROM sys.databases where name = 'ActivePos_write')
BEGIN
IF EXISTS(SELECT 1 FROM [ActivePos_write].[dbo].[Settings] where SettingId = 'Values.Diagnostics.MinLogLevel' and SettingValue <> 'Info')
BEGIN
SELECT @ModeUsed = SettingValue FROM [ActivePos_write].[dbo].[Settings] where SettingId = 'Values.Diagnostics.MinLogLevel' and SettingValue <> 'Info'
IF (@ModeUsed = 'Error' OR @ModeUsed = 'Warn' OR @ModeUsed = 'Fatal')
BEGIN
SET @Message = @Message + 'The log level in ActivePos_write is: '+@ModeUsed +' we can skip some important log.' + CHAR(13)
END
ELSE IF (@ModeUsed = 'Debug' OR @ModeUsed = 'Trace')
BEGIN
SET @Message = @Message + 'The log level in ActivePos_write is: '+@ModeUsed +' this cause some performances issues.' + CHAR(13)
END
ELSE
BEGIN
SET @Message = @Message + 'The log level in ActivePos_write is: '+@ModeUsed +' This value is not supported.' + CHAR(13)
END
END
END
IF EXISTS (SELECT 1 FROM sys.databases where name = 'ActiveSystemClient')
BEGIN
IF EXISTS(SELECT 1 FROM [ActiveSystemClient].[cfg].[Settings] where SettingId = 'Values.Diagnostics.MinLogLevel' and SettingValue <> 'Info')
BEGIN
SELECT @ModeUsed = SettingValue FROM [ActiveSystemClient].[cfg].[Settings] where SettingId = 'Values.Diagnostics.MinLogLevel' and SettingValue <> 'Info'
IF (@ModeUsed = 'Error' OR @ModeUsed = 'Warn' OR @ModeUsed = 'Fatal')
BEGIN
SET @Message = @Message + 'The log level in ActiveSystemClient is: '+@ModeUsed +' we can skip some important log.' + CHAR(13)
END
ELSE IF (@ModeUsed = 'Debug' OR @ModeUsed = 'Trace')
BEGIN
SET @Message = @Message + 'The log level in ActiveSystemClient is: '+@ModeUsed +' this cause some performances issues.' + CHAR(13)
END
ELSE
BEGIN
SET @Message = @Message + 'The log level in ActiveSystemClient is: '+@ModeUsed +' This value is not supported.' + CHAR(13)
END
END
END
IF EXISTS (SELECT 1 FROM sys.databases where name = 'ActiveSystemServer')
BEGIN
IF EXISTS(SELECT 1 FROM [ActiveSystemServer].[cfg].[Settings] where SettingId = 'Values.Diagnostics.MinLogLevel' and SettingValue <> 'Info')
BEGIN
SELECT @ModeUsed = SettingValue FROM [ActiveSystemServer].[cfg].[Settings] where SettingId = 'Values.Diagnostics.MinLogLevel' and SettingValue <> 'Info'
IF (@ModeUsed = 'Error' OR @ModeUsed = 'Warn' OR @ModeUsed = 'Fatal')
BEGIN
SET @Message = @Message + 'The log level in ActiveSystemServer is: '+@ModeUsed +' we can skip some important log.' + CHAR(13)
END
ELSE IF (@ModeUsed = 'Debug' OR @ModeUsed = 'Trace')
BEGIN
SET @Message = @Message + 'The log level in ActiveSystemServer is: '+@ModeUsed +' this cause some performances issues.' + CHAR(13)
END
ELSE
BEGIN
SET @Message = @Message + 'The log level in ActiveSystemServer is: '+@ModeUsed +' This value is not supported.' + CHAR(13)
END
END
END
END
ELSE IF @in_CheckType = 7
BEGIN
IF EXISTS (SELECT 1 FROM sys.databases where name = 'ActivePos_read')
BEGIN
IF EXISTS(SELECT 1 FROM sys.master_files where name = 'activepos_read_Data' and size * 8/1024 > 8192)
BEGIN
DECLARE @aposreadsize int
SELECT @aposreadsize = size * 8/1024 FROM sys.master_files where name = 'activepos_read_Data'
SET @Message = @Message + 'La taille de la base activepos_read est plus grande que 8Go! Taille actuelle: '+convert(varchar(255),@aposreadsize) + CHAR(13)
END
END
END
/* S'il y a une erreur, on envoie un mail aux DBA */
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
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
GO

View File

@@ -0,0 +1,100 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DBA_Check_Backup_ActivePos_read_Job]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[DBA_Check_Backup_ActivePos_read_Job]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[DBA_Check_Backup_ActivePos_read_Job]
@in_debug int = null
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette SP sert à vérifier si le job de backup de la base ActivePos_read est bien activé
Contexte d'utilisation
----------------------
Cette SP est appelée par le job D92100 - DBA Check
Parametres
----------
@in_debug : non utilisé
Creation : 16.04.21 / RTC
Modifications : 17.03.2022 - FLA : Change DBA mail
=============================================================================*/
set nocount on;
declare @result_sp int,
@errno int,
@errmsg varchar(255)
/*------------------- Declaration des variables --------------------*/
declare @DatabaseName sysname,
@Message varchar(8000),
@LastUpdate datetime
/*------------ Affectation des parametres aux variables ------------*/
SET @Message = ''
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
/* Runs on pharmacy servers */
IF EXISTS (SELECT 1 FROM sys.databases where name = 'ActivePos_read')
BEGIN
/* Check only if there are active POS for this pharmacy */
IF EXISTS(SELECT 1 from arizona.dbo.point_of_sale
inner join arizona.dbo.organizational_unit
on Organizational_unit_ID = POS_organizational_unit
where pos_type IN (1,2)
and pos_active = 1
and pos_name not like '%99')
BEGIN
/* Check if job is not enable */
IF EXISTS (SELECT 1 FROM msdb.dbo.sysjobs WHERE name = 'D91030 - Backup ActivePos_Read' AND ENABLED = 0)
BEGIN
/* Check if last update > 24h : anormal situation */
SELECT TOP 1 @LastUpdate = [VersionDate] FROM [ActivePos_write].[upd].[DatabaseHistory] order by [VersionDate] desc
IF (DATEADD(dd,1,@lastUpdate) < GETDATE())
SELECT @Message = 'ActivePos_read job was not enable : Apos Msi update date : ' + convert(varchar, @LastUpdate, 121)
EXEC msdb..sp_update_job @job_name = 'D91030 - Backup ActivePos_Read', @enabled = 1
END
END
END
/* S'il y a une erreur, on envoie un mail aux DBA */
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
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
GO

View File

@@ -0,0 +1,6 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Check_Locked_Sessions]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[mon_Check_Locked_Sessions]
GO

View File

@@ -0,0 +1,6 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Get_Locked_Sessions_Infos]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[mon_Get_Locked_Sessions_Infos]
GO

View File

@@ -0,0 +1,7 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Send_Warning_Mail]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[mon_Send_Warning_Mail]
GO

View File

@@ -0,0 +1,254 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Medor]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[Medor]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[Medor]
@in_debug int = null,
@in_Search sysname,
@max_recursion int = 0
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette SP sert à chercher dans l'ensemble des bases le texte passé en paramétre dans les SP, trigger etc... et les jobs
Contexte d'utilisation
----------------------
Cette SP est appelée à la main
Parametres
----------
@in_debug : non utilisé pour le moment
@in_Search : texte à chercher
@max_recursion : nombre maximum de récursion (défaut 0)
Creation : 25.07.17 / FLA
Modifications :
=============================================================================*/
set nocount on;
declare @result_sp int,
@errno int,
@errmsg varchar(255)
/*------------------- Declaration des variables --------------------*/
declare @cmd varchar(max),
@name sysname
/*------------ Affectation des parametres aux variables ------------*/
/*-------------------------- Traitement ---------------------------*/
create table #ObjectLink
(
OL_guid uniqueidentifier default newid(),
OL_Database sysname,
OL_schema sysname,
OL_sysobject_name sysname,
OL_contained_piece sysname,
OL_TexteAround varchar(110),
OL_recursion_level int,
OL_sysobject_id int,
OL_sysobject_xtype char (2)
)
;
CREATE NONCLUSTERED INDEX Ix_ObjectLink_OL_sysobject_name ON #ObjectLink(OL_sysobject_name)
;
CREATE NONCLUSTERED INDEX Ix_ObjectLink_OL_contained_piece ON #ObjectLink(OL_contained_piece)
;
declare c_databases cursor local forward_only static for
SELECT name
FROM sys.databases
ORDER BY name
open c_databases
;
FETCH NEXT FROM c_databases
into @name
while @@fetch_status = 0
begin
select @cmd = 'insert into #ObjectLink
(OL_Database,OL_schema,OL_sysobject_name, OL_contained_piece, OL_TexteAround, OL_recursion_level, OL_sysobject_id, OL_sysobject_xtype)
(
select distinct '''+@name+''',OBJECT_SCHEMA_NAME (so.id,DB_ID('''+@name+''')), so.name, '''+@in_Search+''' ''contained_piece'', SUBSTRING(sc.text,CHARINDEX('''+@in_Search+''',sc.text,0)-50,100) ''Texte around'', 0 ''recursion_level'', so.id, so.xtype
from '+@name+'..syscomments sc with (nolock)
join '+@name+'..sysobjects so with (nolock)
on so.id = sc.id
and so.name not like ''dt[_]%''
where sc.text like ''%'+@in_Search+'%''
and so.name <> '''+@in_Search+'''
)
;
insert into #ObjectLink
(OL_Database,OL_schema,OL_sysobject_name, OL_contained_piece, OL_TexteAround, OL_recursion_level, OL_sysobject_id, OL_sysobject_xtype)
(
select distinct '''+@name+''',OBJECT_SCHEMA_NAME (so.id,DB_ID('''+@name+''')), so.name, '''+@in_Search+''' ''contained_piece'', NULL ''Texte around'', 0 ''recursion_level'', so.id, so.xtype
from '+@name+'..sysobjects so with (nolock)
where so.name not like ''dt[_]%''
and so.name = '''+@in_Search+'''
)
;
declare @ObjectLinkCount_before int,
@ObjectLinkCount_after int,
@recursion int
;
select @ObjectLinkCount_before = 0
;
select @ObjectLinkCount_after = count (*) from #ObjectLink
;
select @recursion = 0
;
while @recursion < '+CAST(@max_recursion as varchar(2))+'
and @ObjectLinkCount_after > @ObjectLinkCount_before
begin
select @recursion = @recursion + 1
;
select @ObjectLinkCount_before = @ObjectLinkCount_after
;
insert into #ObjectLink
(OL_Database,OL_schema,OL_sysobject_name, OL_contained_piece, OL_TexteAround, OL_recursion_level, OL_sysobject_id, OL_sysobject_xtype)
(
select distinct '''+@name+''',OBJECT_SCHEMA_NAME (so.id,DB_ID('''+@name+''')), so.name, ol.OL_sysobject_name ''contained_piece'',SUBSTRING(sc.text,CHARINDEX('''+@in_Search+''',sc.text,0)-50,100) ''Texte around'', @recursion ''recursion_level'', so.id, so.xtype
from '+@name+'..syscomments sc with (nolock)
join '+@name+'..sysobjects so with (nolock)
on so.id = sc.id
and so.name not like ''dt[_]%''
join #ObjectLink ol
on sc.text like ''%'' + ol.OL_sysobject_name + ''%''
and so.name not in (select OL_sysobject_name from #ObjectLink union all select OL_contained_piece from #ObjectLink )
and ol.OL_recursion_level = @recursion-1
)
;
select @ObjectLinkCount_after = count (*) from #ObjectLink
;
end /* end while */
;'
--select @cmd
exec (@cmd)
FETCH NEXT FROM c_databases
into @name
;
end
;
close c_databases
;
deallocate c_databases
select OL_recursion_level,
OL_sysobject_xtype,
case OL_sysobject_xtype
when 'F' then 'Aggregate function (CLR)'
when 'C ' then 'CHECK constraint'
when 'D ' then 'Default or DEFAULT constraint'
when 'F ' then 'FOREIGN KEY constraint'
when 'L ' then 'Log'
when 'FN ' then 'Scalar function'
when 'FS ' then 'Assembly (CLR) scalar-function'
when 'FT ' then 'Assembly (CLR) table-valued function'
when 'IF ' then 'In-lined table-function'
when 'IT ' then 'Internal table'
when 'P ' then 'Stored procedure'
when 'PC ' then 'Assembly (CLR) stored-procedure'
when 'PK ' then 'PRIMARY KEY constraint (type is K)'
when 'RF ' then 'Replication filter stored procedure'
when 'S ' then 'System table'
when 'SN ' then 'Synonym'
when 'SQ ' then 'Service queue'
when 'TA ' then 'Assembly (CLR) DML trigger'
when 'TF ' then 'Table function'
when 'TR ' then 'SQL DML Trigger'
when 'TT ' then 'Table type'
when 'U ' then 'User table'
when 'UQ ' then 'UNIQUE constraint (type is K)'
when 'V ' then 'View'
when 'X ' then 'Extended stored procedure'
else 'unknown xtype'
end 'xtype_text',
OL_schema, OL_Database, OL_sysobject_name, OL_contained_piece, OL_TexteAround
from #ObjectLink ol
order by OL_recursion_level, OL_sysobject_xtype,OL_Database,OL_schema, OL_sysobject_name, OL_contained_piece
;
/*------------------------------------------------------------------------------------------------
Retourne les jobs qui appellent le bout de texte cherché
------------------------------------------------------------------------------------------------*/
select distinct *
from
(
select sj.name 'job_name',
sjs.step_id,
sjs.step_name,
@in_Search 'contained_piece',
SUBSTRING(sjs.command,CHARINDEX(''+@in_Search+'',sjs.command,0)-50,100) 'Texte around'
from msdb.dbo.sysjobs sj with (nolock)
join msdb.dbo.sysjobsteps sjs with (nolock)
on sjs.job_id = sj.job_id
where sjs.command like '%' + @in_Search + '%'
union
select sj.name 'job_name',
sjs.step_id,
sjs.step_name,
ol.OL_contained_piece 'contained_piece',
SUBSTRING(sjs.command,CHARINDEX(''+ol.OL_contained_piece+'',sjs.command,0)-50,100) 'Texte around'
from msdb.dbo.sysjobs sj with (nolock)
join msdb.dbo.sysjobsteps sjs with (nolock)
on sjs.job_id = sj.job_id
join #ObjectLink ol
on sjs.command like '%' + ol.OL_contained_piece + '%'
WHERE ol.OL_contained_piece <> @in_Search
union
select sj.name 'job_name',
sjs.step_id,
sjs.step_name,
ol.OL_sysobject_name 'contained_piece',
SUBSTRING(sjs.command,CHARINDEX(''+ol.OL_sysobject_name+'',sjs.command,0)-50,100) 'Texte around'
from msdb.dbo.sysjobs sj with (nolock)
join msdb.dbo.sysjobsteps sjs with (nolock)
on sjs.job_id = sj.job_id
join #ObjectLink ol
on sjs.command like '%' + ol.OL_sysobject_name + '%'
WHERE ol.OL_sysobject_name <> @in_Search
) vJobs
order by vJobs.job_name, vJobs.step_id, vJobs.contained_piece
;
DROP TABLE #ObjectLink
/*------------------ Retour au programme appelant -----------------*/
return(@@error);
/*---------------------- Traitement des erreurs ----------------------*/
error_99:
raiserror (@errmsg, 16, 1);
return(@errno);
GO

View File

@@ -0,0 +1,110 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Purge_Monitoring_History]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[Purge_Monitoring_History]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[Purge_Monitoring_History]
@in_debug int = null
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette SP sert à purger l'historique des enregistrements de monitoring
Contexte d'utilisation
----------------------
Cette SP est appelée par le job W93040 - Clean-up monitoring history
Parametres
----------
@in_debug :
Creation : 05.11.21 / RTC 66785 Standardize and extend job W93040 - Clean-up monitoring history
=============================================================================*/
SET NOCOUNT ON;
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
/* Purge tables related to performance monitoring : retention 6 months */
IF EXISTS (SELECT *
FROM [HCITools].sys.objects o WITH (NOLOCK)
WHERE o.name = 'Monitoring_history'
AND o.type IN (N'U'))
BEGIN
DELETE
FROM HCITools.dbo.Monitoring_history
WHERE MH_datetime < DATEADD(MM,-6,getdate())
END
IF EXISTS (SELECT *
FROM [HCITools].sys.objects o WITH (NOLOCK)
WHERE o.name = 'Monitor_wait_stats'
AND o.type IN (N'U'))
BEGIN
DELETE
FROM HCITools.dbo.Monitor_wait_stats
WHERE MWS_value_date < DATEADD(MM,-6,getdate())
END
IF EXISTS (SELECT *
FROM [HCITools].sys.objects o WITH (NOLOCK)
WHERE o.name = 'Monitor_disk_latency'
AND o.type IN (N'U'))
BEGIN
DELETE
FROM HCITools.dbo.Monitor_disk_latency
WHERE collection_date < DATEADD(MM,-6,getdate())
END
/* Purge tables related to blocking session : retention 1 month */
IF EXISTS (SELECT *
FROM [HCITools].sys.objects o WITH (NOLOCK)
WHERE o.name = 'BlockingSessionInfo'
AND o.type IN (N'U'))
BEGIN
DELETE
FROM HCITools.dbo.BlockingSessionInfo
WHERE AlertTime < DATEADD(MM,-1,getdate())
END
/*Purge tables related to monitoring alerts : retention 1 month*/
IF EXISTS (SELECT 1
FROM sys.objects o WITH (NOLOCK)
JOIN sys.schemas s WITH (NOLOCK) ON o.schema_id = s.schema_id
WHERE o.name = 'DBA_monitoring_alerts_history'
AND o.type IN (N'U')
AND s.name = 'mon')
BEGIN
DELETE
FROM HCITools.mon.DBA_monitoring_alerts_history
WHERE DBAMAH_event_date < DATEADD(MM,-1,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

View File

@@ -0,0 +1,119 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Purge_Replication_Backup]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[Purge_Replication_Backup]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[Purge_Replication_Backup]
@in_debug int = null
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette SP sert à conserver uniquement le dernier backup de replication et supprimer les autres
Contexte d'utilisation
----------------------
Cette SP est appelée par le job D93120 - Purge Replication Backup
Parametres
----------
@in_debug : affichage des fichiers à supprimer
Creation : 19.04.17 / FLA
Modifications : 21.09.20 / RTC TFS 61470 Adapt sp after shared file config changes
19.02.21 / SPE #TFS63889# - Change job D93120 - Purge Replication Backup according to new settings
=============================================================================*/
SET NOCOUNT ON;
/*------------------- Declaration des variables --------------------*/
DECLARE @FileName varchar(255),
@Path varchar(255),
@dbVersion varchar(20),
@FileToDelete varchar(350)
/*------------ Affectation des parametres aux variables ------------*/
SET @dbVersion = ActivePos_write.upd.DatabaseVersion()
SET @FileName = 'ActivePos_read.' + @dbVersion + '.bak'
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
/* Parcours de l'ensemble des dossiers d'ini */
DECLARE c_Folders CURSOR LOCAL FORWARD_ONLY STATIC FOR
SELECT CONVERT(VARCHAR(400), SettingValue) + '\' as [path]
FROM ActiveSystemServer.cfg.Settings
WHERE SettingId like 'Values.Modules.Replication.DbInitializationBackupPath%'
AND len(SettingValue) > 1
UNION ALL
SELECT CONVERT(VARCHAR(400), SettingValue) + '\' as [path]
FROM ActivePos_server.dbo.Settings
WHERE SettingId like 'Values.Pharmacy.DbInitializationBackupPath%'
AND len(SettingValue) > 1
OPEN c_Folders;
FETCH NEXT FROM c_Folders
INTO @Path
WHILE @@fetch_status = 0
BEGIN
/* Parcours de l'ensemble des fichiers de backup sauf le dernier en date */
DECLARE c_FileNames CURSOR LOCAL FORWARD_ONLY STATIC FOR
SELECT Filename
FROM [dbo].[aps_Directory_Get_Files](@Path, '*.bak')
WHERE Filename <> @FileName
ORDER BY Filename
OPEN c_FileNames;
FETCH NEXT FROM c_FileNames
INTO @FileToDelete
WHILE @@fetch_status = 0
BEGIN
SET @FileToDelete = @Path + @FileToDelete
IF @in_debug = 1
PRINT @FileToDelete
ELSE
EXEC dbo.aps_File_Delete @path = @FileToDelete
FETCH NEXT FROM c_FileNames
INTO @FileToDelete
END
CLOSE c_FileNames
DEALLOCATE c_FileNames
FETCH NEXT FROM c_Folders
INTO @Path
END
CLOSE c_Folders
DEALLOCATE c_Folders
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
GO

View File

@@ -0,0 +1,103 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Purge_Synchro_Label]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[Purge_Synchro_Label]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[Purge_Synchro_Label]
@in_debug int = null,
@in_NbMonths int = 3
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette SP sert à supprimer les labels de plus de X jours
Contexte d'utilisation
----------------------
Cette SP est appelée par le job D93100 - Purge Synchro Label
Parametres
----------
@in_debug : non utilisé
@in_NbMonths : nombre de mois glissant à conserver (3 par défaut)
Creation : 28.10.16 / FLA
Modifications :
=============================================================================*/
set nocount on;
/*------------------- Declaration des variables --------------------*/
declare @MaxDate bigint,
@Directory varchar (255),
@Path varchar(500),
@FullPath varchar(500)
/*------------ Affectation des parametres aux variables ------------*/
SET @MaxDate = CAST(CONVERT(nvarchar(30), DateAdd(mm,-@in_NbMonths,getdate()), 112)+'000000000' as bigint)
SELECT @Path = HCIP_value FROM HCITools.dbo.HCI_PARAMS WHERE HCIP_key = 'LBLPATH'
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
/* séléction de l'ensemble des répertoires commençant par 20, de format numérique et d'une taille de 17 */
declare c_Directories cursor local forward_only static for
SELECT DirectoryName FROM [dbo].[aps_Directory_Get_Directories] (@Path,'20*')
where ISNUMERIC(DirectoryName) = 1
AND LEN(DirectoryName) = 17
open c_Directories
;
FETCH NEXT FROM c_Directories
into @Directory
/* Parcour des répertoires */
while @@fetch_status = 0
begin
/* Si le répertoire est un répertoire de plus de 3 mois alors on le supprime */
IF CAST(@Directory as bigint) < @MaxDate
BEGIN
SET @FullPath = @Path + @Directory
exec dbo.aps_Directory_Delete @path = @FullPath, @recursive=1
END
FETCH NEXT FROM c_Directories
into @Directory
end
close c_Directories
deallocate c_Directories
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
GO

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,138 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dba].[Restore_all_principal_permission]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dba].[Restore_all_principal_permission]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dba].[restore_all_principal_permission]
@in_param_label datetime,
@in_debug int = null
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette SP sert à restaurrer les sécurités sauvegardé pour toutes les bases.
Contexte d'utilisation
----------------------
Cette SP doit être appélée après les mises à jour de nouvelle version.
Parametres
----------
@in_debug : Si 1 alors on fait un print des commandes de restore
Creation : 18.11.16 / RTC
=============================================================================*/
set nocount on;
declare @result_sp int,
@errno int,
@errmsg varchar(255)
/*------------------------ Test des parametres input ------------------------*/
if (@in_param_label is null)
begin
select @errno = 70003,
@errmsg = '(APS) Invalid input parameter label !'
goto error_99
end
if not exists (select 1 from HCITools.dba.Principal_Permission where PP_timestamp = CONVERT(datetime, @in_param_label,121))
begin
select @errno = 70003,
@errmsg = '(DBA) No label found to restore principal permission ! ' + @in_param_label
goto error_99
end
/*------------------- Declaration des variables --------------------*/
declare @name varchar (255),
@cmd varchar (8000),
@xml XML,
@delimiter VARCHAR(1),
@param_group_counter_list NVARCHAR(3000),
@label datetime
select @param_group_counter_list = HCIP_value
from HCITools.dbo.HCI_PARAMS
where HCIP_key = 'BKP_NOT_DB'
set @delimiter = ','
set @xml = CAST(('<X>'+REPLACE(@param_group_counter_list, @delimiter, '</X><X>')+'</X>') AS XML)
declare c_databases cursor local forward_only static for
select name
from sys.databases
where LOWER(name) not in (SELECT C.value('.', 'varchar(3000)') AS value FROM @xml.nodes('X') AS X(C))
AND state = 0
order by name
;
/*------------ Affectation des parametres aux variables ------------*/
select @errno = 0
;
SET @errmsg = ''
;
select @label = CONVERT(datetime, @in_param_label,121);
;
/*-------------------------- Traitement ---------------------------*/
open c_databases
;
FETCH NEXT FROM c_databases
into @name
;
while @@fetch_status = 0
begin
/* Backup */
begin try
print '---------------------------------------'
print '--Start processing database : ' + @name
execute [HCITools].[dba].[restore_principal_permission] @name ,@label ,@in_debug
end try
begin catch
select @errno = 70003,
@errmsg = @errmsg + 'restore all permissions failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13)
;
goto error_99
end catch
;
FETCH NEXT FROM c_databases
into @name
;
end
;
close c_databases
;
deallocate c_databases
;
/*------------------ Retour au programme appelant -----------------*/
return(@@error);
/*---------------------- Traitement des erreurs ----------------------*/
error_99:
raiserror(@errmsg, 14, 1)
return(@errno)
;
go

View File

@@ -0,0 +1,115 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dba].[Restore_principal_permission]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dba].[Restore_principal_permission]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dba].[Restore_principal_permission]
@in_param_database_name varchar (255) = null,
@in_param_label datetime = null,
@in_debug int = null
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette Sp sert a rétablir à partir d'une sauvegarde les droits et sécurités pour une base donnée.
Contexte d'utilisation
----------------------
Cette Sp est utilisée lors de la mise à jour des environnements afin de ,
restaurer les droits à la fin de la mise à jour.
Parametres
----------
@in_database_name = nom de la base
@@in_label = Label de l'extraction
Creation : 17.11.16 / rtc
Dossier : #35262# + Security - Backup and restore SQL objects security
Modifications :
DD.MM.YY / xxx :
=============================================================================*/
SET NOCOUNT ON;
declare @result_sp int,
@errno int,
@errmsg varchar(255);
/*------------------------ Test des parametres input ------------------------*/
if @in_param_database_name is null
or (@in_param_label is null)
begin
select @errno = 70003,
@errmsg = '(APS) Invalid input parameters !'
goto error_99
end
if not exists (select 1 from HCITools.dba.Principal_Permission where PP_timestamp = CONVERT(datetime, @in_param_label,121))
begin
select @errno = 70003,
@errmsg = '(DBA) No label found to restore principal permission ! ' + @in_param_label
goto error_99
end
/*------------------- Declaration des variables --------------------*/
declare @cmd varchar (max);
declare @label datetime,
@database_name varchar (255),
@database_id int;
/*------------ Affectation des parametres aux variables ------------*/
select @label = CONVERT(datetime, @in_param_label,121);
select @database_name = @in_param_database_name
select top 1 @database_id = database_id
from sys.databases
where name = @database_name
select @cmd = ''
/*-------------------------- Traitement ---------------------------*/
begin try
select @cmd = @cmd + PP_apply_permission_command + CHAR(13)
from HCITools.dba.Principal_Permission
where len(PP_apply_permission_command) > 3
and PP_timestamp = CONVERT(datetime, @label,121)
and PP_database_name = @database_name
select @cmd= 'USE ' + @database_name +';' + CHAR(13) + @cmd
if (@in_Debug = 1)
print @cmd;
else
exec (@cmd)
end try
begin catch
select @errno = 70000,
@errmsg = 'Error occured when restoring principals !! ' + ERROR_MESSAGE()
;
goto error_99
end catch
/*------------------ Retour au programme appelant -----------------*/
return(ISNULL(@@error,0));
/*---------------------- Traitement des erreurs ----------------------*/
error_99:
raiserror(@errmsg, 14, 1)
return(@errno)
;
go

View File

@@ -0,0 +1,218 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects o JOIN sys.schemas s ON o.schema_id = s.schema_id WHERE o.name = 'Retrieve_Data_Interbase' AND OBJECTPROPERTY(object_id,N'IsProcedure') = 1 AND s.name = 'dba')
DROP PROCEDURE [dba].[Retrieve_Data_Interbase]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dba].[Retrieve_Data_Interbase]
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette SP est executee tous les jours et effectue le rattrapage des donnees entre SUNCENT et AMACENT par rapport a une table.
1: Recuperation du login et de la date
2: Reprise des top 40 000 de la table [HCItools].[dba].[TT_AMR_interbase_to_retrieve] et isTreated = 0 puis mise en table temporaire
3: Curseur sur la table temporaire avec le distinct table name
4: Dummy update sur les records concernes sur SUNCENT
5: Update AMR (AMR_type_of_change = 2) selon variables @currentlogin et @currentdate et current SPID
6: Flag is isTreated = 1 sur la table [HCItools].[dba].[TT_AMR_interbase_to_retrieve]
Parametres
----------
Creation : 28.04.2021 / SPE
Modifications :
=============================================================================*/
SET NOCOUNT ON;
/*------------------- Declaration des variables --------------------*/
DECLARE @errno int,
@errmsg varchar(255),
@tableName varchar(60),
@currentlogin sysname,
@currentdate datetime,
@pkname sysname,
@pktype sysname,
@colName varchar(255)
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
/* 1: Recuperation du login et de la date */
SET @currentlogin = SYSTEM_USER
SET @currentdate = getdate()
/* 2: Reprise des top 40 000 de la table [HCItools].[dba].[TT_AMR_interbase_to_retrieve] et isTreated = 0 puis mise en table temporaire */
CREATE TABLE #TT_current_AMR([AMRREF_AMR_table_name] [varchar](60) NULL,[AMRREF_row_ID] [int] NULL,[AMRREF_AMR_row_GUID] [varchar](60) NULL)
INSERT INTO #TT_current_AMR([AMRREF_AMR_table_name],[AMRREF_row_ID],[AMRREF_AMR_row_GUID])
SELECT TOP 40000 [AMRREF_AMR_table_name],[AMRREF_row_ID],[AMRREF_AMR_row_GUID] FROM [HCItools].[dba].[TT_AMR_interbase_to_retrieve] WHERE IsTreated = 0 ORDER BY [AMRREF_AMR_APS_TS]
/* 3: Curseur sur la table temporaire avec le distinct table name */
DECLARE c_alltables CURSOR LOCAL FORWARD_ONLY STATIC FOR
SELECT AMRREF_AMR_table_name
FROM #TT_current_AMR
GROUP BY AMRREF_AMR_table_name
ORDER BY AMRREF_AMR_table_name
;
OPEN c_alltables
;
FETCH NEXT FROM c_alltables
INTO @tableName
;
WHILE @@fetch_status = 0
BEGIN
SET @Colname = NULL
/* 4: Dummy update sur les records concernes sur SUNCENT */
/* get target PK column name and type */
select @pkname = c.[name], @pktype =col.data_type
from arizona.sys.tables t with (nolock)
join arizona.sys.indexes i with (nolock)
on i.[object_id] = t.[object_id]
and i.is_primary_key = 1
join arizona.sys.index_columns ic with (nolock)
on ic.index_id = i.index_id
and ic.[object_id] = i.[object_id]
join arizona.sys.[columns] c with (nolock)
on c.[object_id] = ic.[object_id]
and c.column_id = ic.column_id
join arizona.INFORMATION_SCHEMA.COLUMNS col
on col.column_name = c.name
and col.table_name = t.[name]
where t.[name] = @tableName;
SELECT TOP 1 @Colname = COLUMN_NAME
FROM arizona.information_schema.columns
WHERE table_name = @tableName
AND DATA_TYPE = 'bit'
AND IS_NULLABLE = 'NO'
IF @Colname is null
BEGIN
SELECT TOP 1 @Colname = COLUMN_NAME
FROM arizona.information_schema.columns
WHERE table_name = @tableName
AND CHARACTER_MAXIMUM_LENGTH > 0
AND IS_NULLABLE = 'NO'
ORDER BY CHARACTER_MAXIMUM_LENGTH ASC
END
IF @Colname is null
BEGIN
SELECT TOP 1 @Colname = COLUMN_NAME
FROM arizona.information_schema.columns
WHERE table_name = @tableName
AND DATETIME_PRECISION is not null
AND IS_NULLABLE = 'NO'
END
IF @Colname is null
BEGIN
SELECT TOP 1 @Colname = COLUMN_NAME
FROM arizona.information_schema.columns
WHERE table_name = @tableName
AND NUMERIC_PRECISION is not null
AND IS_NULLABLE = 'NO'
AND COLUMN_NAME <> @PKname
END
if @pktype = 'int'
BEGIN
/* dummy update */
EXEC('UPDATE prod
SET prod.' + @Colname +' = prod.' + @Colname +'
FROM #TT_current_AMR tt
JOIN arizona.dbo.' + @tableName +' prod
ON tt.AMRREF_row_ID = prod.' + @pkname +'
WHERE tt.AMRREF_AMR_table_name = ''' + @tableName + '''')
END
ELSE
BEGIN
/* dummy update */
EXEC('UPDATE prod
SET prod.' + @Colname +' = prod.' + @Colname +'
FROM #TT_current_AMR tt
JOIN arizona.dbo.' + @tableName +' prod
ON tt.AMRREF_AMR_row_GUID = prod.' + @pkname +'
WHERE tt.AMRREF_AMR_table_name = ''' + @tableName + '''')
END
FETCH NEXT FROM c_alltables
INTO @tableName
;
END
;
CLOSE c_alltables
;
DEALLOCATE c_alltables
/* 5: Update AMR (AMR_type_of_change = 2) selon variables @currentlogin et @currentdate et current SPID */
UPDATE arizona.dbo.aps_monitor_row
SET AMR_type_of_change = 2
WHERE AMR_APS_TS >= @currentdate
AND AMR_system_user = @currentlogin
AND AMR_SQL_spid = @@SPID
AND AMR_type_of_change IN (0,1)
/* 6: Flag is isTreated = 1 sur la table [HCItools].[dba].[TT_AMR_interbase_to_retrieve] */
UPDATE TTAMR
SET isTreated = 1
FROM [HCItools].[dba].[TT_AMR_interbase_to_retrieve] TTAMR
JOIN #TT_current_AMR TT
ON TT.AMRREF_AMR_table_name = TTAMR.AMRREF_AMR_table_name
AND TT.AMRREF_row_ID = TTAMR.AMRREF_row_ID
UPDATE TTAMR
SET isTreated = 1
FROM [HCItools].[dba].[TT_AMR_interbase_to_retrieve] TTAMR
JOIN #TT_current_AMR TT
ON TT.AMRREF_AMR_table_name = TTAMR.AMRREF_AMR_table_name
AND TT.AMRREF_AMR_row_GUID = TTAMR.AMRREF_AMR_row_GUID
DROP TABLE #TT_current_AMR
END TRY
BEGIN CATCH
SELECT @errno = 70003,
@errmsg = 'error on Retrieve_Data_Interbase! ' + error_message()
goto error_99
END CATCH;
/*------------------ Retour au programme appelant -----------------*/
RETURN(@@error);
/*---------------------- Traitement des erreurs ----------------------*/
error_99:
RAISERROR (@errmsg, 16, 1);
RETURN(@errno);
GO

View File

@@ -0,0 +1,228 @@
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Set_TempDB]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[Set_TempDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[Set_TempDB]
@in_debug int = null,
@in_Entity varchar(4),
@in_Mode smallint = 1
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette SP sert à paramètrer les fichiers de tempDB et les resizer correctement en fonction du nombre de CPU
Contexte d'utilisation
----------------------
Cette SP peut être appelé dans SSMS pour l'initalisation de tempDB
Cette SP est appelé par le job _9402X - FLA -Redefine TempDB file Size
Parametres
----------
@in_debug : affiche les commandes qui vont être executées
@in_Entity : SUN, AMA, AAI, CVI, RUEG
@in_Mode : 0 = init de tempDB, 1 = Mise à jour de la taille des fichiers de tempDB
Creation : 01.11.16 / FLA
Modifications : 09.01.2017 / FLA : Ajout de CVI
07.02.2017 / RTC : Update AAI initial file size
13.03.2017 / RTC : Update initial file size for AAI from 256 to 384.
29.03.2017 / RTC : Update initial file size for AAI to 512 and auto growth to 128.
20.12.2018 / SPE : #TFS49408# Migrate identification table [master].[cfg].[Identity]
02.10.2019 / SPE : #TFS55659# change tempdb initial size 1056
16.10.2019 / SPE : #TFS55659# change tempdb initial size 1152
23.10.2019 / SPE : #TFS55659# change tempdb initial size 1280 (GC) 1024 (AAI)
09.12.2019 / SPE : Change templog initial size to 2048 for GC
=============================================================================*/
set nocount on;
/*------------------- Declaration des variables --------------------*/
declare @NbCPU INT,
@AutoGrow INT,
@FileSize INT,
@LogicalName VARCHAR(255),
@PhysicalName VARCHAR(255),
@FilePath VARCHAR(255),
@i INT,
@sql VARCHAR(255),
@file_id INT,
@FileName VARCHAR(255),
@LogAutoGrow INT,
@LogFileSize INT,
@cmd varchar(200);
/*------------ Affectation des parametres aux variables ------------*/
IF ((@in_Entity = 'AAI') or (@in_Entity = 'RUEG'))
BEGIN
/*in MB */
SET @AutoGrow = 128;
SET @FileSize = 1024;
SET @LogFileSize = 1024;
SET @LogAutoGrow = 128;
END
ELSE
BEGIN
/*in MB */
SET @AutoGrow = 128;
SET @FileSize = 1280;
SET @LogFileSize = 2048;
SET @LogAutoGrow = 256;
END
SET @i = 2;
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
IF (SELECT ((size*8)/1024) as SIZE_IN_MB from sys.master_files where database_id=2 and Name = 'tempdev') > @FileSize
BEGIN
PRINT 'Current tempdb FileSize is larger than the variable @FileSize! Leave this SP.'
RETURN
END
IF @in_Mode = 0
BEGIN
/*********************************************************************************************************************************/
/* Ce script créer automatiquement des fichiers tempDB sizé à l'identique en fonction du nombre de CPU, de l'espace disk etc... */
/*********************************************************************************************************************************/
/* Check if tempDB is already sized*/
IF (select count(file_id)
FROM tempdb.sys.dm_db_file_space_usage) <= 1
BEGIN
/* Get get actual tempDB file size and path for tempDB file*/
SELECT @PhysicalName = physical_name,
@LogicalName = name
FROM tempdb.sys.database_files
WHERE type = 0
SET @FilePath = REVERSE(RIGHT(REVERSE(@PhysicalName),(LEN(@PhysicalName)-CHARINDEX('\', REVERSE(@PhysicalName),1))+1));
SET @PhysicalName = SUBSTRING(@PhysicalName,LEN(@FilePath)+1,LEN(@PhysicalName)-LEN(@FilePath)-4);
/* Get number of CPU */
SELECT @NbCPU = cpu_count
FROM sys.dm_os_sys_info
/* Check if CPU >= 8 */
IF @NbCPU >= 8
BEGIN
SET @NbCPU = 8
END
WHILE (@i <= @NbCPU)
BEGIN
SET @sql = 'ALTER DATABASE [tempdb] ADD FILE ( NAME = N'''+ @LogicalName + CONVERT(VARCHAR(1),@i)+''' , FILENAME = N'''+ @FilePath + @PhysicalName +CONVERT(VARCHAR(1),@i)+'.ndf'', SIZE = '+ CONVERT(VARCHAR(20),@FileSize) +' , FILEGROWTH = '+ CONVERT(VARCHAR(20),@AutoGrow) +')'
IF @in_debug = 1
PRINT @sql
ELSE
EXEC(@sql)
SET @i = @i+1
END
END
ELSE
PRINT 'TempDB is already sized';
/*********************************************************************************************************************************/
/* Ce script shrink et resize automatiquement le fichiers de log de tempDB en fonction des paramètres en entrée */
/*********************************************************************************************************************************/
/* Get File id and file path of tempDB log file */
SELECT @file_id = file_id,
@FilePath = physical_name,
@FileName = name
FROM tempdb.sys.database_files
WHERE type = 1
SET @cmd = 'USE tempDB;
/* SHRINK the tempDB file log */
DBCC SHRINKFILE ('+CAST(@file_id as varchar(3))+') WITH NO_INFOMSGS';
EXEC (@cmd)
/* Change the size of tempDB log file */
SET @sql = 'ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'''+ @FileName + ''', FILENAME = N'''+ @FilePath + ''', SIZE = '+ CONVERT(VARCHAR(20),@LogFileSize) +' , FILEGROWTH = '+ CONVERT(VARCHAR(20),@LogAutoGrow) +')'
IF @in_debug = 1
PRINT @sql
ELSE
EXEC(@sql)
END
ELSE IF @in_Mode = 1
BEGIN
DECLARE c_Files CURSOR FOR
SELECT file_id,
physical_name,
name
FROM tempdb.sys.database_files
WHERE type = 0
open c_Files
FETCH NEXT FROM c_Files
into @file_id, @FilePath, @FileName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @cmd = 'USE tempDB;
/* SHRINK the tempDB file log */
DBCC SHRINKFILE ('+CAST(@file_id as varchar(3))+') WITH NO_INFOMSGS';
EXEC (@cmd)
/* Change the size of tempDB file */
SET @sql = 'ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'''+ @FileName + ''', FILENAME = N'''+ @FilePath + ''', SIZE = '+ CONVERT(VARCHAR(20),@FileSize) +' , FILEGROWTH = '+ CONVERT(VARCHAR(20),@AutoGrow) +')'
IF @in_debug = 1
PRINT @sql
ELSE
EXEC(@sql)
FETCH NEXT FROM c_Files
into @file_id, @FilePath, @FileName
END
CLOSE c_Files
DEALLOCATE c_Files
IF @in_Entity = 'SUN'
EXEC msdb.dbo.sp_update_job @job_name='_94021 - Redefine TempDB file Size',@enabled = 0
IF @in_Entity = 'AMA'
EXEC msdb.dbo.sp_update_job @job_name='_94022 - Redefine TempDB file Size',@enabled = 0
IF @in_Entity = 'AAI'
EXEC msdb.dbo.sp_update_job @job_name='_94023 - Redefine TempDB file Size',@enabled = 0
IF @in_Entity = 'RUEG'
EXEC msdb.dbo.sp_update_job @job_name='_94023 - Redefine TempDB file Size',@enabled = 0
IF @in_Entity = 'CVI'
EXEC msdb.dbo.sp_update_job @job_name='_94024 - Redefine TempDB file Size',@enabled = 0
END
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info;
END CATCH
GO

View File

@@ -0,0 +1,99 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Wait_For_LkSrv]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[Wait_For_LkSrv]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[Wait_For_LkSrv]
@in_debug tinyint = 0,
@in_LkSrv sysname,
@in_Minutes smallint = 30
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
La SP sert à attendre que le Linked Server soit disponible
Contexte d'utilisation
----------------------
Appelé depuis n'importe quel job
Parametres
----------
@in_debug : non utilisé
@in_LkSrv : nom du Linked Server
@in_Minutes = Nombre de minutes maximal à attendre le Linked Server (30 par défaut)
Creation : 27.10.16 / FLA
Modifications :
=============================================================================*/
set nocount on;
/*------------------- Declaration des variables --------------------*/
declare @Datetime_For_Exit datetime,
@LkdSrv_is_OK int
/*------------ Affectation des parametres aux variables ------------*/
select @Datetime_For_Exit = dateadd(mi, @in_Minutes, getdate()),
@LkdSrv_is_OK = 0
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
/* ON ATTEND QUE LE LINKED-SERVER SOIT ATTEIGNABLE */
/* ET ON LAISSE TOMBER S'IL NE L'EST PAS AU BOUT DE X MINUTES */
while @LkdSrv_is_OK = 0
and getdate() < @Datetime_For_Exit
begin
BEGIN TRY
exec @LkdSrv_is_OK = sp_testlinkedserver @server = @in_LkSrv
;
/* SI ON EST ICI, C'EST BON !! */
select @LkdSrv_is_OK = 1
;
END TRY
BEGIN CATCH
/* ON ATTEND 5 MINUTES */
waitfor delay '00:05:00'
;
END CATCH
;
end /* while */
if @LkdSrv_is_OK = 0
begin
RAISERROR ('Error dans la SP Wait_For_LkSrv : Le linked-server est inaccessible.',16,1)
end
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
GO

View File

@@ -0,0 +1,77 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Wait_Random_Time]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[Wait_Random_Time]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[Wait_Random_Time]
@in_debug tinyint = 0,
@in_Minutes smallint
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
La SP sert à attendre un temps aléatoire compris entre 0 et une valeur définie
Contexte d'utilisation
----------------------
Appelé depuis n'importe quel job
Parametres
----------
@in_debug : non utilisé
@in_Minutes : temps maximum en minute
Creation : 27.10.16 / FLA
Modifications : 28.10.2016 / FLA : Standardisation de la gestion des erreurs
=============================================================================*/
set nocount on;
/*------------------- Declaration des variables --------------------*/
declare @delay int,
@time datetime,
@errno int,
@errmsg varchar(255)
/*------------ Affectation des parametres aux variables ------------*/
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
select @delay = rand()* 60 * @in_Minutes
select @time = dateadd(ss,@delay, '01.01.1900')
waitfor delay @time
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
GO

View File

@@ -0,0 +1,182 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Wait_Random_Time_Sunday]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[Wait_Random_Time_Sunday]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[Wait_Random_Time_Sunday]
@in_debug tinyint = 0,
@in_Minutes smallint
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
La SP sert à attendre un temps aléatoire compris entre 0 et une valeur définie seulement pour les pharmacies qui ne sont pas ouvertes le dimanche et pour les centrales
Contexte d'utilisation
----------------------
Appelé depuis n'importe quel job
Parametres
----------
@in_debug : non utilisé
@in_Minutes : temps maximum en minute
Creation : 15.08.19 / SPE
Modifications : 29.10.19 / SPE : Ajout de la partie centrales
21.11.19 / SPE : Ajout verification du jour si dimanche et ne pas faire de random sur les centrales GC
=============================================================================*/
set nocount on;
/*------------------- Declaration des variables --------------------*/
DECLARE @errno int,
@cvCurrentOrganizationalUnit int,
@subsidiary_id int,
@delay int,
@errmsg varchar(255),
@out_default_value varchar(60),
@format varchar(60),
@ou varchar(3),
@time datetime
/*------------ Affectation des parametres aux variables ------------*/
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
/* only if it's sunday */
IF DATEPART(DW, GETDATE()) = 1
BEGIN
IF EXISTS(SELECT 1 FROM [master].[cfg].[InstanceContext] WHERE Business = 'TPPHAR')
BEGIN
/* ------------------------------------------------------------------------------------------------------------------------------------- */
/* \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 2 : RETRIEVE FORMAT AND OU CODE /////////////////////////////////////////////////// */
/* ------------------------------------------------------------------------------------------------------------------------------------- */
/* Get the cvCurrentOrganizationalUnit */
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 = 'cvCurrentOrganizationalUnit',
@out_default_value = @out_default_value OUTPUT,
@out_param_int_1 = null;
SELECT @cvCurrentOrganizationalUnit = convert(int,@out_default_value);
/* Check if we have a value, if not leave this SP */
IF @cvCurrentOrganizationalUnit is null
BEGIN
SELECT @errno = 70001,
@errmsg = '(APS) Error cvCurrentOrganizationalUnit does not exist!';
goto error_99;
END
/* Get the subsidiary id and OU code */
SELECT @subsidiary_id = ou.OU_subsidiary, @ou = ou.OU_Code
FROM arizona.dbo.Organizational_unit ou with (nolock)
WHERE ou.Organizational_unit_ID = @cvCurrentOrganizationalUnit;
/* Check if we have a value, if not leave this SP */
IF @subsidiary_id is null
BEGIN
SELECT @errno = 70001,
@errmsg = '(APS) Error subsidiary_id does not exist!';
goto error_99;
END
/* Get the current format */
SELECT @format = sub.SUB_code
FROM arizona.dbo.Subsidiary sub with (nolock)
WHERE sub.Subsidiary_ID = @subsidiary_id;
/* Check if we have a value, if not leave this SP */
IF @format is null
BEGIN
SELECT @errno = 70001,
@errmsg = '(APS) Error format does not exist!';
goto error_99;
END
/* Change the value into a compatible format */
IF @format = 'COOP'
BEGIN
SET @format = 'CVI'
END
IF @format = 'CENT'
BEGIN
SET @format = 'SUN'
END
IF @format = '000'
BEGIN
SET @format = 'AAI'
END
IF NOT EXISTS(SELECT 1 FROM HCITools.dbo.HCI_PARAMS WHERE HCIP_Key = 'WorkonSUN' and HCIP_value like '%' + @format+@ou + '%')
BEGIN
SELECT @delay = rand()* 60 * @in_Minutes
SELECT @time = dateadd(ss,@delay, '01.01.1900')
WAITFOR DELAY @time
END
END
ELSE
BEGIN /* Others servers (centrals) */
IF EXISTS(SELECT 1 FROM [master].[cfg].[Identity] WHERE Format = 'GCM') AND EXISTS(SELECT 1 FROM [master].[cfg].[InstanceContext] WHERE Business = 'TPCENT' and [Type] = 'PROD')
BEGIN
return(0)
END
ELSE
BEGIN
SELECT @delay = rand()* 60 * @in_Minutes
SELECT @time = dateadd(ss,@delay, '01.01.1900')
WAITFOR DELAY @time
END
END
END
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
SELECT @errno = 70003,
@errmsg = 'error on Wait_Random_Time_Sunday!'
goto error_99
END CATCH;
/*------------------ Retour au programme appelant -----------------*/
RETURN(@@error);
/*---------------------- Traitement des erreurs ----------------------*/
error_99:
RAISERROR (@errmsg, 16, 1);
RETURN(@errno);
GO

View File

@@ -0,0 +1,138 @@
IF EXISTS (SELECT * FROM sys.objects where object_id = OBJECT_ID(N'[aps_Send_Mail]') AND OBJECTPROPERTY(object_id,N'IsProcedure') = 1)
DROP PROCEDURE [aps_Send_Mail]
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
CREATE PROCEDURE [aps_Send_Mail]
@in_sender varchar(8000)= null,
@in_sender_name varchar(8000) = null,
@in_recipient varchar(8000) = null,
@in_priority varchar(15) = null,
@in_subject varchar(8000) = null,
@in_message varchar(8000) = null,
@in_message_file varchar(8000) = null,
@in_attachments varchar(8000) = null,
@in_server varchar(255) = null,
@in_dbmail_profile_name varchar(255) = null
AS
/*===========================================================================
Procedure pour envoi d'un email via SMTP par execution de la SP "xp_smtp_sendmail".
Pour rappel, la SP "xp_smtp_sendmail" n'est pas une SP officielle de Microsoft !
Des lors, il n'y a aucune garantie que cette SP fonctionne avec les versions futures
de SQL Server ! ==> Voir modif. de CMA du 07.02.07 !!
Parametres:
@in_sender = adresse email de l'expediteur (ex: "cm@bmc.ch") (--> version SQL 2000 only)
@in_sender_name (or NULL) = nom de l'expediteur (ex: "Christophe Marchand") (--> version SQL 2000 only)
@in_recipient = adresse email du destinataire (ex: "info@bmc.ch")
@in_priority (or NULL) = priorite (valeurs possibles: "LOW, NORMAL, HIGH")
@in_subject (or NULL) = sujet du message
@in_message (or NULL) = corps du message
@in_message_file (or NULL) = corps du message contenu dans un fichier
@in_attachments (or NULL) = pieces jointes (file1;file2;file3)
@in_server = nom du serveur par lequel doit transiter l'email (--> version SQL 2000 only)
@in_dbmail_profile_name = nom du profil de "Database Mail" a utiliser (--> version SQL 2005 only)
Creation: 19.11.04 / chris
Modifications :
01.12.04 / chris : Traitement des parametres "@in_message_file" et "@in_attachments"
07.03.07 / chris : Adaptation de la SP pour SQL 2005. (#cm01)
La SP "xp_smtp_sendmail" n'etant plus compatible sous SQL 2005,
j'utilise a la place "Database Mail" de SQL 2005, ainsi que la
SP fournie par Microsoft "sp_send_dbmail".
06.07.07 / chris : Adaptation du commentaire d'un parametre ci-dessus
07.09.07 / chris : Adaptation commentaires ci-dessus
17.03.20 / FLA : Suppression version SQL 2000
09.02.21 / SPE : #TFS62610# - Update all mail configurations to avoid SPAM
============================================================================*/
set nocount on
declare @result_sp INT,
@errno INT,
@errmsg VARCHAR(255),
@Mailsubject VARCHAR(255)
/*--------------- Remplacement des empty strings par des null ---------------*/
if @in_recipient = ''
select @in_recipient = null
if @in_priority = ''
select @in_priority = null
if @in_subject = ''
select @in_subject = null
if @in_message = ''
select @in_message = null
if @in_message_file = ''
select @in_message_file = null
if @in_attachments = ''
select @in_attachments = null
if @in_dbmail_profile_name = '' /* #cm01 */
select @in_dbmail_profile_name = null
/*-------------------------- Version de SQL Server --------------------------*/
/*------------------------ Test des parametres input ------------------------*/
if (@in_dbmail_profile_name is null) /* #cm01 */
or @in_recipient is null
begin
select @errno = 70003,
@errmsg = '(APS) Invalid input parameters !'
goto error_99
end
/*----------------------------- Valeurs par defaut --------------------------*/
if @in_priority is null
select @in_priority = 'NORMAL'
/*--------------- Execution de la SP pour envoi de l'email SMTP -------------*/
/* La SP "sp_send_dbmail" ne permet pas d'inclure un fichier dans le corps
du message. De ce fait, je l'ajoute en tant que piece jointe.
*/
if @in_message_file is not null
select @in_attachments = @in_message_file + ';' + @in_attachments
set @Mailsubject = @in_subject + ' - [' + @@SERVERNAME + ']'
exec @result_sp = msdb.dbo.sp_send_dbmail
@profile_name = @in_dbmail_profile_name,
@recipients = @in_recipient,
@subject = @Mailsubject,
@importance = @in_priority,
@body = @in_message,
@file_attachments = @in_attachments
if @result_sp <> 0
begin
select @errno = 70003,
@errmsg = '(APS) Error executing sp_send_dbmail in aps_Send_Mail !'
goto error_99
end
/*------------------------- Retour a la SP appelante ------------------------*/
return(@@error)
/*-------------------------- Traitement des erreurs -------------------------*/
error_99:
raiserror (@errmsg, 16, 1)
return(@errno)
GO

View File

@@ -0,0 +1,384 @@
IF EXISTS (SELECT * FROM sys.objects where object_id = OBJECT_ID(N'[dbo].[aps_Send_Mail_with_template]') AND OBJECTPROPERTY(object_id,N'IsProcedure') = 1)
DROP PROCEDURE [dbo].[aps_Send_Mail_with_template]
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
CREATE PROCEDURE [dbo].[aps_Send_Mail_with_template]
@in_job_type int = 1,
@in_param_sender varchar(8000)= null,
@in_param_sender_name varchar(8000) = null,
@in_param_recipient varchar(8000) = null,
@in_param_priority varchar(15) = null,
@in_param_subject varchar(8000) = null,
@in_param_message varchar(8000) = null,
@in_param_message_file varchar(8000) = null,
@in_param_attachments varchar(8000) = null,
@in_param_server varchar(255) = null,
@in_param_dbmail_profile_name varchar(255) = null,
@in_param_varchar_1 varchar (8000) = null,
@in_param_varchar_2 varchar (8000) = null,
@in_param_varchar_3 varchar (8000) = null
AS
/*===========================================================================
Procedure pour envoi d'un email
Parametres:
@in_param_sender = adresse email de l'expediteur (ex: "cm@bmc.ch") (--> version SQL 2000 only)
@in_param_sender_name (or NULL) = nom de l'expediteur (ex: "Christophe Marchand") (--> version SQL 2000 only)
@in_param_recipient = adresse email du destinataire (ex: "info@bmc.ch")
@in_param_priority (or NULL) = priorite (valeurs possibles: "LOW, NORMAL, HIGH")
@in_param_subject (or NULL) = sujet du message
@in_param_message (or NULL) = corps du message
@in_param_message_file (or NULL) = corps du message contenu dans un fichier
@in_param_attachments (or NULL) = pieces jointes (file1;file2;file3)
@in_param_server = nom du serveur par lequel doit transiter l'email (--> version SQL 2000 only)
@in_param_dbmail_profile_name = nom du profil de "Database Mail" a utiliser (--> version SQL 2005 only)
@in_job_type = 0 -> envoi d'email sans template
1/NULL -> envoi d'email pour echec de job
2 -> envoi d'email pour succes de job
3 -> envoi d'email pour warning de job
4 -> envoi d'email pour message de job
10 -> envoi d'email pour infos du processus en cours
@in_param_varchar_1 = contenu qui depend du template choisi ; nom du job SI job_type = 1 ou 2
@in_param_varchar_2 = contenu qui depend du template choisi ; liste(s) de diffusion SI job_type = 1 ou 2
@in_param_varchar_3 = contenu qui depend du template choisi ; ajout au corps du mail SI job_type = 1 ou 2
Creation: 06.03.12 / PDE
Modifications :
06.03.2012 / PDE : Creation
13.07.2012 / PDE : Utilisation de la table DBA_Mailing_list
03.12.2012 / PDE : modif liste emails de secours #pde01#
13.12.2012 / PDE : Remplacement des ; par des , dans les destinataires, sinon ca echoue dans SQL 20005 #pde03#
13.12.2012 / PDE : Debuggage de la modification precedente #pde04#
22.08.2013 / PDE : #TFS19397# Ajout adresse IP dans le message #pde05#
07.12.2013 / PDE : Mise en commentaire des TRY/CATCH, pour permettre l'appel depuis un trigger.
07.12.2013 / PDE : Ajout job_type = 10 (mouchard)
12.12.2013 / PDE : #TFS21035# Remise en place des TRY/CATCH, car sinon la SP echoue dans les environnements sans Arizona
31.03.2015 / DVE : suppression du email de PDE #dve01#
15.07.2015 / FLA : correction bug quand un @DML_Code est identique à une adresse mail contenue dans @recipients #fla01#
28.07.2015 / FLA : correction bug afin de pouvoir ajouter un _ devant l'adresse mail #fla02#
01.12.2015 / FLA : modification de l'adresse d'envoi par défaut en _hci_dba@hcisolutions.ch #fla03#
21.11.2016 / AFL : #TFS35792# Add cvSpecificCustomer 124 (coop)
17.03.2020 / FLA : Suppression version SQL 2000
09.02.2021 / SPE : #TFS62610# - Update all mail configurations to avoid SPAM
16.03.2022 / FLA : Standardisation des mails
13.07.2023 / SPE : OCTPDBA-690: Replace xp_cmdshell in [dbo].[aps_Send_Mail_with_template] stored procedure
17.08.2023 / SPE : OCTPDBA-726: Replace mail profile name APSSQL_MAIL_PROFILE into AzureManagedInstance_dbmail_profile to be SQL managed instances compatible
============================================================================*/
SET NOCOUNT ON
DECLARE @result_sp INT,
@errno INT,
@cpt_boucle INT,
@posPV_01 INT,
@posPV_02 INT,
@attachments VARCHAR(MAX),
@message_file VARCHAR(MAX),
@subject VARCHAR(MAX),
@message VARCHAR(MAX),
@recipients VARCHAR(MAX),
@recipients_temoin VARCHAR(MAX),
@DML_Recipients VARCHAR(MAX),
@EAD_email_address VARCHAR(MAX),
@cmd NVARCHAR(255),
@job_name VARCHAR(255),
@DML_Code VARCHAR(255),
@errmsg VARCHAR(255),
@dbmail_profile_name VARCHAR(255),
@priority VARCHAR(30),
@jobid UNIQUEIDENTIFIER
/* BUILD DETAILS OF THE EMAIL */
/* Get default mailbox profile name */
DECLARE @defaultprofilname varchar(100)
SELECT DISTINCT @defaultprofilname = p.name FROM msdb.dbo.sysmail_profile p JOIN msdb.dbo.sysmail_principalprofile pp ON pp.profile_id = p.profile_id AND pp.is_default = 1
SET @in_param_dbmail_profile_name = @defaultprofilname
/* SET RECIPIENTS */
SELECT @recipients = isnull (@in_param_recipient, isnull (@in_param_varchar_2, ''))
IF EXISTS(SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DBA_Mailing_list]') AND OBJECTPROPERTY(object_id, N'IsUserTable') = 1)
BEGIN
/* DECRYPTAGE DES DESTINATAIRES */
SET @recipients_temoin = ''
SET @cpt_boucle = 0
WHILE @recipients_temoin <> @recipients and @cpt_boucle < 10
BEGIN
/* COMPTEUR DE BOUCLE, POUR COURT-CIRCUITER LES BOUCLES INFINIES */
SET @cpt_boucle = @cpt_boucle + 1
/* TEMOIN DU CHAMP DESTINATAIRE, POUR CONTINUER A FAIRE DES REMPLACEMENTS TANT QU'AU MOINS UN REMPLACEMENT A ETE EFFECTUE */
SET @recipients_temoin = @recipients
/* BOUCLE SUR LA TABLE DE CORRESPONDANCE DES LISTES DE DIFFUSION */
DECLARE c_DML CURSOR LOCAL FORWARD_ONLY STATIC FOR
SELECT DML_Code, isnull(DML_Recipients, '') + ';' /*#pde04#*/
FROM DBA_Mailing_list with (nolock)
OPEN c_DML
FETCH NEXT FROM c_DML
INTO @DML_Code, @DML_Recipients
WHILE @@fetch_status <> -1
BEGIN
IF @@fetch_status <> -2
BEGIN
/*#fla01# */
IF(CHARINDEX (@DML_Code,@recipients) <> 0)
IF(SUBSTRING (@recipients,CHARINDEX (@DML_Code,@recipients)+LEN(@DML_Code),1) <> '@')
SET @recipients = replace (@recipients, @DML_Code, @DML_Recipients)
SET @recipients = replace (@recipients, ',', ';') /*#pde04#*/
SET @recipients = replace (@recipients, ';;', ';')
SET @recipients = replace (@recipients, ' ', '')
END /* if @@fetch_status <> -2 */
FETCH NEXT FROM c_DML
INTO @DML_Code, @DML_Recipients
END /* while @@fetch_status <> -1 */
CLOSE c_DML
DEALLOCATE c_DML
END /* @recipients_temoin <> @recipients and @@cpt_boucle < 10 */
END /* If exists (DBA_Mailing_list) */
/* EN CAS D'ABSENCE DE DESTINATAIRE, OU EN CAS D'ABSENCE DE CARACTERE @, ECRITURE D'ADRESSES EN DUR */
IF charindex ('@', @recipients) = 0
BEGIN
SET @recipients = 'Gal_SE_DBA@galenica.com' /*#pde01#, #dve01# #fla03#*/
END
IF @in_job_type in (1, 2, 3, 4)
BEGIN
/* EMAIL D'ECHEC/SUCCES DE JOB */
IF @in_param_varchar_1 is not null
SET @job_name = @in_param_varchar_1
ELSE
BEGIN
SET @cmd = 'set @guid = cast(' + isnull (substring(app_name(), 30, 34), '') + ' as uniqueidentifier)'
/* ATTENTION, CETTE LIGNE DE CODE PEUT GENERER UN WARNING QUAND ELLE N'EST PAS EXECUTEE PAR UN JOB */
/* ERREUR TYPIQUE DANS UN LANCEMENT AVEC SQL STUDIO : Incorrect syntax near 'Studio'. */
EXEC sp_executesql @cmd, N'@guid uniqueidentifier out', @guid = @jobid OUT
IF @jobid is not null
BEGIN
SELECT @job_name = name
FROM msdb..sysjobs
WHERE job_id = @jobid
END
ELSE
SET @job_name = 'job inconnu ou appel hors d''un job'
END
END
/* JOB FAILURE */
IF @in_job_type = 1
BEGIN
SELECT @priority = isnull (@in_param_priority, 'HIGH'),
@subject = isnull (@in_param_subject, 'Job ' + isnull (@job_name, '') + ' has failed.'),
@message = isnull (@in_param_message, 'Job ' + isnull (@job_name, '') + ' has failed.')
END
/* JOB SUCCESS */
ELSE IF @in_job_type = 2
BEGIN
SELECT @priority = isnull (@in_param_priority, 'LOW'),
@subject = isnull (@in_param_subject, 'Job ' + isnull (@job_name, '') + ' successfull.'),
@message = isnull (@in_param_message, 'Job ' + isnull (@job_name, '') + ' has succeeded.')
END
/* JOB WARNING */
ELSE IF @in_job_type = 3
BEGIN
SELECT @priority = isnull (@in_param_priority, 'HIGH'),
@subject = isnull (@in_param_subject, 'Job ' + isnull (@job_name, '') + ' : warning.'),
@message = isnull (@in_param_message, 'Job ' + isnull (@job_name, '') + ' has sent a warning.')
END
/* JOB MESSAGE */
ELSE IF @in_job_type = 4
BEGIN
SELECT @priority = isnull (@in_param_priority, 'LOW'),
@subject = isnull (@in_param_subject, 'Job ' + isnull (@job_name, '') + ' : message.'),
@message = isnull (@in_param_message, 'Job ' + isnull (@job_name, '') + '.')
END
/* SPY MESSAGE */
ELSE IF @in_job_type = 10
BEGIN
SELECT @subject = isnull (@in_param_subject,'Spy message')
SELECT @message = 'This email is being sent by ' + char(10) + char(13) + 'the SPID ['
+ convert (varchar (10), isnull(p.session_id, 'NULL'))
+ '], ' + char(10) + char(13) + 'of the instance ['
+ @@SERVERNAME
+ '], ' + char(10) + char(13) + 'run by the program ['
+ ltrim(rtrim(isnull(p.program_name, 'NULL')))
+ '] ' + char(10) + char(13) + 'on the host ['
+ ltrim(rtrim(isnull(p.host_name, 'NULL')))
+ '] ' + char(10) + char(13) + 'as user ['
+ ltrim(rtrim(isnull(p.login_name, 'NULL')))
+ '] ' + char(10) + char(13) + 'on the database ['
+ ltrim(rtrim(isnull(db.name, 'NULL')))
+ '].'
from master.sys.dm_exec_sessions p with (nolock)
left join sysdatabases db with (nolock)
on db.dbid = p.database_id
where p.session_id = @@spid
END
ELSE /* UNKNOWN JOB TYPE */
BEGIN
SELECT @priority = isnull (@in_param_priority, 'NORMAL'),
@subject = isnull (@in_param_subject, 'Message'),
@message = isnull (@in_param_message, 'Message sent by [' + @@SERVERNAME + '].')
END
/* ADDITIONAL INFO FOR EMAIL MESSAGE */
IF ISNULL(@in_param_varchar_3, '') <> ''
BEGIN
SET @message = isnull (@message , '') + char(13) + char(13) + isnull (@in_param_varchar_3, '')
END
SET @message = isnull (@message, '') + '
/*------------------------- */
Destinataires de l''email :
' + replace (isnull (@recipients, ''), ';', ' ' + CHAR(13)) +
'
'
/* SEND EMAIL */
SELECT @recipients = isnull (@in_param_recipient, @recipients),
@priority = isnull (@in_param_priority, @priority),
@subject = isnull (@in_param_subject, @subject),
@message_file = isnull (@in_param_message_file, @message_file),
@attachments = isnull (@in_param_attachments, @attachments),
@dbmail_profile_name = isnull (@in_param_dbmail_profile_name, @dbmail_profile_name)
SET @recipients = REPLACE(@recipients, ',', ';') /*#pde04#*/
SET @recipients = REPLACE(@recipients, ' ', '') /*#pde04#*/
/* Nettoyage de liste d'emails */
BEGIN /*#pde04#*/
DECLARE @Email_address TABLE
(
Email_address_id int identity,
EAD_email_address varchar (1000)
)
SET @posPV_01 = 0
SET @posPV_02 = 0
WHILE @recipients is not null
AND @posPV_02 < LEN (@recipients)
BEGIN
SET @posPV_01 = @posPV_02
SET @posPV_02 = charindex (';',@recipients, @posPV_02+1)
IF @posPV_02 is null OR @posPV_02 = 0
SET @posPV_02 = LEN (@recipients)
INSERT INTO @Email_address
VALUES(substring(@recipients, @posPV_01+1, @posPV_02-@posPV_01))
END /*while*/
/* NETTOYAGE */
UPDATE @Email_address
SET EAD_email_address = replace (EAD_email_address, ';', '')
/* #fla02# */
DELETE @Email_address
WHERE EAD_email_address not like '[_a-z0-9]%[a-z0-9]@[a-z0-9]%[a-z0-9].[a-z09]%[a-z0-9]'
UPDATE @Email_address
SET EAD_email_address = EAD_email_address + ';'
/* CONSTRUCTION DE LA CHAINE DE CARACTERES AVEC LES ADRESSES EMAILS */
SET @recipients = ''
DECLARE c_EAD CURSOR LOCAL FORWARD_ONLY STATIC FOR
SELECT EAD_email_address
FROM @Email_address
ORDER BY Email_address_id
OPEN c_EAD
FETCH NEXT FROM c_EAD
INTO @EAD_email_address
WHILE @@fetch_status <> -1
BEGIN
IF @@fetch_status <> -2
BEGIN
SET @recipients = @recipients + @EAD_email_address
END /* if @@fetch_status <> -2 */
FETCH NEXT FROM c_EAD
INTO @EAD_email_address
END /* while @@fetch_status <> -1 */
CLOSE c_EAD
DEALLOCATE c_EAD
END
SET @message = isnull (@in_param_message, @message)
BEGIN TRY
EXEC @result_sp = aps_Send_Mail
@in_recipient = @recipients,
@in_priority = @priority,
@in_subject = @subject,
@in_message = @message,
@in_message_file = @message_file,
@in_attachments = @attachments,
@in_dbmail_profile_name = @dbmail_profile_name
END TRY
BEGIN CATCH
SET @result_sp = -1
END CATCH
/* ---- VERSION LA PLUS SIMPLE POUR L'ENVOI DE MAIL ---- */
IF @result_sp <> 0
BEGIN
SET @subject = @subject + ' - [' + @@SERVERNAME + ']'
EXEC @result_sp = msdb.dbo.sp_send_dbmail
@profile_name = @dbmail_profile_name,
@recipients = @recipients,
@subject = @subject,
@body = @message,
@importance = @priority,
@file_attachments = @attachments
END
IF @result_sp <> 0
BEGIN
SET @errno = 70003
SET @errmsg = '(APS) Error executing aps_Send_Mail in aps_Send_Mail_with_template.'
GOTO error_99
END
/*------------------------- Retour a la SP appelante ------------------------*/
RETURN(@@error)
/*-------------------------- Traitement des erreurs -------------------------*/
error_99:
RAISERROR (@errno, -1, -1, @errmsg);
RETURN(@errno)
GO

View File

@@ -0,0 +1,293 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[bkp_Archive]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[bkp_Archive]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[bkp_Archive]
@in_debug int = null,
@in_Recovery_Model varchar(25) = null
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette SP sert à archiver les backups des bases de données en fonction du paramètre BKP_FRQ contenu dans la table HCI_PARAMS
L'archivage se fait sur 3 jours glissant puis en fonction du choix, sur 30 jours et 60 jours
Contexte d'utilisation
----------------------
Cette SP est appelée par les jobs D91010 - Backup of several databases
D91040 - Backup of simple databases
D91050 - Backup of full databases
Parametres
----------
@in_debug : non utilisé pour le moment
Creation : 06.10.15 / FLA
Modifications : 14.09.16 / FLA Remplacement des xp_cmdshell par la CLR
Ajout de la gestion des erreurs de chaque step
Ajout de la gestion de l'archivage uniquement des bases backupées
15.09.16 / FLA Séléction uniquement des bases de données online
24.05.17 / FLA Ajout du choix du mode de recovery des bases pour archiver leur backup
17.03.22 / FLA Change DBA mail
=============================================================================*/
set nocount on;
declare @result_sp int,
@errno int,
@errmsg varchar(255)
/*------------------- Declaration des variables --------------------*/
declare @NbError int,
@TypeArchive int,
@BackupFolder varchar (4000),
@BackupFolderA varchar (4000),
@OldPath varchar (4000),
@NewPath varchar (4000),
@Path varchar (4000),
@messageError varchar (max),
@messageToSend varchar(8000),
@xml xml,
@delimiter varchar(1),
@param_group_counter_list nvarchar(3000),
@name varchar (255)
/*------------ Affectation des parametres aux variables ------------*/
SELECT @TypeArchive=HCIP_value FROM dbo.HCI_PARAMS WHERE HCIP_key = 'BKP_FRQ'
;
SELECT @BackupFolder=HCIP_value FROM dbo.HCI_PARAMS WHERE HCIP_key = 'BKP_DIR'
;
SELECT @BackupFolderA=HCIP_value FROM dbo.HCI_PARAMS WHERE HCIP_key = 'BKP_DIR_A'
;
SELECT @param_group_counter_list = HCIP_value FROM dbo.HCI_PARAMS WHERE HCIP_key = 'BKP_NOT_DB'
;
IF @in_Recovery_Model is null
SET @in_Recovery_Model = 'FULL,SIMPLE,BULK-LOGGED'
SET @delimiter = ','
SET @xml = CAST(('<X>'+REPLACE(@param_group_counter_list, @delimiter, '</X><X>')+'</X>'+'<Y>'+REPLACE(@in_Recovery_Model, @delimiter, '</Y><Y>')+'</Y>') AS XML)
set @NbError = 0
set @messageError = ''
if @TypeArchive is null or @BackupFolder is null or @BackupFolderA is null or @param_group_counter_list is null
begin
select @errno = 70003,
@errmsg = '(BKP) Paramètres BKP_FRQ ou BKP_DIR ou BKP_DIR_A ou BKP_NOT_DB non initialisé dans HCI_PARAMS !'
goto error_99
end
/*-------------------------- Traitement ---------------------------*/
IF @TypeArchive <> 0
BEGIN
/* ON PARCOURT TOUTES LES BASES */
declare c_databases cursor local forward_only static for
SELECT name
FROM sys.databases
WHERE LOWER(name) not in (SELECT C.value('.', 'varchar(3000)') AS value FROM @xml.nodes('X') AS X(C))
AND state = 0
AND recovery_model_desc IN (SELECT C.value('.', 'varchar(3000)') AS value FROM @xml.nodes('Y') AS X(C))
ORDER BY name
;
open c_databases
;
FETCH NEXT FROM c_databases
into @name
;
while @@fetch_status <> -1
begin
if @@fetch_status <> -2
begin
/* ARCHIVE */
/* MOVE LAST DUMP FOR ARCHIVING */
BEGIN TRY
SET @OldPath = @BackupFolder + @name + '_Dump.bak'
SET @NewPath = @BackupFolderA + @name + '_Dump.bak'
exec dbo.aps_File_Move @OldPath, @NewPath
END TRY
BEGIN CATCH
select @messageError = @messageError + 'Move last backup for archiving failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13)
SET @NbError = @NbError + 1
END CATCH
/* DELETE OLDEST DUMP, OR ARCHIVE AS MONTHLY DUMP */
if datepart (dd, getdate()) > 7
or datepart (weekday, getdate()) <> datepart (weekday, '2013-01-01') /* '2013-01-01' was a Tuesday */
begin
/* DELETE OLDEST ARCHIVED DUMP */
BEGIN TRY
SET @Path = @BackupFolderA + @name + '_Dump_3.bak'
exec dbo.aps_File_Delete @Path
END TRY
BEGIN CATCH
select @messageError = @messageError + 'Delete oldest archived backup failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13)
SET @NbError = @NbError + 1
END CATCH
end
else
begin
/* IN THE FIRST TUESDAY OF THE MONTH, THE MONTHLY DUMP IS UPDATED */
IF @TypeArchive = 330
BEGIN
/* DELETE MONTHLY DUMP */
BEGIN TRY
SET @Path = @BackupFolderA + @name + '_Dump_30.bak'
exec dbo.aps_File_Delete @Path
END TRY
BEGIN CATCH
select @messageError = @messageError + 'Delete monthly backup failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13)
SET @NbError = @NbError + 1
END CATCH
END
ELSE IF @TypeArchive = 33060
BEGIN
/* DELETE MONTHLY DUMP 60 */
BEGIN TRY
SET @Path = @BackupFolderA + @name + '_Dump_60.bak'
exec dbo.aps_File_Delete @Path
END TRY
BEGIN CATCH
select @messageError = @messageError + 'Delete monthly backup 60 failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13)
SET @NbError = @NbError + 1
END CATCH
/* RENAME TO MONTHLY DUMP 30 TO 60 */
BEGIN TRY
SET @OldPath = @BackupFolderA + @name + '_Dump_30.bak'
SET @NewPath = @BackupFolderA + @name + '_Dump_60.bak'
exec dbo.aps_File_Move @OldPath, @NewPath
END TRY
BEGIN CATCH
select @messageError = @messageError + 'Rename to monthly backup 30 TO 60 failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13)
SET @NbError = @NbError + 1
END CATCH
END
BEGIN TRY
SET @OldPath = @BackupFolderA + @name + '_Dump_3.bak'
SET @NewPath = @BackupFolderA + @name + '_Dump_30.bak'
exec dbo.aps_File_Move @OldPath, @NewPath
END TRY
BEGIN CATCH
select @messageError = @messageError + 'Rename to monthly backup 3 to 30 failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13)
SET @NbError = @NbError + 1
END CATCH
END
;
/* RENAME ARCHIVED DUMPS */
BEGIN TRY
SET @OldPath = @BackupFolderA + @name + '_Dump_2.bak'
SET @NewPath = @BackupFolderA + @name + '_Dump_3.bak'
exec dbo.aps_File_Move @OldPath, @NewPath
END TRY
BEGIN CATCH
select @messageError = @messageError + 'Rename archived backup 2 to 3 failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13)
SET @NbError = @NbError + 1
END CATCH
BEGIN TRY
SET @OldPath = @BackupFolderA + @name + '_Dump_1.bak'
SET @NewPath = @BackupFolderA + @name + '_Dump_2.bak'
exec dbo.aps_File_Move @OldPath, @NewPath
END TRY
BEGIN CATCH
select @messageError = @messageError + 'Rename archived backup 1 to 2 failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13)
SET @NbError = @NbError + 1
END CATCH
BEGIN TRY
SET @OldPath = @BackupFolderA + @name + '_Dump.bak'
SET @NewPath = @BackupFolderA + @name + '_Dump_1.bak'
exec dbo.aps_File_Move @OldPath, @NewPath
END TRY
BEGIN CATCH
select @messageError = @messageError + 'Rename archived backup to 1 failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13)
SET @NbError = @NbError + 1
END CATCH
end /* if @@fetch_status <> -2 */
;
FETCH NEXT FROM c_databases
into @name
;
end /* while @@fetch_status <> -1 */
;
close c_databases
;
deallocate c_databases
;
if @NbError > 0
BEGIN
SET @messageToSend = SUBSTRING(@messageError,0,8000);
exec aps_Send_Mail_with_template
@in_param_varchar_2 = 'DBA_operator;',
@in_job_type = 3, /* 3 = warning */
@in_param_varchar_3 = @messageError
;
select @errno = 70003,
@errmsg = '(BKP) Erreur lors du job d''archivage'
END
END
;
/*------------------ Retour au programme appelant -----------------*/
return(@@error);
/*---------------------- Traitement des erreurs ----------------------*/
error_99:
raiserror (@errmsg, 16, 1);
return(@errno);
GO

View File

@@ -0,0 +1,160 @@
USE [HCITools]
GO
/****** Object: StoredProcedure [dbo].[bkp_Dump] Script Date: 10/15/2015 10:58:14 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[bkp_Dump]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[bkp_Dump]
GO
USE [HCITools]
GO
/****** Object: StoredProcedure [dbo].[bkp_Dump] Script Date: 10/15/2015 10:58:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[bkp_Dump]
@in_debug int = null,
@in_Recovery_Model varchar(25) = null
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette SP sert à créer les backups des bases de données. Suivant la version de SQL Server, la compression se fait ou pas avec la possibilité de choisir les bases par mode de recovery
Contexte d'utilisation
----------------------
Cette SP est appelée par le D91010 - Backup of several databases
D91040 - Backup of simple databases
D91050 - Backup of full databases
Parametres
----------
@in_debug : Si 1 alors on fait un print des commandes de backup
@@in_Recovery_Model : Choix du mode de recovery des bases. si null : All recovery model sinon recovery model défini
Creation : 15.10.15 / FLA
Modifications : 21.07.16 / FLA : Séléction uniquement des bases de données online (state = 0)
28.11.16 / FLA : Correct bug in checking version
24.05.17 / FLA : Ajout du choix du mode de recovery des bases à backuper
28.08.18 / FLA : Suppression gestion version car bug detecté et plus nécessaire
17.03.22 / FLA : Change DBA mail
=============================================================================*/
set nocount on;
declare @result_sp int,
@errno int,
@errmsg varchar(255)
/*------------------- Declaration des variables --------------------*/
declare @name varchar (255),
@cmd varchar (8000),
@messageError varchar (8000),
@xml XML,
@delimiter VARCHAR(1),
@param_group_counter_list NVARCHAR(3000)
IF @in_Recovery_Model is null
SET @in_Recovery_Model = 'FULL,SIMPLE,BULK-LOGGED'
SELECT @param_group_counter_list = HCIP_value FROM dbo.HCI_PARAMS WHERE HCIP_key = 'BKP_NOT_DB'
SET @delimiter = ','
SET @xml = CAST(('<X>'+REPLACE(@param_group_counter_list, @delimiter, '</X><X>')+'</X>'+'<Y>'+REPLACE(@in_Recovery_Model, @delimiter, '</Y><Y>')+'</Y>') AS XML)
declare c_databases cursor local forward_only static for
SELECT name
FROM sys.databases
WHERE LOWER(name) not in (SELECT C.value('.', 'varchar(3000)') AS value FROM @xml.nodes('X') AS X(C))
AND state = 0
AND recovery_model_desc IN (SELECT C.value('.', 'varchar(3000)') AS value FROM @xml.nodes('Y') AS X(C))
ORDER BY name
/*------------ Affectation des parametres aux variables ------------*/
select @errno = 0
;
SET @messageError = ''
;
SET @errmsg = ''
;
/*-------------------------- Traitement ---------------------------*/
open c_databases
;
FETCH NEXT FROM c_databases
into @name
;
while @@fetch_status = 0
begin
/* DUMP */
select @cmd = 'BACKUP DATABASE [' + @name + '] TO [' + @name + '_Dump] WITH INIT, NOUNLOAD, NAME = N''' + @name + ' backup'', SKIP , STATS = 10, FORMAT, COMPRESSION, CHECKSUM; RESTORE VERIFYONLY FROM [' + @name + '_Dump];'
;
BEGIN TRY
IF (@in_debug = 1)
print @cmd;
ELSE
exec (@cmd)
;
END TRY
BEGIN CATCH
select @messageError = @messageError + 'Backup failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13)
;
SET @errno = @errno + 1
;
END CATCH
;
FETCH NEXT FROM c_databases
into @name
;
end
;
close c_databases
;
deallocate c_databases
;
if @errno > 0
BEGIN
exec aps_Send_Mail_with_template
@in_param_varchar_2 = 'DBA_operator;',
@in_job_type = 3, /* 3 = warning */
@in_param_varchar_3 = @messageError
;
select @errno = 70003,
@errmsg = '(BKP) Erreur lors du job de backup'
goto error_99
END
;
/*------------------ Retour au programme appelant -----------------*/
return(@@error);
/*---------------------- Traitement des erreurs ----------------------*/
error_99:
raiserror (@errmsg, 16, 1);
return(@errno);
GO

View File

@@ -0,0 +1,149 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[bkp_Log]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[bkp_Log]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[bkp_Log]
@in_debug int = null
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette SP sert backuper les logs de transaction des bases de données en mode FULL
Contexte d'utilisation
----------------------
Cette SP est appelée par le job DR91020 - Log-backup
Parametres
----------
@in_debug : Si 1 alors on fait un print des commandes de backup
Creation : 28.10.16 / FLA
Modifications : 17.03.2022 - FLA : Change DBA mail
=============================================================================*/
set nocount on;
/*------------------- Declaration des variables --------------------*/
declare @DB_name varchar (255),
@path varchar (4000),
@backupDate datetime,
@fullpath varchar (2000),
@messageError varchar (8000),
@error int,
@BackupLogFolder varchar (4000)
/*------------ Affectation des parametres aux variables ------------*/
select @backupDate = getdate ();
select @error = 0
select @messageError = ''
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
SELECT @BackupLogFolder=HCIP_value FROM dbo.HCI_PARAMS WHERE HCIP_key = 'BKP_DIR_L'
/* On ne backup le transaction log que des bases de données en mode FULL (base model exclus) */
declare c_databases cursor local forward_only static for
SELECT name
FROM sys.databases
WHERE LOWER(name) not in ('model')
AND recovery_model_desc = 'FULL'
AND state = 0
ORDER BY name
open c_databases
FETCH NEXT FROM c_databases
into @DB_name
while @@fetch_status = 0
begin
select @path = @BackupLogFolder + @DB_name;
/* BUILD THE EXPECTED FORMAT: [DBName_backup_201108041510.trn] */
declare @filename varchar (2000);
select @filename = @DB_name
+ '_backup_'
+ convert(varchar, datepart (YYYY, @backupDate)) + '_'
+ right('0'+convert(varchar, datepart (MM, @backupDate)),2) + '_'
+ right('0'+convert(varchar, datepart (DD, @backupDate)),2) + '_'
+ right('0'+convert(varchar, datepart (HH, @backupDate)),2)
+ right('0'+convert(varchar, datepart (MI, @backupDate)),2)
+ right('0'+convert(varchar, datepart (SS, @backupDate)),2) + '_'
+ right('00'+convert(varchar, datepart (MS, @backupDate)),3)
+ '.trn'
select @fullpath = @path+'\'+@filename;
BEGIN TRY
/* BACKUP THE LOG */
IF (@in_debug = 1)
print 'BACKUP LOG '+@DB_name+ ' TO DISK = '+@fullpath
else
BACKUP LOG @DB_name TO DISK = @fullpath
END TRY
BEGIN CATCH
select @messageError = @messageError + 'Backup Log failed : ' + @DB_name + ' ' + ERROR_MESSAGE() + CHAR(13)
SET @error = @error + 1
END CATCH
FETCH NEXT FROM c_databases
into @DB_name
end
close c_databases
deallocate c_databases
/* S'il y a une erreur, on envoie un mail aux DBA */
IF @messageError <> ''
BEGIN
exec aps_Send_Mail_with_template
@in_param_varchar_2 = 'DBA_operator;',
@in_job_type = 3, /* 3 = warning */
@in_param_varchar_3 = @messageError
RAISERROR ('Erreur dans la SP [dbo].[bkp_Log]',16,1)
END
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
GO

View File

@@ -0,0 +1,125 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[bkp_Purge_Log]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[bkp_Purge_Log]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[bkp_Purge_Log]
@in_debug int = null,
@in_NbDays smallint
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette SP sert à supprimer les anciens fichiers de log de plus de X jours
Contexte d'utilisation
----------------------
Cette SP est appelée par le job DR91020 - Log-backup
Parametres
----------
@in_debug : non utilisé
@in_NbDays : nombre de jours de rétention des logs
Creation : 28.10.16 / FLA
Modifications : 17.03.2022 - FLA : Change DBA mail
=============================================================================*/
set nocount on;
/*------------------- Declaration des variables --------------------*/
declare @DB_name varchar (255),
@messageError varchar(8000),
@dt datetime,
@result_xp int,
@BackupLogFolder varchar (4000),
@path varchar (4000)
declare @t_result TABLE
(result_text VARCHAR(200))
/*------------ Affectation des parametres aux variables ------------*/
SELECT @BackupLogFolder=HCIP_value FROM dbo.HCI_PARAMS WHERE HCIP_key = 'BKP_DIR_L'
select @dt = DateAdd(dd, -@in_NbDays, GetDate())
SET @messageError = ''
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
declare c_databases cursor local forward_only static for
SELECT name
FROM sys.databases
WHERE LOWER(name) not in ('model')
AND recovery_model_desc = 'FULL'
ORDER BY name
open c_databases
FETCH NEXT FROM c_databases
into @DB_name
while @@fetch_status = 0
begin
select @path = @BackupLogFolder+ @DB_name;
INSERT INTO @t_result(result_text)
EXECUTE @result_xp = master.dbo.xp_delete_file 0,@path,N'trn',@dt,1
if (@result_xp <> 0)
BEGIN
SELECT @messageError = @messageError + @DB_name + ': '+ result_text + CHAR(13)
FROM @t_result
WHERE result_text IS NOT NULL
END
delete from @t_result;
FETCH NEXT FROM c_databases
into @DB_name
end
close c_databases
deallocate c_databases
/* S'il y a une erreur, on envoie un mail aux DBA */
IF @messageError <> ''
BEGIN
exec aps_Send_Mail_with_template
@in_param_varchar_2 = 'DBA_operator;',
@in_job_type = 3, /* 3 = warning */
@in_param_varchar_3 = @messageError
RAISERROR ('Erreur dans la SP [dbo].[bkp_Purge_Log]',16,1)
END
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
GO

View File

@@ -0,0 +1,120 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Get_Job_Error_Info]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[Get_Job_Error_Info]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[Get_Job_Error_Info]
@in_debug tinyint = 0,
@in_JobName nvarchar(1000),
@in_Recipients varchar(250)
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette SP sert a récupérer le message d'erreur d'un step de job et de l'envoyer par mail.
Contexte d'utilisation
----------------------
Appelée depuis le step Empty Step et Send mail KO des jobs
Parametres
----------
@in_debug : non utilisé
@in_JobName : nom du job
@in_Recipients : mail/profil du/des destinataire(s)
Creation : 1.4.16 / RTC
Modifications : 04.04.16 / FLA : normalisation de la SP, modification du paramètre d'entrée, modification de l'appel de l'envoi de mail
06.10.16 / FLA : ajout de la gestion des erreurs de query timeout
19.02.21 / SPE : Modification null message (Bug)
=============================================================================*/
SET nocount ON;
/*------------------- Declaration des variables --------------------*/
DECLARE @message nvarchar(max)
/*------------ Affectation des parametres aux variables ------------*/
SET @message = '';
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
SELECT @message = @message + 'STEP NAME: '+ jh.step_name + CHAR(13) +
'ERROR MESSAGE: ' + CHAR(13) + jh.message + CHAR(13) + CHAR(13)
FROM msdb..sysjobhistory jh
INNER JOIN msdb..sysjobactivity ja
on ja.job_id = jh.job_id
INNER JOIN msdb..sysjobs j
on j.job_id = ja.job_id
WHERE j.name = @in_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 ORDER BY agent_start_date DESC)
AND start_execution_date is not null
--AND stop_execution_date is null
AND msdb.dbo.agent_datetime(run_date, run_time) >= start_execution_date
/* Gestion des Query Timeout Error */
if EXISTS (SELECT 1
FROM msdb..sysjobhistory jh
INNER JOIN msdb..sysjobactivity ja
on ja.job_id = jh.job_id
INNER JOIN msdb..sysjobs j
on j.job_id = ja.job_id
WHERE j.name = @in_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 ORDER BY agent_start_date DESC)
AND start_execution_date is not null
AND jh.sql_message_id = 7412
AND msdb.dbo.agent_datetime(run_date, run_time) >= start_execution_date)
BEGIN
SELECT @message = @message + 'STEP NAME: '+ jh.step_name + CHAR(13) +
'ERROR MESSAGE: ' + CHAR(13) + jh.message + CHAR(13) + CHAR(13)
FROM msdb..sysjobhistory jh
INNER JOIN msdb..sysjobactivity ja
on ja.job_id = jh.job_id
INNER JOIN msdb..sysjobs j
on j.job_id = ja.job_id
WHERE j.name = @in_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 ORDER BY agent_start_date DESC)
AND start_execution_date is not null
AND jh.sql_message_id = 7412
AND msdb.dbo.agent_datetime(run_date, run_time) >= start_execution_date
END
/*---------------------- Evoie du mail ------------*/
IF (@message <> '')
EXEC aps_Send_Mail_with_template @in_param_varchar_2 = @in_Recipients,
@in_param_message = @message,
@in_job_type = 1 /* 0:sans template; 1/NULL:echec; 2:succes; 3:warning; 4:message*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (sans RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 0
END CATCH
;
/*------------------ Retour au programme appelant -----------------*/
RETURN(@@error);
GO

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,102 @@
USE [HCITools]
GO
/****** Object: StoredProcedure [dbo].[get_Error_Info] Script Date: 10/31/2016 15:06:06 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[get_Error_Info]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[get_Error_Info]
GO
USE [HCITools]
GO
/****** Object: StoredProcedure [dbo].[get_Error_Info] Script Date: 10/31/2016 15:06:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[get_Error_Info]
@in_debug tinyint = 0,
@in_Recipients varchar(8000) = '',
@in_LogToTable tinyint = 0,
@in_Context tinyint = 1, -- 1 = SP, 2 = Job
@in_RaiseError tinyint = 1
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
La SP sert à gérer les erreurs remontées par SQL Server.
Parametres
----------
@in_debug : non utilisé
@in_Recipients : Contient la liste des mails pour l'envoi de mail lors d'une erreur
@in_LogToTable : si 1, enregistre l'erreur dans la table SQL_Errors
@in_Context : Si 1, le contexte est une SP, si 2, le contexte est un job (pour la gestion du mail)
@in_RaiseError : Si 1, raise l'error
Contexte d'utilisation
----------------------
Appelé depuis SP, Job, Trigger etc...
Creation : 04.04.16 / FLA
Modifications :
=============================================================================*/
/*------------------- Declaration des variables --------------------*/
declare @ErrorMessage nvarchar(4000) = ERROR_MESSAGE(),
@ErrorNumber int = ERROR_NUMBER(),
@ErrorSeverity int = ERROR_SEVERITY(),
@ErrorState int = ERROR_STATE(),
@ErrorLine int = ERROR_LINE(),
@ErrorProc nvarchar(128) = COALESCE(ERROR_PROCEDURE(), 'Not within procedure'),
@Error varchar(max)
BEGIN TRY
/*------------ Affectation des parametres aux variables ------------*/
select @Error = 'Error Number: ' + CAST(@ErrorNumber AS varchar(10)) + CHAR(13) +
'Error Message: ' + @ErrorMessage + CHAR(13) +
'Error Severity: ' + CAST(@ErrorSeverity AS varchar(10)) + CHAR(13) +
'Error State: ' + CAST(@ErrorState AS varchar(10)) + CHAR(13) +
'Error Line: ' + CAST(@ErrorLine AS varchar(10)) + CHAR(13) +
'Error Proc: ' + @ErrorProc + CHAR(13)
/*-------------------------- Traitement ---------------------------*/
IF @in_Recipients <> ''
BEGIN
IF @in_Context = 1
exec dbo.aps_Send_Mail_with_template @in_job_type = 0,@in_param_message = @Error, @in_param_varchar_2 = @in_Recipients
ELSE
BEGIN
exec dbo.aps_Send_Mail_with_template @in_param_varchar_2 = @in_Recipients
END
END
IF @in_LogToTable = 1
INSERT INTO SQL_Errors VALUES (@@SERVERNAME,APP_NAME(),CURRENT_USER,@ErrorProc,GETDATE(),@in_Context,@Error)
END TRY
BEGIN CATCH
RAISERROR ('Erreur dans la SP [dbo].[get_Error_Info]',16,1)
RETURN
END CATCH
IF @in_RaiseError = 1
RAISERROR (@ErrorMessage,
@ErrorSeverity,
@ErrorState
);
GO

View File

@@ -0,0 +1,76 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[get_Labels_List]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[get_Labels_List]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[get_Labels_List]
@in_debug int = null
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette SP sert à récuperer la liste des labels contenus dans le répertoire de la centrale
Contexte d'utilisation
----------------------
Cette SP est appelée par le job D92080 - Backup Labels List
Parametres
----------
@in_debug : affiche la liste des labels dans le répertoire
Creation : 01.11.16 / FLA
Modifications :
=============================================================================*/
set nocount on;
/*------------------- Declaration des variables --------------------*/
declare @path varchar (4000)
/*------------ Affectation des parametres aux variables ------------*/
SELECT @path = HCIP_value FROM HCI_PARAMS WHERE HCIP_key = 'LBLPATH'
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
insert into dbo.LabelsList
SELECT DirectoryName as [labels]
FROM [HCITools].[dbo].[aps_Directory_Get_Directories] (@path,null) dn
WHERE LEN(DirectoryName) = 17
AND DirectoryName LIKE '20%'
AND NOT EXISTS (select LL_name from dbo.LabelsList ll WHERE ll.LL_Name = dn.DirectoryName)
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
GO

View File

@@ -0,0 +1,74 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Aggregate_Stats_Index]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[mon_Aggregate_Stats_Index]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[mon_Aggregate_Stats_Index]
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
La SP va aggreger l'ensemble des statistiques des index contenues dans la table All_Stats_index
Contexte d'utilisation
----------------------
Appelé depuis le job D92090 - Aggregate Stats Index
Creation : 03.08.15 / FLA
Modifications : 18.11.2015 / FLA : Ajout d'un try/catch dans le cas où les bases sont indisponibles et éviter ainsi de ne pas récuperer les stats des bases suivantes
04.10.2017 / FLA : Ajout de la gestion des environnements
=============================================================================*/
set nocount on;
/*------------------- Declaration des variables --------------------*/
/*------------ Affectation des parametres aux variables ------------*/
IF EXISTS (SELECT type FROM master.cfg.InstanceContext WHERE type = 'PROD')
BEGIN
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
truncate table Aggregate_Stats_index
insert into Aggregate_Stats_index
SELECT SI_ServerName,SI_schemaname,SI_databasename,SI_tablename,SI_indexname, SI_indextype, SUM(isnull(SI_user_seeks,0)) NbSeeks, SUM(isnull(SI_user_scans,0)) NbScans, SUM(isnull(SI_user_lookups,0)) NbLookups, SUM(isnull(SI_user_updates,0)) NbUpdates, MIN(SI_updatedate) UpdateDate, MAX(SI_restartdate) restartdate
FROM dbo.All_Stats_index
WHERE SI_deletedate is null
GROUP BY SI_ServerName,SI_schemaname,SI_databasename,SI_tablename, SI_indexname, SI_indextype
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
END
GO

View File

@@ -0,0 +1,69 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Aggregate_Stats_SP]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[mon_Aggregate_Stats_SP]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[mon_Aggregate_Stats_SP]
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
La SP va aggreger l'ensemble des statistiques des procédures stockées contenues dans la table All_Stats_SP
Contexte d'utilisation
----------------------
Appelé depuis le job D92100 - Aggregate Stats SP
Creation : 23.09.20 / FLA
Modifications :
=============================================================================*/
set nocount on;
/*------------------- Declaration des variables --------------------*/
/*------------ Affectation des parametres aux variables ------------*/
IF EXISTS (SELECT type FROM master.cfg.InstanceContext WHERE type = 'PROD')
BEGIN
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
truncate table Aggregate_Stats_SP
insert into Aggregate_Stats_SP
SELECT SS_ServerName,SS_schemaname,SS_databasename,SS_name,SS_type,SUM(isnull(SS_execution_count,0)) NbExecution,MAX(SS_last_execution_time) LastExecutionTime,SUM(isnull(SS_total_worker_time,0)) TotalWorkerTime,SUM(isnull(SS_total_physical_reads,0)) TotalPhysicalReads,SUM(isnull(SS_total_logical_writes,0)) TotalLogicalWrites,SUM(isnull(SS_total_logical_reads,0)) TotalLogicalReads,SUM(isnull(SS_total_elapsed_time,0)) TotalElapsedTime,MIN(SS_updatedate) UpdateDate,MAX(SS_restartdate) RestartDate
FROM dbo.All_Stats_SP
WHERE SS_deletedate is null
GROUP BY SS_ServerName,SS_schemaname,SS_databasename,SS_name,SS_type
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
END
GO

View File

@@ -0,0 +1,183 @@
USE [HCITools];
GO
IF EXISTS ( SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[mon_Change_Tracking]')
AND OBJECTPROPERTY(object_id, N'IsProcedure') = 1)
DROP PROCEDURE [dbo].[mon_Change_Tracking];
GO
CREATE PROCEDURE [mon_Change_Tracking]
@in_threshold INT = 50000,
@in_debug INT = NULL
AS
/*===========================================================================================
Description
-----------
This procedure is called by job DR92290 - Monitoring Change Tracking
Parameters
----------
@in_threshold limit tolerate, over this limit a mail is sent to DBA
@in_debug display result per table and more infos
Creation : 12.04.2023 / RTC
Modifications
-------------
================================================================================================*/
BEGIN
DECLARE @cvCurrentOrganizationalUnit INT,
@subsidiary_id INT,
@DWHVersion BIGINT,
@sqlstmt NVARCHAR(MAX),
@tableName NVARCHAR(128),
@out_default_value VARCHAR(60),
@format VARCHAR(4),
@schema VARCHAR(4),
@ou VARCHAR(3),
@total INT,
@message VARCHAR(MAX);
/* Initialize variables */
SELECT @sqlstmt = N'',
@cvCurrentOrganizationalUnit = NULL,
@subsidiary_id = NULL,
@total = 0;
/* Temp table with amount of records */
DECLARE @tableResult TABLE (ChangesCount INT NULL,
[Schema] VARCHAR(10) NULL,
TableName VARCHAR(800) NULL);
/* Get the cvCurrentOrganizationalUnit */
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 = 'cvCurrentOrganizationalUnit',
@out_default_value = @out_default_value OUTPUT,
@out_param_int_1 = NULL;
SELECT @cvCurrentOrganizationalUnit = CONVERT(INT, @out_default_value);
/* Check if we have a value, if not leave this SP */
IF @cvCurrentOrganizationalUnit IS NULL
BEGIN
RAISERROR('(APS) Error cvCurrentOrganizationalUnit does not exist!', 13, 13);
END;
/* Get the subsidiary id and OU code */
SELECT @subsidiary_id = ou.OU_subsidiary,
@ou = ou.OU_code
FROM Arizona.dbo.Organizational_unit ou
WHERE ou.Organizational_unit_ID = @cvCurrentOrganizationalUnit;
/* Check if we have a value, if not leave this SP */
IF @subsidiary_id IS NULL
BEGIN
RAISERROR('(APS) Error subsidiary_id does not exist!', 13, 13);
END;
/* Get the current format */
SELECT @format = sub.SUB_code
FROM Arizona.dbo.Subsidiary sub
WHERE sub.Subsidiary_ID = @subsidiary_id;
/* Check if we have a value, if not leave this SP */
IF @format IS NULL
BEGIN
RAISERROR('(APS) Error format does not exist!', 13, 13);
END;
/* Change the value into a compatible format */
IF @format = 'COOP'
BEGIN
SET @format = 'CVI';
END;
IF @format = 'CENT'
BEGIN
SET @format = 'SUN';
END;
IF @format = '000'
BEGIN
SET @format = 'AAI';
END;
SELECT @DWHVersion = DBACTD.DBACTD_DWH_version
FROM ARIZONACASH.Arizona.dbo.DBA_change_tracking_DWH DBACTD
WHERE DBACTD.DBACTD_format = @format
AND DBACTD.DBACTD_organizational_unit = @ou
AND DBACTD.DBACTD_update_date > GETDATE() - 3; /* Get only last 3 days */
/* Display Ou infos */
IF @in_debug > 0
SELECT @ou [OU],
@format [Format],
@DWHVersion [DWH_CT_Version];
DECLARE c_ct_table CURSOR READ_ONLY LOCAL FORWARD_ONLY STATIC FOR
SELECT st.name
FROM Arizona.sys.change_tracking_tables ct
JOIN Arizona.sys.tables st
ON ct.object_id = st.object_id;
OPEN c_ct_table;
FETCH NEXT FROM c_ct_table
INTO @tableName;
WHILE @@fetch_status = 0
BEGIN
SELECT @schema = sh.[name]
FROM Arizona.sys.tables st
JOIN Arizona.sys.schemas sh
ON st.schema_id = sh.schema_id
WHERE st.[name] = @tableName;
SET @sqlstmt
= N'SELECT count(*),''' + @schema + N''',''' + @tableName + N''' FROM CHANGETABLE(CHANGES Arizona.'
+ @schema + N'.' + @tableName + N', ' + CONVERT(VARCHAR(MAX), ISNULL(@DWHVersion, 0)) + N') AS CT';
INSERT INTO @tableResult
EXEC (@sqlstmt);
FETCH NEXT FROM c_ct_table
INTO @tableName;
END;
CLOSE c_ct_table;
DEALLOCATE c_ct_table;
/* Display count details per table*/
IF @in_debug > 0
SELECT ChangesCount,
[Schema],
TableName
FROM @tableResult;
SELECT @total = SUM(ChangesCount)
FROM @tableResult;
/* The datamart truggles when there is more than 35000 lies for document line */
IF (@total >= @in_threshold)
OR EXISTS ( SELECT 1
FROM @tableResult
WHERE TableName = 'Document_line'
AND ChangesCount >= 35000)
BEGIN
SELECT @message = 'Total: ' + CONVERT(CHAR(9), @total) + CHAR(13) + CHAR(13);
SELECT @message = @message + '[Table Name] [Schema] [Changes Count]' + CHAR(13);
SELECT @message
= @message + TableName + ' ' + CONVERT(CHAR(9), ISNULL([Schema], ''))
+ CONVERT(CHAR(9), ISNULL(ChangesCount, '')) + CHAR(13)
FROM @tableResult
WHERE ChangesCount > 1
ORDER BY ChangesCount DESC;
EXEC dbo.aps_Send_Mail_with_template @in_param_varchar_2 = 'DBA_operator',
@in_param_varchar_3 = @message,
@in_job_type = 3; /* 0:sans template; 1/NULL:echec; 2:succes; 3:warning; 4:message*/
END;
END;

View File

@@ -0,0 +1,132 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Check_Broker_queues]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[mon_Check_Broker_queues]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[mon_Check_Broker_queues]
@in_debug tinyint = 0
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
La SP va vérifier si l'ensemble des queues du broker ne sont pas désactivées pour chaque base de données
Contexte d'utilisation
----------------------
Appelé depuis le job DR92110 - Check Broker Queues
Parametres
----------
@in_debug : non utilisé
Creation : 31.10.16 / FLA
Modifications : 17.03.2022 - FLA : Change DBA mail
=============================================================================*/
set nocount on;
/*------------------- Declaration des variables --------------------*/
declare @DbName sysname,
@QueueName sysname,
@ErrorMsg varchar(2000),
@cmd varchar(5000)
declare c_database_broker cursor local forward_only static for
select name from sys.databases
WHERE database_id > 4
AND is_broker_enabled = 1
create table #ListBrokerQueues (
DbName sysname,
QueueName sysname)
/*------------ Affectation des parametres aux variables ------------*/
SET @ErrorMsg = ''
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
open c_database_broker
FETCH NEXT FROM c_database_broker
into @DbName
WHILE @@fetch_status = 0
BEGIN
SET @cmd = 'INSERT INTO #ListBrokerQueues
SELECT '''+@DbName+''',name FROM '+ @DbName +'.sys.service_queues
WHERE name NOT IN (''QueryNotificationErrorsQueue'',''EventNotificationErrorsQueue'',''ServiceBrokerQueue'')
and (is_activation_enabled = 0 OR is_receive_enabled = 0 OR is_enqueue_enabled = 0)'
exec (@cmd)
FETCH NEXT FROM c_database_broker
into @DbName
END
CLOSE c_database_broker
DEALLOCATE c_database_broker
declare c_queues cursor local forward_only static for
select DbName, QueueName from #ListBrokerQueues
open c_queues
FETCH NEXT FROM c_queues
into @DbName, @QueueName
WHILE @@fetch_status = 0
BEGIN
SET @ErrorMsg = @ErrorMsg + 'Error in queue ' + @QueueName + ' of Database ' + @DbName + CHAR(13) + CHAR(10)
FETCH NEXT FROM c_queues
into @DbName, @QueueName
END
CLOSE c_queues
DEALLOCATE c_queues
DROP TABLE #ListBrokerQueues
/* S'il y a une erreur, on envoie un mail aux DBA */
IF @ErrorMsg <> ''
BEGIN
exec aps_Send_Mail_with_template
@in_param_varchar_2 = 'DBA_operator;',
@in_job_type = 3, /* 3 = warning */
@in_param_varchar_3 = @ErrorMsg
RAISERROR ('Erreur dans la SP [dbo].[mon_Check_Broker_queues]',16,1)
END
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH

View File

@@ -0,0 +1,117 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Check_Long_Running_Jobs]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[mon_Check_Long_Running_Jobs]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[mon_Check_Long_Running_Jobs]
@in_debug tinyint = 0
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
La SP va vérifier s'il y a des jobs qui tournent depuis plus de 2 heures
Contexte d'utilisation
----------------------
Appelé depuis le job DR92050 - Long Running Jobs
Parametres
----------
@in_debug : non utilisé
Creation : 28.10.16 / FLA
Modifications : 13.01.2017 / RTC Ignore REPL-Merge jobs for Pham index instances.
21.04.2017 / FLA Ignore all jobs of replication
17.03.2022 / FLA : Change DBA mail
29.12.2023 / RTC : Ignore Datamart specific jobs
=============================================================================*/
set nocount on;
/*------------------- Declaration des variables --------------------*/
DECLARE @message VARCHAR(255)
DECLARE @running_jobs TABLE
(
[Job ID] uniqueidentifier,
[Last Run Date] INT,
[Last Run Time] INT,
[Next Run Date] INT,
[Next Run Time] INT,
[Next Run Schedule ID] INT,
[Requested To Run] INT,
[Request Source] INT,
[Request Source ID] NVARCHAR(128),
[Running] INT,
[Current Step] INT,
[Current Retry Attempt] INT,
[State] INT
)
/*------------ Affectation des parametres aux variables ------------*/
SELECT @message = 'Jobs non terminés:' + CHAR(10) + '------------------------------' + char(10)
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
INSERT INTO @running_jobs
EXEC master.dbo.xp_sqlagent_enum_jobs 1,''
SELECT @message = @message + sj.name + ' : ' + convert(VARCHAR(10),datediff( mi, ja.run_requested_date, getdate())) + ' minutes' + char(10)
FROM @running_jobs rj
JOIN msdb.dbo.sysjobs sj WITH (NOLOCK)
ON sj.job_id = rj.[Job ID]
JOIN msdb.dbo.sysjobactivity ja
ON ja.job_id = sj.job_id
AND ja.session_id = (SELECT TOP 1
ja2.session_id
FROM msdb.dbo.sysjobactivity ja2
WHERE ja2.job_id = sj.job_id
ORDER BY ja2.run_requested_date DESC)
JOIN msdb.dbo.syscategories c WITH (NOLOCK)
ON c.category_id = sj.category_id
AND c.name NOT LIKE 'REPL%'
AND sj.name NOT LIKE '%Datamart specific'
WHERE rj.[Running]=1
AND ( DATEDIFF( mi, ja.run_requested_date, GETDATE()) > 5 and sj.name like 'DR%'
OR DATEDIFF( mi, ja.run_requested_date, GETDATE()) > 120 and sj.name not like 'DR%')
IF @@ROWCOUNT > 0
BEGIN
EXEC aps_Send_Mail_with_template
@in_param_varchar_2 = 'DBA_operator;',
@in_param_message = @message;
END
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
GO

View File

@@ -0,0 +1,202 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Check_Open_Tran]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[mon_Check_Open_Tran]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[mon_Check_Open_Tran]
@in_debug tinyint = 0,
@in_Minutes smallint = 5
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
La SP va vérifier s'il n'y a pas des transactions restées ouvertes depuis X minutes
Contexte d'utilisation
----------------------
Appelé depuis le job DR92030 - Lock controller
Parametres
----------
@in_debug : non utilisé
@in_Minutes : nombre de minutes à partir desquelles on déclenche l'alerte
Creation : 28.10.16 / FLA
Modifications : 17.03.2022 - FLA : Change DBA mail
=============================================================================*/
set nocount on;
/*------------------- Declaration des variables --------------------*/
declare @programSQL varchar (255),
@cmdAlert varchar (255),
@maxToleranceTime int,
@name varchar (255),
@result_sp int,
@spid sql_variant,
@message varchar (8000),
@subject varchar (8000),
@machine varchar (100),
@cmd varchar (8000)
/*------------ Affectation des parametres aux variables ------------*/
select @maxToleranceTime = @in_Minutes, /* minutes */
@programSQL = '%Microsoft SQL Server Management Studio - Query%',
@cmdAlert = '%AWAITING COMMAND%'
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
/* ON PARCOURT TOUTES LES BASES */
CREATE TABLE #Open_transaction (
OPTR_key varchar(25),
OPTR_value sql_variant
)
declare c_databases cursor local forward_only static for
SELECT name
FROM sys.databases
WHERE state = 0
open c_databases
FETCH NEXT FROM c_databases
into @name
while @@fetch_status <> -1
begin
if @@fetch_status <> -2
begin
select @cmd = 'DBCC OPENTRAN ([' + @name + ']) WITH TABLERESULTS, NO_INFOMSGS'
INSERT INTO #Open_transaction
EXEC (@cmd)
end /* if @@fetch_status <> -2 */
FETCH NEXT FROM c_databases
into @name
end /* while @@fetch_status <> -1 */
close c_databases
deallocate c_databases
/* Retrieve SPID. */
declare c_transactions cursor local forward_only static for
select optr_value
from #open_transaction
where optr_key like '%spid%'
open c_transactions
FETCH NEXT FROM c_transactions
into @spid
while @@fetch_status <> -1
begin
if @@fetch_status <> -2
begin
select @message = null
select @machine = '[' + ltrim(rtrim(p.hostname)) + ']',
@subject = 'Commit/rollback qui a été oublié ?',
@message = 'Commit/rollback qui a été oublié ?
La session ['
+ convert (varchar (10), p.spid)
+ '], lancée depuis le programme ['
+ ltrim(rtrim(p.program_name))
+ '] a une transaction ouverte depuis au moins ['
+ convert (varchar (10), datediff (mi, p.last_batch, getdate ()))
+ '] minutes, à partir du poste ['
+ ltrim(rtrim(p.hostname))
+ '] en tant qu''utilisateur ['
+ ltrim(rtrim(p.loginame))
+ '] sur la base ['
+ ltrim(rtrim(db.name))
+ '].
La connection est dans l''état ['
+ ltrim(rtrim(p.cmd))
+ '].
Faire un commit/rollback dès que possible, pour éviter que d''autres sessions SQL se retrouvent bloquées (si ce n''est pas déjà le cas).'
from master..sysprocesses p with (nolock)
left join master..sysdatabases db with (nolock)
on db.dbid = p.dbid
left join master..sysusers usr with (nolock)
on usr.uid = p.uid
left join master..sysprocesses p2 with (nolock)
on p2.spid = p.blocked
left join master..sysdatabases db2 with (nolock)
on db2.dbid = p2.dbid
left join master..sysusers usr2 with (nolock)
on usr2.uid = p2.uid
where convert (varchar, p.spid) = @spid
and p.program_name like @programSQL
and datediff (mi, p.last_batch, getdate ()) >= @maxToleranceTime
and p.cmd like @cmdAlert
if @message is not null
begin
declare @sendTo varchar (8000)
select @sendTo = 'DBA_operator;' + isnull (@machine, '')
exec aps_Send_Mail_with_template
@in_param_subject = @subject,
@in_param_varchar_2 = @sendTo,
@in_param_varchar_3 = @message,
@in_param_priority = 'HIGH',
@in_job_type = 0 /* 0 = pas de template */
end
end /* if @@fetch_status <> -2 */
FETCH NEXT FROM c_transactions
into @spid
end /* while @@fetch_status <> -1 */
close c_transactions
deallocate c_transactions
drop table #Open_transaction
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
GO

View File

@@ -0,0 +1,174 @@
USE [HCITools]
GO
/****** Object: StoredProcedure [dbo].[mon_Check_Performance_Issue] Script Date: 11/09/2018 10:48:38 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Check_Performance_Issue]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[mon_Check_Performance_Issue]
GO
USE [HCITools]
GO
/****** Object: StoredProcedure [dbo].[mon_Check_Performance_Issue] Script Date: 11/09/2018 10:48:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[mon_Check_Performance_Issue]
@in_debug tinyint = 0,
@in_NbHours tinyint = 3
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
La SP va check un ensemble de point de performance sur l'instance
Contexte d'utilisation
----------------------
Appelé depuis le job DR92180 - Check Performance Issue
Parametres
----------
@in_debug : non utilisé
@in_NbHours : plage horaire d'analyse en heure
Creation : 09.11.18 / FLA
Modifications : 12.11.18 / FLA Correction envoi de mail avec message d'erreur
17.03.22 / FLA Change DBA mail
07.04.22 / RTC optimize perf
=============================================================================*/
set nocount on;
/*------------------- Declaration des variables --------------------*/
declare @PLE int,
@NbCount smallint,
@messageError varchar (8000),
@errno int,
@errmsg varchar(255),
@ou_code varchar (15)
/*------------ Affectation des parametres aux variables ------------*/
select @errno = 0
SET @messageError = ''
SET @errmsg = ''
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
select @ou_code = ou.OU_code
from Arizona.dbo.Bmc_application_key bapk with (nolock)
join Arizona.dbo.Bmc_application_default bapd with (nolock)
on bapd.BAPD_bmc_application_key = bapk.Bmc_application_key_ID
join Arizona.dbo.Organizational_unit ou with (nolock)
on convert (varchar, ou.organizational_unit_id) = bapd.BAPD_value
where bapk.BAPK_key = 'cvCurrentOrganizationalUnit'
/* RETRIEVE HH:MI OF WORKING HOURS */
declare @Hour_start varchar (5),
@Hour_end varchar (5)
;
select @Hour_start = isnull(dwoho.DWOHO_start_time_earliest, '07:00'),
@Hour_end = isnull(dwoho.DWOHO_end_time_latest, '21:00')
from Arizona.dbo.DBA_Working_hours dwoho with (nolock)
join Arizona.dbo.Organizational_unit ou with (nolock)
on ou.Organizational_unit_id = dwoho.DWOHO_organizational_unit
where ou.ou_code = @ou_code
;
select @PLE = CAST((CAST([value_in_use] AS INT) / 1024.0) / 4.0 * 300.0 AS INT)
from sys.configurations
WHERE name = 'max server memory (MB)'
select @NbCount = COUNT(*) from dbo.Monitoring_counter MC
inner join dbo.Monitoring_history MH
ON MH.MH_monitoring_counter = MC.Monitoring_counter_ID
where MC_name = 'Free list stalls/sec'
AND MH_datetime >= DATEADD(hour,-@in_NbHours,GETDATE())
AND MH_value >= 2
AND MH_datetime >= @Hour_start
AND MH_datetime <= @Hour_end
IF @NbCount > 5
SET @messageError = @messageError + 'WARNING Free list stalls/sec'+CHAR(13)+CHAR(10)
select @NbCount = COUNT(*) from dbo.Monitoring_counter MC
inner join dbo.Monitoring_history MH
ON MH.MH_monitoring_counter = MC.Monitoring_counter_ID
where MC_name = 'Lazy writes/sec'
AND MH_datetime >= DATEADD(hour,-@in_NbHours,GETDATE())
AND MH_value >= 20
AND MH_datetime >= @Hour_start
AND MH_datetime <= @Hour_end
IF @NbCount > 5
SET @messageError = @messageError + 'WARNING Lazy writes/sec'+CHAR(13)+CHAR(10)
select @NbCount = COUNT(*) from dbo.Monitoring_counter MC
inner join dbo.Monitoring_history MH
ON MH.MH_monitoring_counter = MC.Monitoring_counter_ID
where MC_name = 'Page reads/sec'
AND MH_datetime >= DATEADD(hour,-@in_NbHours,GETDATE())
AND MH_value >= 90
AND MH_datetime >= @Hour_start
AND MH_datetime <= @Hour_end
IF @NbCount > 15
SET @messageError = @messageError + 'WARNING Page reads/sec'+CHAR(13)+CHAR(10)
select @NbCount = COUNT(*) from dbo.Monitoring_counter MC
inner join dbo.Monitoring_history MH
ON MH.MH_monitoring_counter = MC.Monitoring_counter_ID
where MC_name = 'Page life expectancy'
AND MH_datetime >= DATEADD(hour,-@in_NbHours,GETDATE())
AND MH_value <= @PLE
AND MH_datetime >= @Hour_start
AND MH_datetime <= @Hour_end
IF @NbCount > 20
SET @messageError = @messageError + 'WARNING Page life expectancy'+CHAR(13)+CHAR(10)
select @NbCount = COUNT(*) from dbo.Monitoring_counter MC
inner join dbo.Monitoring_history MH
ON MH.MH_monitoring_counter = MC.Monitoring_counter_ID
where MC_name = 'Memory Grants Pending'
AND MH_datetime >= DATEADD(hour,-@in_NbHours,GETDATE())
AND MH_value >= 1
AND MH_datetime >= @Hour_start
AND MH_datetime <= @Hour_end
IF @NbCount > 5
SET @messageError = @messageError + 'WARNING Memory Grants Pending'+CHAR(13)+CHAR(10)
IF @messageError <> ''
BEGIN
exec aps_Send_Mail_with_template
@in_param_varchar_2 = 'DBA_operator;',
@in_job_type = 3, /* 3 = warning */
@in_param_varchar_3 = @messageError
END
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
GO

View File

@@ -0,0 +1,171 @@
USE [HCITools]
GO
/****** Object: StoredProcedure [dbo].[mon_Collect_Stats_SP] Script Date: 23.09.2020 14:15:00 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Collect_Stats_SP]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[mon_Collect_Stats_SP]
GO
/****** Object: StoredProcedure [dbo].[mon_Collect_Stats_SP] Script Date: 23.09.2020 14:15:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Collect_Stats_SP]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[mon_Collect_Stats_SP] AS'
END
GO
ALTER PROCEDURE [dbo].[mon_Collect_Stats_SP]
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
La SP va stocker l'ensemble des statistiques des procédures stockées contenues dans la DMV [sys].[dm_exec_procedure_stats] et créer un historique pour chaque redémarrage du serveur
Contexte d'utilisation
----------------------
Appelé depuis le job D92030 - Collect Stats SP
Creation : 23.09.20 / FLA
Modifications : 17.03.2022 - FLA : Change DBA mail
=============================================================================*/
set nocount on;
/*------------------- Declaration des variables --------------------*/
declare @databaseID smallint,
@databasename sysname,
@restartdate datetime,
@actualdate datetime,
@sql nvarchar(4000),
@messageError varchar (8000),
@errno int,
@errmsg varchar(255)
/*------------ Affectation des parametres aux variables ------------*/
select @RestartDate = MIN(login_time)
from sys.sysprocesses
select @actualdate = GETDATE()
select @errno = 0
SET @messageError = ''
SET @errmsg = ''
IF EXISTS (SELECT type FROM master.cfg.InstanceContext WHERE type = 'PROD')
BEGIN
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
DECLARE c_databases CURSOR FAST_FORWARD FOR
select database_id, name
from sys.databases
where database_id > 4
open c_databases
FETCH NEXT FROM c_databases
into @databaseID, @databasename
/* On parcourt chaque base de données pour récuperer les informations des index */
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
SET @sql = 'insert into dbo.Stats_SP (SS_schemaname,SS_databasename,SS_name,SS_type,SS_execution_count,SS_last_execution_time,SS_total_worker_time,SS_total_physical_reads,SS_total_logical_writes,SS_total_logical_reads,SS_total_elapsed_time,SS_updatedate,SS_restartdate)
select OBJECT_SCHEMA_NAME(sp.object_id,'+ CAST(@databaseID AS nvarchar(4)) +'),'''+ @databasename +''',sp.name,sp.type_desc, null, null, null ,null ,null ,null, null, CAST('''+ CONVERT(nvarchar(30),@actualdate,126) +''' as datetime), CAST('''+ CONVERT(nvarchar(30),@RestartDate,126) +''' as datetime)
from '+ @databasename +'.sys.procedures sp
WHERE NOT EXISTS (select *
from dbo.Stats_SP as SS
where ISNULL(SS.SS_name,'''') COLLATE SQL_Latin1_General_CP1_CI_AS = ISNULL(sp.name,'''') COLLATE SQL_Latin1_General_CP1_CI_AS
and SS.SS_databasename COLLATE SQL_Latin1_General_CP1_CI_AS = '''+ @databasename +''' COLLATE SQL_Latin1_General_CP1_CI_AS
and SS.SS_schemaname COLLATE SQL_Latin1_General_CP1_CI_AS = OBJECT_SCHEMA_NAME(sp.object_id,'+ CAST(@databaseID AS nvarchar(4)) +') COLLATE SQL_Latin1_General_CP1_CI_AS
and SS_updatedate > CAST('''+ CONVERT(nvarchar(30),@RestartDate,126) +''' as datetime))'
EXEC(@sql)
/* On met à jour les stats des SP dans la table dbo.Stats_SP */
SET @sql = N'UPDATE dbo.Stats_SP SET SS_execution_count = eps.execution_count,
SS_last_execution_time = eps.last_execution_time,
SS_total_worker_time = eps.total_worker_time,
SS_total_physical_reads = eps.total_physical_reads,
SS_total_logical_writes = eps.total_logical_writes,
SS_total_logical_reads = eps.total_logical_reads,
SS_total_elapsed_time = eps.total_elapsed_time,
SS_updatedate = CAST('''+ CONVERT(nvarchar(30),@actualdate,126) +''' as datetime)
FROM (SELECT sp.object_id,sp.name,SUM(eps.execution_count) execution_count,
MAX(eps.last_execution_time) last_execution_time,
SUM(eps.total_worker_time) total_worker_time,
SUM(eps.total_physical_reads) total_physical_reads,
SUM(eps.total_logical_writes) total_logical_writes,
SUM(eps.total_logical_reads) total_logical_reads,
SUM(eps.total_elapsed_time) total_elapsed_time
FROM [sys].[dm_exec_procedure_stats] eps
INNER JOIN '+ @databasename + '.sys.procedures sp
ON sp.object_id = eps.object_id
AND eps.database_id = '+ CAST(@databaseID AS nvarchar(4)) +'
GROUP BY sp.object_id,sp.name) as eps
WHERE ISNULL(SS_name,'''') COLLATE SQL_Latin1_General_CP1_CI_AS = ISNULL(eps.name,'''') COLLATE SQL_Latin1_General_CP1_CI_AS
AND SS_databasename COLLATE SQL_Latin1_General_CP1_CI_AS = '''+ @databasename +''' COLLATE SQL_Latin1_General_CP1_CI_AS
AND SS_schemaname COLLATE SQL_Latin1_General_CP1_CI_AS = OBJECT_SCHEMA_NAME(eps.object_id,'+ CAST(@databaseID AS nvarchar(4)) +') COLLATE SQL_Latin1_General_CP1_CI_AS
AND SS_updatedate > CAST('''+ CONVERT(nvarchar(30),@RestartDate,126) +''' as datetime)'
EXEC(@sql)
END TRY
BEGIN CATCH
select @messageError = @messageError + 'Collect_Stats_SP failed : ' + @databasename + ' ' + ERROR_MESSAGE() + CHAR(13)
SET @errno = @errno + 1
END CATCH
FETCH NEXT FROM c_databases
into @databaseID, @databasename
END
CLOSE c_databases
DEALLOCATE c_databases
/* S'il y a une erreur, on envoie un mail aux DBA */
IF @messageError <> ''
BEGIN
exec aps_Send_Mail_with_template
@in_param_varchar_2 = 'DBA_operator;',
@in_job_type = 3, /* 3 = warning */
@in_param_varchar_3 = @messageError
RAISERROR ('Erreur dans la SP [dbo].[mon_Collect_Stats_SP]',16,1)
END
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
END
GO

View File

@@ -0,0 +1,129 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_DDL_Audit_Alerts]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[mon_DDL_Audit_Alerts]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
CREATE PROCEDURE [dbo].[mon_DDL_Audit_Alerts]
@in_debug tinyint = 0
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
La SP va rechercher les modifications de DDL dans [master].[dba].[DDL_audit]
Contexte d'utilisation
----------------------
Appelé depuis le job D92120 - DDL Audit Alerts
Parametres
----------
@in_debug : non utilisé
Creation : 13.04.21 / RTC
Modifications : 11.08.2021 / spe : #TFS65583# Migrate personal email address from [hcisolutions.ch] to [galenica.com]
=============================================================================*/
SET QUOTED_IDENTIFIER ON
DECLARE @subject NVARCHAR(MAX),
@html_msg NVARCHAR(MAX),
@html_table NVARCHAR(MAX)
/* Run only on centrals Validation and Dev */
IF NOT EXISTS (SELECT 1 FROM [master].[cfg].[InstanceContext] WHERE [Business] = 'TPCENT' AND [TYPE] in ('DEVE','VALI'))
RETURN
BEGIN TRY
/* Formatage du message et envoi */
SELECT @subject = @@SERVERNAME + ' - DDL Audit'
SET @html_table = N''
SELECT @html_table = @html_table + '<tr style="color:black;background-color:white;">' +
'<td>' + DA_Host_Name + '</td>' +
'<td>' + ISNULL(SPID,'') + '</td>' +
'<td>' + ISNULL(DatabaseName,'') + '</td>' +
'<td>' + ISNULL(SchemaName,'') + '</td>' +
'<td>' + ISNULL(ObjectName,'') + '</td>' +
'<td>' + ISNULL(EventType,'') + '</td>' +
'<td>' + DA_App_Name + '</td>' +
'<td>' + CONVERT(NVARCHAR(25),PostTime) + '</td>' +
'</tr>'
FROM (SELECT DA_Host_Name,
DA_Event_Xml.value('(./EVENT_INSTANCE/SPID)[1]','NVARCHAR(MAX)') AS SPID,
DA_Event_Xml.value('(./EVENT_INSTANCE/PostTime)[1]','NVARCHAR(MAX)') AS PostTime,
DA_App_Name,
DA_Event_Xml.value('(./EVENT_INSTANCE/EventType)[1]','NVARCHAR(MAX)') AS EventType,
DA_Event_Xml.value('(./EVENT_INSTANCE/DatabaseName)[1]','NVARCHAR(MAX)') AS DatabaseName,
DA_Event_Xml.value('(./EVENT_INSTANCE/SchemaName)[1]','NVARCHAR(MAX)') AS SchemaName,
DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectName)[1]','NVARCHAR(MAX)') AS ObjectName
FROM [master].[dba].[DDL_audit]
WHERE ISNULL(DA_App_Name,'') NOT IN ('SQLCMD','.Net SqlClient Data Provider',
'ActivePharmacy.ArizonaServerService',
'ActivePharmacy.ActivePosClientService',
'ActivePharmacyStock',
'Microsoft® Windows® Operating System',
'SQLAgent - Initial Boot Probe',
'SQLAgent - Enabling/disabling Agent XPs',
'Microsoft SQL Server',
'APS® TriaOne-Cash'
)
AND DA_App_Name not like 'SQLAgent - TSQL%'
AND ISNULL(DA_Event_Xml.value('(./EVENT_INSTANCE/DatabaseName)[1]','NVARCHAR(MAX)'),'') NOT IN ('tempdb','ArizonaCUST','master','PharmIndexTP')
AND DA_Event_Xml.value('(./EVENT_INSTANCE/PostTime)[1]','NVARCHAR(MAX)') > GETDATE()-1
) AS myEventsTable
GROUP BY DA_Host_Name,
SPID,
DA_App_Name,
EventType,
DatabaseName,
SchemaName,
ObjectName,
PostTime
ORDER BY DA_Host_Name,
DatabaseName,
SchemaName,
ObjectName,
PostTime ASC
IF @@ROWCOUNT > 0
BEGIN
SET @html_msg =
N'<H3><font color="Black">DDL Audit by SQL operators</H3>' +
N'<table border="1" align="left" cellpadding="2" cellspacing="0" style="color:white;font-family:arial,helvetica,sans-serif;text-align:center;" >' +
N'<tr style ="font-size: 14px;font-weight: normal;background:black;">
<th>Host Name</th>
<th>SPID</th>
<th>Database Name</th>
<th>Schema Name</th>
<th>Object Name</th>
<th>Event Type</th>
<th>Application Name</th>
<th>Post Time</th>
</tr>' + @html_table + N'</table>'
EXEC msdb.dbo.sp_send_dbmail @recipients= 'laurent.perroud@galenica.com;raphael.mognetti@galenica.com',
@subject = @subject,
@body = @html_msg,
@body_format = 'HTML' ;
END
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH

View File

@@ -0,0 +1,115 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_DML_PH_insurance]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[mon_DML_PH_insurance]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[mon_DML_PH_insurance]
@in_debug tinyint = 0
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
La SP va rechercher les modifications de DML pour la table PH insurance les derniers 4h
Contexte d'utilisation
----------------------
Appelé depuis le job DR90010 - Central Track PH Insurance DML Alerts
Parametres
----------
@in_debug : non utilisé
Creation : 10.03.21 / RTC
Modifications : 11.08.2021 / spe : #TFS65583# Migrate personal email address from [hcisolutions.ch] to [galenica.com]
07.08.2021 / spe : #TFS65583# Migrate personal email address from [hcisolutions.ch] to [galenica.com] - Corrections
16.03.2022 / FLA : Standardisation des mails
23.10.2023 / tsc : #OCTPDBA-792 remove occurences of christophe.dorion@galenicare.com from mailing lists
=============================================================================*/
set nocount on;
/*------------------- Declaration des variables --------------------*/
DECLARE @subject NVARCHAR(MAX),
@html_msg NVARCHAR(MAX),
@html_table NVARCHAR(MAX),
@currentDate DATETIME
/*------------ Affectation des parametres aux variables ------------*/
SET @currentDate = GETDATE()
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
SET QUOTED_IDENTIFIER ON
/* Run only on centrals for GCM format */
IF NOT EXISTS (SELECT 1 FROM [master].[cfg].[InstanceContext] WHERE [Business] = 'TPCENT')
RETURN
IF NOT EXISTS (SELECT 1 FROM [master].[cfg].[Identity] WHERE Format = 'GCM')
RETURN
/* Formatage du message et envoi */
SELECT @subject = @@SERVERNAME + ' - DML audit PH_insurance'
SET @html_table = N''
SELECT @html_table = @html_table + '<tr style="color:black;background-color:white;">' +
'<td>' + ISNULL(DMA_Host_Name,'') + '</td>' +
'<td>' + ISNULL(convert(varchar(10), DMA_SPID),'') + '</td>' +
'<td>' + ISNULL(DMA_Event_Info,'') + '</td>' +
'<td>' + DMA_App_Name + '</td>' +
'<td>' + CONVERT(NVARCHAR(25),DMA_Datetime) + '</td>' +
'</tr>'
FROM [master].[dba].[DML_audit]
WHERE dma_table_name = 'ph_insurance'
AND (@currentDate <= DATEADD(MI,250,DMA_Datetime))
--ORDER BY DMA_Datetime ASC
IF @@ROWCOUNT > 0
BEGIN
SET @html_msg =
N'<H3><font color="Black">PH Insurance DML Audit</H3>' +
N'<table border="1" align="left" cellpadding="2" cellspacing="0" style="color:white;font-family:arial,helvetica,sans-serif;text-align:center;" >' +
N'<tr style ="font-size: 14px;font-weight: normal;background:black;">
<th>Host Name</th>
<th>SPID</th>
<th>DMA_Event_Info</th>
<th>Application Name</th>
<th>Update Time</th>
</tr>' + @html_table + N'</table>'
EXEC Arizona.[dbo].[aps_Send_Mail_with_template] @in_job_type = 0,
@in_param_varchar_2 = 'DBA_operator',
@in_param_subject = @subject,
@in_param_message = @html_msg;
END
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
GO

View File

@@ -0,0 +1,114 @@
USE [HCITools]
GO
/****** Object: StoredProcedure [dbo].[mon_Dereserve_SQL_Server_Memory] Script Date: 11/09/2018 12:07:00 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Dereserve_SQL_Server_Memory]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[mon_Dereserve_SQL_Server_Memory]
GO
USE [HCITools]
GO
/****** Object: StoredProcedure [dbo].[mon_Dereserve_SQL_Server_Memory] Script Date: 11/09/2018 12:07:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[mon_Dereserve_SQL_Server_Memory]
@in_debug tinyint = 0
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
La SP va déreserver la mémoire allouée par SQL Server
Contexte d'utilisation
----------------------
Appelé depuis le job D92190 - Dereserve SQL Server Memory
Parametres
----------
@in_debug : non utilisé
Creation : 09.11.18 / FLA
Modifications : 25.01.2019 / FLA : Utilisation du max server memory dans HCI_PARAMS
30.01.2019 / FLA : Ajout d'un check du MaxServerMemory
03.05.2019 / FLA : Modification de l'initialisation du max server memory
=============================================================================*/
set nocount on;
/*------------------- Declaration des variables --------------------*/
declare @MaxServerMemory int,
@ActualServerMemory int,
@errno int,
@errmsg varchar(255)
/*------------ Affectation des parametres aux variables ------------*/
select @errno = 0
SET @errmsg = ''
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
IF(Arizona.dbo.aps_fn_Is_working_hour (dateadd (mi, 15, getdate()), null, null) = 1 and Arizona.dbo.aps_fn_Is_working_hour (getdate(), null, null) = 0)
BEGIN
SELECT @MaxServerMemory = HCIP_value FROM [HCITools].[dbo].[HCI_PARAMS] WHERE [HCIP_key] = 'MAXSRVMEM'
SET @ActualServerMemory = @MaxServerMemory
exec master.dbo.sp_configure 'show advanced option', 1;
RECONFIGURE WITH OVERRIDE
exec master.dbo.sp_configure 'max server memory (MB)',6144
exec master.dbo.sp_configure 'show advanced option', 0;
RECONFIGURE WITH OVERRIDE
WHILE(@ActualServerMemory <> 6144)
BEGIN
SELECT @ActualServerMemory = cntr_value/1024 FROM sys.dm_os_performance_counters WHERE counter_name = 'Total Server Memory (KB)'
WAITFOR DELAY '00:00:15'
END
exec master.dbo.sp_configure 'show advanced option', 1;
RECONFIGURE WITH OVERRIDE
exec master.dbo.sp_configure 'max server memory (MB)',@MaxServerMemory
exec master.dbo.sp_configure 'show advanced option', 0;
RECONFIGURE WITH OVERRIDE
END
ELSE IF (Arizona.dbo.aps_fn_Is_working_hour (getdate(), null, null) = 1)
BEGIN
SELECT @ActualServerMemory = CAST(value_in_use as INT) FROM sys.configurations WHERE [name] = 'max server memory (MB)'
SELECT @MaxServerMemory = HCIP_value FROM [HCITools].[dbo].[HCI_PARAMS] WHERE [HCIP_key] = 'MAXSRVMEM'
IF (@ActualServerMemory <> @MaxServerMemory)
BEGIN
exec master.dbo.sp_configure 'show advanced option', 1;
RECONFIGURE WITH OVERRIDE
exec master.dbo.sp_configure 'max server memory (MB)',@MaxServerMemory
exec master.dbo.sp_configure 'show advanced option', 0;
RECONFIGURE WITH OVERRIDE
END
END
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
GO

View File

@@ -0,0 +1,67 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Purge_All_Stats_Index]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[mon_Purge_All_Stats_Index]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[mon_Purge_All_Stats_Index]
@in_debug tinyint = null
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette SP sert à supprimer les données des statistiques des indexes de plus de 12 mois
Contexte d'utilisation
----------------------
Cette SP est appelée par le job D93150 - Purge All Stats Index
Parametres
----------
@in_debug : non utilisé
Creation : 04.10.18 / SPE
Modifications :
26.02.2019 - SPE - #TFS51645# Reduce history retention on table [HCITools].[dbo].[All_Stats_index]
=============================================================================*/
set nocount on;
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
/* suppression de l'historique des indexes plus vieux de 12 mois */
DELETE [HCITools].[dbo].[All_Stats_index]
WHERE SI_updatedate <= dateadd(month, -12, getdate())
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
GO

View File

@@ -0,0 +1,67 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Purge_All_Stats_SP]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[mon_Purge_All_Stats_SP]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[mon_Purge_All_Stats_SP]
@in_debug tinyint = null
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette SP sert à supprimer les données des statistiques des procédure stockées de plus de 12 mois
Contexte d'utilisation
----------------------
Cette SP est appelée par le job D93140 - Purge All Stats SP
Parametres
----------
@in_debug : non utilisé
Creation : 23.09.20 / FLA
Modifications :
=============================================================================*/
set nocount on;
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
/* suppression de l'historique des SP plus vieux de 12 mois */
DELETE [HCITools].[dbo].[All_Stats_SP]
WHERE SS_updatedate <= dateadd(month, -12, getdate())
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
GO

View File

@@ -0,0 +1,70 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Purge_Stats_Index]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[mon_Purge_Stats_Index]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[mon_Purge_Stats_Index]
@in_debug tinyint = 0
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
La SP va purger l'ensemble des traces contenues dans la table HCITools.dbo.Stats_index datant d'avant le redémarrage du serveur
Contexte d'utilisation
----------------------
Appelé depuis le job D9207X - Transfert Stats Index
Parametres
----------
@in_debug : non utilisé
Creation : 27.10.16 / FLA
Modifications : 28.10.2016 / FLA : Standardisation de la gestion des erreurs
24.09.2018 / FLA : Remove references to undocumented system tables
=============================================================================*/
set nocount on;
/*------------------- Declaration des variables --------------------*/
declare @restartdate datetime,
@errno int,
@errmsg varchar(255)
/*------------ Affectation des parametres aux variables ------------*/
select @RestartDate = MIN(login_time) from sys.dm_exec_sessions
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
DELETE si FROM [HCITools].[dbo].[Stats_index] si
WHERE SI_updatedate < CAST(CONVERT(nvarchar(30),@RestartDate,126) as datetime)
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
GO

View File

@@ -0,0 +1,68 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Purge_Stats_SP]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[mon_Purge_Stats_SP]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[mon_Purge_Stats_SP]
@in_debug tinyint = 0
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
La SP va purger l'ensemble des traces contenues dans la table HCITools.dbo.Stats_SP datant d'avant le redémarrage du serveur
Contexte d'utilisation
----------------------
Appelé depuis le job D9208X - Transfert Stats Index
Parametres
----------
@in_debug : non utilisé
Creation : 23.09.20 / FLA
Modifications :
=============================================================================*/
set nocount on;
/*------------------- Declaration des variables --------------------*/
declare @restartdate datetime,
@errno int,
@errmsg varchar(255)
/*------------ Affectation des parametres aux variables ------------*/
select @RestartDate = MIN(login_time) from sys.sysprocesses
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
DELETE sp FROM [HCITools].[dbo].[Stats_SP] sp
WHERE SS_updatedate < CAST(CONVERT(nvarchar(30),@RestartDate,126) as datetime)
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
GO

View File

@@ -0,0 +1,145 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Transfert_Stats_Index]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[mon_Transfert_Stats_Index]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[mon_Transfert_Stats_Index]
@in_debug tinyint = 0
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
La SP va transferer l'ensemble des statistiques des index contenues dans la table HCITools.dbo.Stats_index vers la table HCITools.dbo.All_Stats_Index de la centrale
Contexte d'utilisation
----------------------
Appelé depuis le job D92070 - Transfert Stats Index
Parametres
----------
@in_debug : non utilisé
Creation : 27.10.16 / FLA
Modifications : 28.10.2016 / FLA : Standardisation de la gestion des erreurs
04.10.2017 / FLA : Ajout de la gestion des environnements
24.09.2018 / FLA : Remove references to undocumented system tables
20.12.2018 / SPE : #TFS49408# Migrate identification table [master].[cfg].[Identity]
04.08.2023 / TSC : Added a WHERE NOT EXISTS to avoid duplicate key errors during upload
=============================================================================*/
set nocount on;
/*------------------- Declaration des variables --------------------*/
declare @cvCurrentOrganizationalUnit int,
@CV_OUT_value varchar(8000),
@ou_code varchar(10),
@ServerName varchar(20),
@restartdate datetime,
@errno int,
@errmsg varchar(255),
@LnkSrv varchar(15),
@cmd varchar(8000),
@Entity varchar(4)
/*------------ Affectation des parametres aux variables ------------*/
select @cvCurrentOrganizationalUnit = null ;
/*-------------------------- Traitement ---------------------------*/
IF EXISTS (SELECT type FROM master.cfg.InstanceContext WHERE type = 'PROD')
BEGIN
BEGIN TRY
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 = 'cvCurrentOrganizationalUnit',
@out_default_value = @CV_out_value output,
@out_param_int_1 = null;
select @cvCurrentOrganizationalUnit = convert(int,@CV_out_value)
select @ou_code = ou.ou_code
from arizona.dbo.Organizational_unit ou (nolock)
where ou.Organizational_unit_ID = @cvCurrentOrganizationalUnit
SELECT @Entity = [Customer] FROM [master].[cfg].[Identity]
IF @Entity = 'RUEG'
BEGIN
SET @Entity = 'AAI'
END
SET @ServerName = @Entity+isnull(@ou_code,'')+'APS'
select @RestartDate = MIN(login_time)
from sys.dm_exec_sessions
IF @Entity = 'AAI'
SET @LnkSrv = 'CENTRALEDATA'
ELSE
SET @LnkSrv = 'ARIZONACASH'
SET @cmd = 'INSERT INTO '+@LnkSrv+'.HCITools.dbo.All_Stats_Index
SELECT TOP 50000 '''+@ServerName+''',[Stats_index_ID]
,[SI_schemaname]
,[SI_databasename]
,[SI_tablename]
,[SI_indexname]
,[SI_indextype]
,[SI_user_seeks]
,[SI_user_scans]
,[SI_user_lookups]
,[SI_user_updates]
,[SI_last_user_seek]
,[SI_last_user_scan]
,[SI_last_user_lookup]
,[SI_last_user_update]
,[SI_updatedate]
,[SI_restartdate]
,NULL
FROM [HCITools].[dbo].[Stats_index] si WITH (NOLOCK)
WHERE SI_updatedate < CAST('''+CONVERT(nvarchar(30),@RestartDate,126)+''' as datetime)
AND NOT EXISTS(
SELECT 1
FROM '+@LnkSrv+'.HCITools.dbo.All_Stats_Index t
WHERE t.[SI_ServerName] = '''+@ServerName+'''
AND t.[Stats_index_ID] = si.[Stats_index_ID]
)
'
EXEC (@cmd)
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
END
GO

View File

@@ -0,0 +1,140 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Transfert_Stats_SP]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[mon_Transfert_Stats_SP]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[mon_Transfert_Stats_SP]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[mon_Transfert_Stats_SP] AS'
END
GO
ALTER PROCEDURE [dbo].[mon_Transfert_Stats_SP]
@in_debug tinyint = 0
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
La SP va transferer l'ensemble des statistiques des procédures stockées contenues dans la table HCITools.dbo.Stats_SP vers la table HCITools.dbo.All_Stats_SP de la centrale
Contexte d'utilisation
----------------------
Appelé depuis le job D9208X - Transfert Stats SP
Parametres
----------
@in_debug : non utilisé
Creation : 23.09.20 / FLA
Modifications :
=============================================================================*/
set nocount on;
/*------------------- Declaration des variables --------------------*/
declare @cvCurrentOrganizationalUnit int,
@CV_OUT_value varchar(8000),
@ou_code varchar(10),
@ServerName varchar(20),
@restartdate datetime,
@errno int,
@errmsg varchar(255),
@LnkSrv varchar(15),
@cmd varchar(8000),
@Entity varchar(4)
/*------------ Affectation des parametres aux variables ------------*/
select @cvCurrentOrganizationalUnit = null ;
/*-------------------------- Traitement ---------------------------*/
IF EXISTS (SELECT type FROM master.cfg.InstanceContext WHERE type = 'PROD')
BEGIN
BEGIN TRY
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 = 'cvCurrentOrganizationalUnit',
@out_default_value = @CV_out_value output,
@out_param_int_1 = null;
select @cvCurrentOrganizationalUnit = convert(int,@CV_out_value)
select @ou_code = ou.ou_code
from arizona.dbo.Organizational_unit ou (nolock)
where ou.Organizational_unit_ID = @cvCurrentOrganizationalUnit
SELECT @Entity = [Customer] FROM [master].[cfg].[Identity]
IF @Entity = 'RUEG'
BEGIN
SET @Entity = 'AAI'
END
SET @ServerName = @Entity+isnull(@ou_code,'')+'APS'
select @RestartDate = MIN(login_time)
from sys.sysprocesses
IF @Entity = 'AAI'
SET @LnkSrv = 'CENTRALEDATA'
ELSE
SET @LnkSrv = 'ARIZONACASH'
SET @cmd = 'INSERT INTO '+@LnkSrv+'.HCITools.dbo.All_Stats_SP
SELECT TOP 50000 '''+@ServerName+''',[Stats_SP_ID]
,[SS_schemaname]
,[SS_databasename]
,[SS_name] [sysname]
,[SS_type] [nvarchar]
,[SS_execution_count]
,[SS_last_execution_time]
,[SS_total_worker_time]
,[SS_total_physical_reads]
,[SS_total_logical_writes]
,[SS_total_logical_reads]
,[SS_total_elapsed_time]
,[SS_updatedate]
,[SS_restartdate]
,NULL
FROM [HCITools].[dbo].[Stats_SP] sp WITH (NOLOCK)
WHERE SS_updatedate < CAST('''+CONVERT(nvarchar(30),@RestartDate,126)+''' as datetime)'
EXEC (@cmd)
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
END
GO

View File

@@ -0,0 +1,201 @@
USE [HCITools]
GO
/****** Object: StoredProcedure [perf].[Get_Performance_Status] Script Date: 02/01/2016 16:15:59 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[perf].[Get_Performance_Status]') AND type in (N'P', N'PC'))
DROP PROCEDURE [perf].[Get_Performance_Status]
GO
USE [HCITools]
GO
/****** Object: StoredProcedure [perf].[Get_Performance_Status] Script Date: 02/01/2016 16:15:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [perf].[Get_Performance_Status]
@in_debug tinyint = 0,
@in_Recipients varchar(8000) = '',
@in_SendInConsole tinyint = 1,
@in_CheckList varchar(14) = '11111111111111'
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette SP sert à appeler les SP d'analyse de performance pour la capture des traces et collecte les résultats pour leur traitement
Contexte d'utilisation
----------------------
Cette SP est appelée manuellement en cas de besoin
Parametres
----------
@in_debug : si 1, affichage de la liste des SP contenues dans la SP principale
@in_Recipients : Si vide, pas d'envoi de mail sinon contient le code ou les mails destinataires du mail
@in_SendInConsole : si 1, affichage dans la console
@in_CheckList : Contient la liste des checks à effectuer. 0 pour désactivé, 1 pour premier niveau, 2 pour 2ème niveau etc..
La position défini la SP à appeler. Ex : 11111111111111 appelle toutes les SP en niveau 1
Creation : 10.11.15 / FLA
Modifications : 17.08.2023 / SPE : OCTPDBA-726: Replace mail profile name APSSQL_MAIL_PROFILE into AzureManagedInstance_dbmail_profile to be SQL managed instances compatible
=============================================================================*/
set nocount on;
/*------------------- Declaration des variables --------------------*/
declare @html nvarchar(max),
@TableHTML nvarchar(max),
@i tinyint,
@cmd varchar(500),
@Title varchar(50),
@Details tinyint,
@in_SendInMail tinyint
declare @SPList table (
ID tinyint,
SPName varchar(50),
SPTitle varchar(50),
Details tinyint NULL)
CREATE TABLE #HTMLResult (
ID tinyint,
Result nvarchar(max)
)
/*------------ Affectation des parametres aux variables ------------*/
SET @html = '<table border="0">'
/* Déclaration des SP disponibles pour l'analyse des performances */
insert into @SPList VALUES (1,'Check_RAM','RAM', NULL)
insert into @SPList VALUES (2,'Check_CPU','CPU', NULL)
insert into @SPList VALUES (3,'Check_Disk','DISK', NULL)
insert into @SPList VALUES (4,'Check_Locks','LOCKS', NULL)
insert into @SPList VALUES (5,'Check_Replication','REPLICATION', NULL)
insert into @SPList VALUES (6,'Check_Jobs','JOBS', NULL)
insert into @SPList VALUES (7,'Check_Process','PROCESS', NULL)
insert into @SPList VALUES (8,'Check_If_Error','ERRORS', NULL)
insert into @SPList VALUES (9,'Check_Statistics','STATISTICS', NULL)
insert into @SPList VALUES (10,'Check_Index','INDEX', NULL)
insert into @SPList VALUES (11,'Check_Trace','TRACE', NULL)
insert into @SPList VALUES (12,'Check_Query','QUERY', NULL)
insert into @SPList VALUES (13,'Check_TempDB','TEMPDB', NULL)
insert into @SPList VALUES (14,'Check_Waits','WAITS', NULL)
SET @i = 1
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
/* Si @in_Recipients alors on n'envoie pas de mail */
IF @in_Recipients = ''
SET @in_SendInMail = 0
ELSE
SET @in_SendInMail = 1
/* Si mode debug, alors on affiche la liste des SP appelées */
IF @in_debug = 1
SELECT CAST(ID as varchar(2)) + ' - ' + SPName FROM @SPList ORDER BY ID
ELSE
BEGIN
/* On parcour l'ensemble des SP à traiter */
WHILE @i <> LEN(@in_CheckList)+1
BEGIN
/* Mise à jour du niveau de détails voulu par SP */
UPDATE @SPList SET Details = CAST(SUBSTRING(@in_CheckList,@i,1) as int) WHERE ID = @i
/* Récupération du titre à afficher dans la SP et du niveau de détails voulu */
SELECT @Title = SPTitle, @Details = Details FROM @SPList WHERE ID = @i
if @Details > 0
BEGIN
/* Si mode console, on affiche le titre */
IF @in_SendInConsole = 1
SELECT @Title
/* Si détail > 0 execution de chaque SP */
SELECT @cmd='EXEC [perf].'+ SPName + ' @in_SendInMail ='+CAST(@in_SendInMail as CHAR) +', @in_SendInConsole = '+CAST(@in_SendInConsole as CHAR)+', @in_Details = '+CAST(Details as CHAR)+', @in_ID = '+CAST(ID as varchar(3))+';' FROM @SPList WHERE ID = @i
EXEC(@cmd)
/* Préparation du titre en mode HTML en cas d'envoi par mail */
SET @html = @html + '<tr><td><br><h4>'+@Title+'</h4></td></tr>'
SELECT @html = @html + Result from #HTMLResult WHERE ID = @i
END
SET @i = @i+1
END
/* Envoi de mail */
if @in_SendInMail = 1
BEGIN
/* Get default mailbox profile name */
DECLARE @defaultprofilname varchar(100)
SELECT DISTINCT @defaultprofilname = p.name FROM msdb.dbo.sysmail_profile p JOIN msdb.dbo.sysmail_principalprofile pp ON pp.profile_id = p.profile_id AND pp.is_default = 1
EXEC msdb.dbo.sp_send_dbmail @recipients=@in_Recipients,
@subject = 'Compte rendu de performance',
@body = @html,
@body_format = 'HTML',
@profile_name = @defaultprofilname
END
DROP TABLE #HTMLResult
END
END TRY
BEGIN CATCH
DROP TABLE #HTMLResult
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info
END CATCH
;
/*------------------ Retour au programme appelant -----------------*/
return(@@error);
GO

View File

@@ -0,0 +1,338 @@
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

View File

@@ -0,0 +1,145 @@
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dba].[sp_Monitor_PharmIndex_row_changes]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dba].[sp_Monitor_PharmIndex_row_changes]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dba].[sp_Monitor_PharmIndex_row_changes]
AS
/*=============================================================================
Monitoring PharmIndex records changes
Parameters
----------
Creation : 11.05.2021 / RTC
Modification : 16.12.2021 / RTC TFS 67094 Skip on ama, update subsidiary id
17.03.2022 / FLA : Change DBA mail
=============================================================================*/
/* Check download from Pharmindex is finished */
DECLARE @today datetime,
@pharmIndexOk bit,
@message varchar(max),
@count int,
@subsidiary int,
@customer varchar(5)
SET @pharmIndexOk = 0
set @count = 210 /* 210 minutes max run time */
SET @today = convert(datetime, convert(varchar(20), getdate(),102))
select top 1 @customer = customer from master.cfg.[Identity]
/* Avoid running job on AMA */
if @customer in ('AMA', 'RUEGG')
return
if @customer = 'AAI'
set @subsidiary = 1000
if @customer = 'SUN'
SET @subsidiary = 100
if exists (select top 1 * from [PharmIndexTP].dbo.BatchImportHistory bih where bih.Success = 1 and bih.EndImportDate > @today) /* Download OK */
set @pharmIndexOk = 1;
/* WAIT UNTIL PHARMINDEX HAS FINISHED */
while (@pharmIndexOk = 0 and @count <> 0)
begin
/* WAIT 5 SECONDS */
WAITFOR DELAY '00:01:00'
select @count = @Count -1;
/* BREAK LOOP IF PHarmIndex Download OK */
if exists (select top 1 * from [PharmIndexTP].dbo.BatchImportHistory bih where bih.Success = 1 and bih.EndImportDate > @today)
set @pharmIndexOk = 1;
end
/* Exit job if Pharmindex not ready at 19h30 */
if (@count = 0)
begin
select @message = 'PharmIndex still not ready : Exit job monitor amr PharmIndex'
exec aps_Send_Mail_with_template
@in_param_varchar_2 = 'DBA_operator;HCI_Consultants_pharmINDEX',
@in_param_varchar_3 = @message,
@in_job_type = 3 /* 0:sans template; 1/NULL:echec; 2:succes; 3:warning; 4:message*/
return
end
/*-------------
Lancer le traitement PharmIndex avec Job_type = 10
Job_type = 10 indique Check Only : GBA
---------------*/
declare @out_param_int_1 int
execute PharmIndexTP.[dbo].[pdx_loading]
@in_job_type = 10
,@skip_mapping = 0
,@in_subsidiary = @subsidiary
,@in_table_name = null
,@in_debug = 0
,@out_param_int_1 = @out_param_int_1 output
/* Récupération du résultat 0?Check Only' qui vient de tourner
afin de controler que le traitement pourra tout traiter dans la soirée
Le contrôle est sur les Insert ainsi que les Updates
---------------------------*/
/* Insert dans une table #TT */
select [PLR_execution_date]
,[PLR_table_name]
,[PLR_load_sequence]
,[PLR_limit_insert]
,[PLR_check_to_insert]
,[PLR_limit_update]
,[PLR_check_to_update]
,[PLR_limit_delete]
,[PLR_check_to_delete]
,[PLR_check_only],
ROW_NUMBER() OVER( partition by plr_table_name order BY plr_execution_date desc) as RowNumber
into #TT_result
from [PharmIndexTP].[dbo].[pdx_loading_result]
where [PLR_check_only] = 1
and ([PLR_check_to_insert] > [PLR_limit_insert]
or [PLR_check_to_update] > [PLR_limit_update]
)
order by [PLR_load_sequence], plr_execution_date
/* Ne tient compte que du dernier traitement */
select * from #TT_result where Rownumber = 1 order by [PLR_load_sequence]
select @message = 'Table Name Sequence Limit_insert Check Insert Limit_update Check_update Limit_delete Check_delete' + char(13)
select @message = @message + PLR_table_name + ' ' + convert(char(9), isnull(PLR_Load_sequence,''))
+ convert(char(9), isnull(PLR_limit_insert,'')) + convert(char(9), isnull(PLR_check_to_insert, ''))
+ convert(char(9), isnull(PLR_limit_update, '') ) + convert(char(9), isnull(PLR_check_to_update,'') )
+ convert(char(9), isnull(PLR_check_to_delete,'') ) + char(13)
from #TT_result where Rownumber = 1 order by [PLR_load_sequence]
exec aps_Send_Mail_with_template
@in_param_varchar_2 = 'DBA_operator;HCI_Consultants_pharmINDEX',
@in_param_varchar_3 = @message,
@in_job_type = 4 /* 0:sans template; 1/NULL:echec; 2:succes; 3:warning; 4:message*/
drop table #TT_result

View File

@@ -0,0 +1,144 @@
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_audit_login' AND OBJECTPROPERTY(object_id,N'IsProcedure') = 1 AND s.name = 'dba')
DROP PROCEDURE [dba].[sp_audit_login]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dba].[sp_audit_login]
@in_ApplicationName NVARCHAR(255),
@in_client_process_id INT,
@in_host_name NVARCHAR(255),
@in_login_name NVARCHAR(255),
@in_NT_domain_name NVARCHAR(255),
@in_NT_user_name NVARCHAR(255),
@in_session_login_name NVARCHAR(255),
@in_spid INT,
@in_event_time NVARCHAR(255),
@in_audit_login_text TINYINT,
@in_text_data NVARCHAR(MAX)
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette SP permets de faire le lien entre l'alerte WMI [Audit login] et la table de logs [HCITools].[dba].[Audit_login].
Tous les événements de connexions comportant des problèmes sont enregistrés.
Parametres
----------
Creation : 27.02.2019 / SPE
Modifications :
=============================================================================*/
SET NOCOUNT ON;
/*------------------- Declaration des variables --------------------*/
DECLARE @errno int,
@errmsg varchar(255)
/*-------------------------- Vérifications des variables d'entrée ---------------------------*/
IF @in_ApplicationName is null
BEGIN
SELECT @errno = 70003,
@errmsg = 'You must provide the parameter @in_ApplicationName!'
goto error_99
END
IF @in_client_process_id is null
BEGIN
SELECT @errno = 70003,
@errmsg = 'You must provide the parameter @in_client_process_id!'
goto error_99
END
IF @in_host_name is null
BEGIN
SELECT @errno = 70003,
@errmsg = 'You must provide the parameter @in_host_name!'
goto error_99
END
IF @in_spid is null
BEGIN
SELECT @errno = 70003,
@errmsg = 'You must provide the parameter @in_spid!'
goto error_99
END
IF @in_event_time is null
BEGIN
SELECT @errno = 70003,
@errmsg = 'You must provide the parameter @in_event_time!'
goto error_99
END
/*------------ Affectation des parametres aux variables ------------*/
SET @in_event_time = substring(@in_event_time,0,5) + '-' + substring(@in_event_time,5,2) + '-' + substring(@in_event_time,7,2) + ' ' + substring(@in_event_time,9,2) + ':' + substring(@in_event_time,11,2) + ':' + substring(@in_event_time,13,2)
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
/* Check if ID is missing on text table */
IF NOT EXISTS(SELECT 1 FROM dba.Audit_login_text WHERE Audit_login_text_ID = @in_audit_login_text)
BEGIN
INSERT INTO dba.Audit_login_text(Audit_login_text_ID,ALT_text,ALT_short_text,ALT_level)
VALUES (@in_audit_login_text,'Unknown','Unknown',2)
END
INSERT INTO [dba].[audit_login] (
[AL_application_name],
[AL_client_process_id],
[AL_host_name],
[AL_login_name],
[AL_NT_domain_name],
[AL_NT_user_name],
[AL_session_login_name],
[AL_spid],
[AL_event_time],
[AL_audit_login_text_id],
[AL_text_data])
VALUES (@in_ApplicationName,
@in_client_process_id,
@in_host_name,
@in_login_name,
@in_NT_domain_name,
@in_NT_user_name,
@in_session_login_name,
@in_spid,
@in_event_time,
@in_audit_login_text,
@in_text_data)
END TRY
BEGIN CATCH
SELECT @errno = 70003,
@errmsg = 'Audit login INSERT error!'
goto error_99
END CATCH;
/*------------------ Retour au programme appelant -----------------*/
RETURN(@@error);
/*---------------------- Traitement des erreurs ----------------------*/
error_99:
RAISERROR (@errmsg, 16, 1);
RETURN(@errno);
GO

View File

@@ -0,0 +1,371 @@
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_audit_login_control' AND OBJECTPROPERTY(object_id,N'IsProcedure') = 1 AND s.name = 'dba')
DROP PROCEDURE [dba].[sp_audit_login_control]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dba].[sp_audit_login_control]
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette SP est exécutée toute les 5 minutes et check l'état de l'audit des connexions utilisateurs.
Selon le type de problème et le nombre, un mail est envoyé. Si cela est un cas urgent, une alerte SMS est envoyée.
1 : COUNT TOTAL ALERTS LAST 5 / 60 MIN
2 : RETRIEVE FORMAT AND OU CODE
3 : SEND MAIL & SMS ALERTS
Parametres
----------
Creation : 27.02.2019 / SPE
Modifications :
03.02.2020 / LPE : modify sqlMonDBACalendar password
27.10.2020 / RTC : Migrate DBACC to HCIMON
09.02.2021 / SPE : #TFS62610# - Update all mail configurations to avoid SPAM
16.08.2021 / SPE : Replace hardcoded password in sp and scripts
17.03.2022 / FLA : Change DBA mail
17.08.2023 / SPE : OCTPDBA-726: Replace mail profile name APSSQL_MAIL_PROFILE into AzureManagedInstance_dbmail_profile to be SQL managed instances compatible
=============================================================================*/
SET NOCOUNT ON;
/*------------------- Declaration des variables --------------------*/
DECLARE @errno int,
@cvCurrentOrganizationalUnit int,
@subsidiary_id int,
@totalCount int,
@totalCountPiket int,
@total int,
@querywidth int,
@html nvarchar(max),
@queryDetails nvarchar(max),
@errmsg varchar(255),
@category varchar(255),
@event varchar(255),
@email varchar(255),
@piket varchar(255),
@attachFileName varchar(255),
@subject varchar(255),
@Audit_login_ID varchar(60),
@out_default_value varchar(60),
@format varchar(60),
@mailImportance varchar(6),
@ou varchar(3),
@queryseparator varchar(3),
@attachFile bit,
@queryheader bit,
@querynopadding bit
/*------------ Affectation des parametres aux variables ------------*/
SET @cvCurrentOrganizationalUnit = null
SET @subsidiary_id = null
SET @attachFileName = null
SET @queryheader = 1
SET @querywidth = 600
SET @queryseparator = ','
SET @querynopadding = 1
SET @attachFile = 1
SET @mailImportance = 'Normal'
SET @html = ''
SET @ou = ''
SET @Audit_login_ID = '[sep=,' + CHAR(13) + CHAR(10) + 'ID]'
SET @queryDetails = 'SET NOCOUNT ON; SELECT Audit_login_ID AS '+@Audit_login_ID+', AL_application_name as [Application], AL_client_process_id as [Client PID], AL_host_name as [Hostname], AL_login_name as [SQL login], AL_NT_domain_name as [NT Domain], AL_NT_user_name as [NT Login], AL_session_login_name as [Session Login], AL_spid as [SPID], AL_event_time as [Event time], AL_text_data as [Message], ALT_text as [Category], ALT_level as [Critical]
FROM hcitools.dba.Audit_login AL
JOIN hcitools.dba.Audit_login_text ALT ON ALT.Audit_login_text_ID = AL.AL_audit_login_text_id
WHERE AL.AL_event_time > dateadd(minute, -5, GetDate())'
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
/* ------------------------------------------------------------------------------------------------------------------------------------- */
/* \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 1 : COUNT TOTAL ALERTS LAST 5 / 10 MIN //////////////////////////////////////////// */
/* ------------------------------------------------------------------------------------------------------------------------------------- */
/* COUNT TOTAL ERRORS < 5 MIN */
SELECT @totalCount = count(*)
FROM hcitools.dba.audit_login AL
JOIN hcitools.dba.audit_login_text ALT ON ALT.audit_login_text_ID = AL.AL_audit_login_text_id
WHERE AL.AL_event_time > dateadd(minute, -5, GetDate())
/* COUNT TOTAL ERRORS < 60 MIN ONLY CRITICAL ONE */
SELECT @totalCountPiket = count(*)
FROM hcitools.dba.audit_login AL
JOIN hcitools.dba.audit_login_text ALT ON ALT.audit_login_text_ID = AL.AL_audit_login_text_id
WHERE AL.AL_event_time > dateadd(hour, -1, GetDate()) AND ALT.ALT_level = 1
/* More than 5 in normal mode or 30 for piket alert */
IF ((@totalCount >= 5) or (@totalCountPiket >= 30))
BEGIN
/* ------------------------------------------------------------------------------------------------------------------------------------- */
/* \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 2 : RETRIEVE FORMAT AND OU CODE /////////////////////////////////////////////////// */
/* ------------------------------------------------------------------------------------------------------------------------------------- */
IF EXISTS(SELECT 1 FROM [master].[cfg].[InstanceContext] WHERE Business = 'TPPHAR')
BEGIN
/* Get the cvCurrentOrganizationalUnit */
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 = 'cvCurrentOrganizationalUnit',
@out_default_value = @out_default_value OUTPUT,
@out_param_int_1 = null;
SELECT @cvCurrentOrganizationalUnit = convert(int,@out_default_value);
/* Check if we have a value, if not leave this SP */
IF @cvCurrentOrganizationalUnit is null
BEGIN
SELECT @errno = 70001,
@errmsg = '(APS) Error cvCurrentOrganizationalUnit does not exist!';
goto error_99;
END
/* Get the subsidiary id and OU code */
SELECT @subsidiary_id = ou.OU_subsidiary, @ou = ou.OU_Code
FROM arizona.dbo.Organizational_unit ou with (nolock)
WHERE ou.Organizational_unit_ID = @cvCurrentOrganizationalUnit;
/* Check if we have a value, if not leave this SP */
IF @subsidiary_id is null
BEGIN
SELECT @errno = 70001,
@errmsg = '(APS) Error subsidiary_id does not exist!';
goto error_99;
END
/* Get the current format */
SELECT @format = sub.SUB_code
FROM arizona.dbo.Subsidiary sub with (nolock)
WHERE sub.Subsidiary_ID = @subsidiary_id;
/* Check if we have a value, if not leave this SP */
IF @format is null
BEGIN
SELECT @errno = 70001,
@errmsg = '(APS) Error format does not exist!';
goto error_99;
END
/* Change the value into a compatible format */
IF @format = 'COOP'
BEGIN
SET @format = 'CVI'
END
IF @format = 'CENT'
BEGIN
SET @format = 'SUN'
END
IF @format = '000'
BEGIN
SET @format = 'AAI'
END
END
ELSE
BEGIN
SELECT @format = DnsAlias FROM [master].[cfg].[Identity]
END
/* ------------------------------------------------------------------------------------------------------------------------------------- */
/* \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 3 : SEND MAIL & SMS ALERTS //////////////////////////////////////////////////////// */
/* ------------------------------------------------------------------------------------------------------------------------------------- */
/* Get default mailbox profile name */
DECLARE @defaultprofilname varchar(100)
SELECT DISTINCT @defaultprofilname = p.name FROM msdb.dbo.sysmail_profile p JOIN msdb.dbo.sysmail_principalprofile pp ON pp.profile_id = p.profile_id AND pp.is_default = 1
/* SET Mail & Picket list */
SELECT @email = DML_Recipients
FROM HCITools.dbo.DBA_Mailing_list
WHERE DML_Code = 'DBA_operator'
IF @totalCount >= 5
BEGIN
/* Set export file name */
SET @attachFileName = @format+@ou+'_AuditLogin.csv'
SET @html = '<body>Pharmacy: '+@format+@ou+'<br />List of all login events for the last 5 minutes: '+convert(varchar,@totalCount)+'<br /><br /><table>'
DECLARE c_events CURSOR LOCAL FORWARD_ONLY STATIC FOR
SELECT count(*) as 'Total', ALT.ALT_text as 'Event type'
FROM hcitools.dba.audit_login AL
JOIN hcitools.dba.audit_login_text ALT ON ALT.audit_login_text_ID = AL.AL_audit_login_text_id
WHERE AL.AL_event_time > dateadd(minute, -5, GetDate())
GROUP BY ALT.ALT_text
ORDER BY count(*) DESC
;
OPEN c_events
;
FETCH NEXT FROM c_events
INTO @total,@event
;
WHILE @@fetch_status = 0
BEGIN
SET @html = @html + '
<tr><td>'+convert(varchar,@total)+' '+@event+'</td></tr>'
FETCH NEXT FROM c_events
INTO @total,@event
;
END
;
CLOSE c_events
;
DEALLOCATE c_events
SET @html = @html + '</table></body>'
SET @subject = @format+@ou+': Audit Login Alert - [' + @@SERVERNAME + ']'
/* SEND MAIL */
EXEC msdb.dbo.sp_send_dbmail
@profile_name = @defaultprofilname,
@recipients = @email,
@body = @html,
@importance = @mailImportance,
@subject = @subject,
@body_format = 'HTML',
@query = @queryDetails,
@query_attachment_filename = @attachFileName,
@attach_query_result_as_file = @attachFile,
@query_result_header = @queryheader,
@query_result_width = @querywidth,
@query_result_separator = @queryseparator,
@query_result_no_padding = @querynopadding;
END
/* More than 30 events -> Send SMS */
IF @totalCountPiket >= 30
BEGIN
/* Check if already send this alert */
IF NOT EXISTS(SELECT 1 FROM hcitools.dba.audit_login_history WHERE ALH_create_date > dateadd(hour, -1, GetDate()))
BEGIN
SET @piket = @email
SELECT @piket = @piket /* +';' +ORS.DML_Recipients
FROM OPENROWSET('SQLNCLI', 'DRIVER={SQL Server};SERVER=SWTPMON01.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
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 */
SET @email = @piket
SET @queryDetails = null
SET @attachFile = 0
SET @attachFileName = null
SET @queryheader = 0
SET @querywidth = null
SET @queryseparator = 0
SET @querynopadding = null
SET @mailImportance = 'High'
SET @html = '<body>Pharmacy: '+@format+@ou+' - Total events (last hour): '+convert(varchar,@totalCountPiket)+'<br /><table>'
DECLARE c_events CURSOR LOCAL FORWARD_ONLY STATIC FOR
SELECT count(*) as 'Total', ALT.ALT_short_text as 'Event type'
FROM hcitools.dba.audit_login AL
JOIN hcitools.dba.audit_login_text ALT ON ALT.audit_login_text_ID = AL.AL_audit_login_text_id
WHERE AL.AL_event_time > dateadd(minute, -60, GetDate())
GROUP BY ALT.ALT_short_text
ORDER BY count(*) DESC
;
OPEN c_events
;
FETCH NEXT FROM c_events
INTO @total,@event
;
WHILE @@fetch_status = 0
BEGIN
SET @html = @html + '
<tr><td>'+convert(varchar,@total)+' '+@event+'</td></tr>'
FETCH NEXT FROM c_events
INTO @total,@event
;
END
;
CLOSE c_events
;
DEALLOCATE c_events
SET @html = @html + '</table></body>'
SET @subject = '[' + @@SERVERNAME + '] - ' + @format+@ou+': CRITICAL Audit Login Alert'
/* SEND MAIL PIKET */
EXEC msdb.dbo.sp_send_dbmail
@profile_name = @defaultprofilname,
@recipients = @email,
@body = @html,
@importance = @mailImportance,
@subject = @subject,
@body_format = 'HTML',
@query = @queryDetails,
@query_attachment_filename = @attachFileName,
@attach_query_result_as_file = @attachFile,
@query_result_header = @queryheader,
@query_result_width = @querywidth,
@query_result_separator = @queryseparator,
@query_result_no_padding = @querynopadding;
/* INSERT History into Security_audit_history table */
INSERT INTO hcitools.dba.audit_login_history(ALH_create_date,ALH_total_count)
SELECT SYSDATETIME(),@totalCountPiket
END
END
END
END TRY
BEGIN CATCH
SELECT @errno = 70003,
@errmsg = 'error on sp_audit_login_control!'
goto error_99
END CATCH;
/*------------------ Retour au programme appelant -----------------*/
RETURN(@@error);
/*---------------------- Traitement des erreurs ----------------------*/
error_99:
RAISERROR (@errmsg, 16, 1);
RETURN(@errno);
GO

View File

@@ -0,0 +1,275 @@
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_ddl_alerts' AND OBJECTPROPERTY(object_id,N'IsProcedure') = 1 AND s.name = 'dba')
DROP PROCEDURE [dba].[sp_ddl_alerts]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dba].[sp_ddl_alerts]
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette SP est exécutée toute les jours et check les modifications sur les paramètres des bases.
Les résultats sont envoyés par mail
Parametres
----------
Creation : 22.08.2019 / SPE
Modifications : 06.09.19 / SPE : SQL 2014 compatibility modifications
27.09.19 / SPE : Temporary remove trustworth check
09.02.21 / SPE : #TFS62610# - Update all mail configurations to avoid SPAM
17.03.22 - FLA : Change DBA mail
17.08.23 / SPE : OCTPDBA-726: Replace mail profile name APSSQL_MAIL_PROFILE into AzureManagedInstance_dbmail_profile to be SQL managed instances compatible
=============================================================================*/
SET NOCOUNT ON;
/*------------------- Declaration des variables --------------------*/
DECLARE @errno int,
@cvCurrentOrganizationalUnit int,
@subsidiary_id int,
@totAlerts int,
@totDDL int,
@html nvarchar(max),
@errmsg varchar(255),
@email varchar(255),
@subject varchar(255),
@out_default_value varchar(60),
@format varchar(60),
@mailImportance varchar(6),
@ou varchar(3)
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
/* ------------------------------------------------------------------------------------------------------------------------------------- */
/* \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 1 : RETRIEVE FORMAT AND OU CODE /////////////////////////////////////////////////// */
/* ------------------------------------------------------------------------------------------------------------------------------------- */
IF EXISTS(SELECT 1 FROM [master].[cfg].[InstanceContext] WHERE Business = 'TPPHAR')
BEGIN
/* Get the cvCurrentOrganizationalUnit */
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 = 'cvCurrentOrganizationalUnit',
@out_default_value = @out_default_value OUTPUT,
@out_param_int_1 = null;
SELECT @cvCurrentOrganizationalUnit = convert(int,@out_default_value);
/* Check if we have a value, if not leave this SP */
IF @cvCurrentOrganizationalUnit is null
BEGIN
SELECT @errno = 70001,
@errmsg = '(APS) Error cvCurrentOrganizationalUnit does not exist!';
goto error_99;
END
/* Get the subsidiary id and OU code */
SELECT @subsidiary_id = ou.OU_subsidiary, @ou = ou.OU_Code
FROM arizona.dbo.Organizational_unit ou with (nolock)
WHERE ou.Organizational_unit_ID = @cvCurrentOrganizationalUnit;
/* Check if we have a value, if not leave this SP */
IF @subsidiary_id is null
BEGIN
SELECT @errno = 70001,
@errmsg = '(APS) Error subsidiary_id does not exist!';
goto error_99;
END
/* Get the current format */
SELECT @format = sub.SUB_code
FROM arizona.dbo.Subsidiary sub with (nolock)
WHERE sub.Subsidiary_ID = @subsidiary_id;
/* Check if we have a value, if not leave this SP */
IF @format is null
BEGIN
SELECT @errno = 70001,
@errmsg = '(APS) Error format does not exist!';
goto error_99;
END
/* Change the value into a compatible format */
IF @format = 'COOP'
BEGIN
SET @format = 'CVI'
END
IF @format = 'CENT'
BEGIN
SET @format = 'SUN'
END
IF @format = '000'
BEGIN
SET @format = 'AAI'
END
END
ELSE
BEGIN
SELECT @format = DnsAlias FROM [master].[cfg].[Identity]
SET @ou = ''
END
/* ------------------------------------------------------------------------------------------------------------------------------------- */
/* \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 2 : RETRIEVE DDL EVENTS /////////////////////////////////////////////////// */
/* ------------------------------------------------------------------------------------------------------------------------------------- */
/* Temp table #AlterRules with alerts template */
CREATE TABLE #AlterRules(AlertRule varchar(100))
/* Template with all DO NOT settings */
INSERT INTO #AlterRules(AlertRule)
VALUES ('AUTO_CLOSE ON'),('AUTO_CREATE_STATISTICS OFF'),('AUTO_SHRINK ON'),('ALLOW_SNAPSHOT_ISOLATION ON'),('ANSI_NULL_DEFAULT OFF'),('ANSI_NULL OFF'),('ANSI_PADDING ON'),
('ANSI_WARNINGS ON'),('ARITHABORT OFF'),('CONCAT_NULL_YIELDS_NULL OFF'),('DB_CHAINING ON'),('DATE_CORRELATION_OPTIMIZATION ON'),('READ_COMMITTED_SNAPSHOT ON'),('NUMERIC_ROUNDABORT OFF'),
('PARAMETERIZATION FORCED'),('QUOTED_IDENTIFIER OFF'),('RECURSIVE_TRIGGERS ON'),('TRUSTWORTHY ON'),('PAGE_VERIFY NONE'),('PAGE_VERIFY TORN_PAGE_DETECTION'),('ENCRYPTION ON')
/* Insert into #DDLAlertLog temp table all DDL events of type alter database for the last 24 hours */
SELECT DA_App_Name,
DA_Host_Name,
DA_Event_Xml.value('(./EVENT_INSTANCE/PostTime)[1]','NVARCHAR(MAX)') AS PostTime,
DA_Event_Xml.value('(./EVENT_INSTANCE/SPID)[1]','NVARCHAR(MAX)') AS SPID,
DA_Event_Xml.value('(./EVENT_INSTANCE/ServerName)[1]','NVARCHAR(MAX)') AS ServerName,
DA_Event_Xml.value('(./EVENT_INSTANCE/LoginName)[1]','NVARCHAR(MAX)') AS LoginName,
DA_Event_Xml.value('(./EVENT_INSTANCE/UserName)[1]','NVARCHAR(MAX)') AS UserName,
DA_Event_Xml.value('(./EVENT_INSTANCE/DatabaseName)[1]','NVARCHAR(MAX)') AS DatabaseName,
DA_Event_Xml.value('(./EVENT_INSTANCE/SchemaName)[1]','NVARCHAR(MAX)') AS SchemaName,
DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectName)[1]','NVARCHAR(MAX)') AS ObjectName,
DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectType)[1]','NVARCHAR(MAX)') AS ObjectType,
DA_Event_Xml.value('(./EVENT_INSTANCE/TSQLCommand/CommandText)[1]','NVARCHAR(MAX)') AS CommandText,
REPLACE(REPLACE(REPLACE(SUBSTRING(LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(DA_Event_Xml.value('(./EVENT_INSTANCE/TSQLCommand/CommandText)[1]','NVARCHAR(MAX)'), CHAR(10), CHAR(32)),CHAR(13), CHAR(32)),CHAR(160), CHAR(32)),CHAR(9),CHAR(32)))), CHARINDEX('SET', REPLACE(DA_Event_Xml.value('(./EVENT_INSTANCE/TSQLCommand/CommandText)[1]','NVARCHAR(MAX)'),' ','')) + 6, LEN(REPLACE(DA_Event_Xml.value('(./EVENT_INSTANCE/TSQLCommand/CommandText)[1]','NVARCHAR(MAX)'),' ',''))),'WITHNO_WAIT',''),'WITHROLLBACKIMMEDIATE',''),' ','') AS CommandAction
INTO #DDLAlertLog
FROM [master].[dba].[DDL_audit]
WHERE DA_Event_Xml.value('(./EVENT_INSTANCE/EventType)[1]','NVARCHAR(MAX)') = 'ALTER_DATABASE'
AND DA_Event_Xml.value('(./EVENT_INSTANCE/PostTime)[1]','NVARCHAR(MAX)') > GETDATE()-1
AND DA_App_Name <> '.Net SqlClient Data Provider'
AND DA_Event_Xml.value('(./EVENT_INSTANCE/TSQLCommand/CommandText)[1]','NVARCHAR(MAX)') not like '%TRUSTWORTHY%'
UNION ALL
SELECT DA_App_Name,
DA_Host_Name,
DA_Event_Xml.value('(./EVENT_INSTANCE/PostTime)[1]','NVARCHAR(MAX)') AS PostTime,
DA_Event_Xml.value('(./EVENT_INSTANCE/SPID)[1]','NVARCHAR(MAX)') AS SPID,
DA_Event_Xml.value('(./EVENT_INSTANCE/ServerName)[1]','NVARCHAR(MAX)') AS ServerName,
DA_Event_Xml.value('(./EVENT_INSTANCE/LoginName)[1]','NVARCHAR(MAX)') AS LoginName,
DA_Event_Xml.value('(./EVENT_INSTANCE/UserName)[1]','NVARCHAR(MAX)') AS UserName,
DA_Event_Xml.value('(./EVENT_INSTANCE/DatabaseName)[1]','NVARCHAR(MAX)') AS DatabaseName,
DA_Event_Xml.value('(./EVENT_INSTANCE/SchemaName)[1]','NVARCHAR(MAX)') AS SchemaName,
DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectName)[1]','NVARCHAR(MAX)') AS ObjectName,
DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectType)[1]','NVARCHAR(MAX)') AS ObjectType,
DA_Event_Xml.value('(./EVENT_INSTANCE/TSQLCommand/CommandText)[1]','NVARCHAR(MAX)') AS CommandText,
'' AS CommandAction
FROM [master].[dba].[DDL_audit]
WHERE DA_Event_Xml.value('(./EVENT_INSTANCE/EventType)[1]','NVARCHAR(MAX)') = 'ALTER_AUTHORIZATION_DATABASE'
AND replace(DA_Event_Xml.value('(./EVENT_INSTANCE/TSQLCommand/CommandText)[1]','NVARCHAR(MAX)'),'[','!') not like '%!sa%'
AND DA_Event_Xml.value('(./EVENT_INSTANCE/PostTime)[1]','NVARCHAR(MAX)') > GETDATE()-1
AND DA_App_Name <> '.Net SqlClient Data Provider'
ORDER BY DA_App_Name DESC
/* ------------------------------------------------------------------------------------------------------------------------------------- */
/* \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 3 : CREATE AND SEND MAIL /////////////////////////////////////////////////// */
/* ------------------------------------------------------------------------------------------------------------------------------------- */
/* Count total critical alerts and set mail level */
SELECT @totDDL = COUNT(*) FROM #DDLAlertLog AL
SELECT @totAlerts = COUNT(*) FROM #DDLAlertLog AL LEFT JOIN #AlterRules AR ON AL.CommandAction = replace(AR.AlertRule,' ','') WHERE AR.AlertRule is not null OR AL.CommandText like 'alter authorization%'
IF @totAlerts > 0
BEGIN
SET @mailImportance = 'High'
END
ELSE
BEGIN
SET @mailImportance = 'Normal'
END
IF @totDDL > 0
BEGIN
SELECT @email = DML_Recipients
FROM HCITools.dbo.DBA_Mailing_list
WHERE DML_Code = 'DBA_operator'
SET @subject = @format+@ou+': ' + convert(varchar,@totDDL) + ' DDL audit found: Database settings modified! - [' + @@SERVERNAME + ']'
SET @HTML =
N'<body>Server: ' + @format+@ou+'<br />List of all DDL audit events (ALTER DATABASE) for the last day: <br /><br /><table border="1">' +
N'<tr><th>AlertLevel</th><th>Application Name</th><th>Host Name</th><th>Modified date</th><th>SPID</th><th>Server Name</th><th>Login Name</th><th>User Name</th><th>Database Name</th><th>Schema</th><th>Object</th><th>Type</th><th>Command</th></tr>' +
CAST(( SELECT CASE WHEN AR.AlertRule is null AND UPPER(AL.CommandText) not like 'ALTER AUTHORIZATION%' THEN 'INFO' ELSE 'CRITICAL' END AS 'td','',AL.DA_App_Name AS 'td','',
DA_Host_Name AS 'td','',
PostTime AS 'td','',
SPID AS 'td','',
ServerName AS 'td','',
isnull(LoginName,'') AS 'td','',
isnull(UserName,'') AS 'td','',
isnull(DatabaseName,'') AS 'td','',
isnull(SchemaName,'') AS 'td','',
isnull(ObjectName,'') AS 'td','',
isnull(ObjectType,'') AS 'td','',
CommandText AS 'td'
FROM #DDLAlertLog AL
LEFT JOIN #AlterRules AR
ON AL.CommandAction = replace(AR.AlertRule,' ','')
FOR XML PATH('tr'), ELEMENTS ) AS NVARCHAR(MAX)) +
N'</table></body>' ;
/* Get default mailbox profile name */
DECLARE @defaultprofilname varchar(100)
SELECT DISTINCT @defaultprofilname = p.name FROM msdb.dbo.sysmail_profile p JOIN msdb.dbo.sysmail_principalprofile pp ON pp.profile_id = p.profile_id AND pp.is_default = 1
/* SEND MAIL */
EXEC msdb.dbo.sp_send_dbmail
@profile_name = @defaultprofilname,
@recipients = @email,
@body = @html,
@importance = @mailImportance,
@subject = @subject,
@body_format = 'HTML';
END
/* Drop temp tables */
DROP TABLE #DDLAlertLog
DROP TABLE #AlterRules
END TRY
BEGIN CATCH
SELECT @errno = 70003,
@errmsg = 'error on sp_ddl_alerts! ' + error_message()
goto error_99
END CATCH;
/*------------------ Retour au programme appelant -----------------*/
RETURN(@@error);
/*---------------------- Traitement des erreurs ----------------------*/
error_99:
RAISERROR (@errmsg, 16, 1);
RETURN(@errno);
GO

View File

@@ -0,0 +1,224 @@
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_ddl_sysadmin' AND OBJECTPROPERTY(object_id,N'IsProcedure') = 1 AND s.name = 'dba')
DROP PROCEDURE [dba].[sp_ddl_sysadmin]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dba].[sp_ddl_sysadmin]
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Cette SP est exécutée toute les jours et check les modifications sur l'ajout ou la création du un login sysadmin.
Les résultats sont envoyés par mail
Parametres
----------
Creation : 17.09.2019 / SPE
Modifications : 21.10.2020 / SPE: Exclude dba login from resultset
09.02.2021 / SPE : #TFS62610# - Update all mail configurations to avoid SPAM
17.03.2022 / FLA : Change DBA mail
17.08.2023 / SPE : OCTPDBA-726: Replace mail profile name APSSQL_MAIL_PROFILE into AzureManagedInstance_dbmail_profile to be SQL managed instances compatible
=============================================================================*/
SET NOCOUNT ON;
/*------------------- Declaration des variables --------------------*/
DECLARE @errno int,
@cvCurrentOrganizationalUnit int,
@subsidiary_id int,
@totAlerts int,
@totDDL int,
@html nvarchar(max),
@errmsg varchar(255),
@email varchar(255),
@subject varchar(255),
@out_default_value varchar(60),
@format varchar(60),
@mailImportance varchar(6),
@ou varchar(3)
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
/* ------------------------------------------------------------------------------------------------------------------------------------- */
/* \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 1 : RETRIEVE FORMAT AND OU CODE /////////////////////////////////////////////////// */
/* ------------------------------------------------------------------------------------------------------------------------------------- */
IF EXISTS(SELECT 1 FROM [master].[cfg].[InstanceContext] WHERE Business = 'TPPHAR')
BEGIN
/* Get the cvCurrentOrganizationalUnit */
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 = 'cvCurrentOrganizationalUnit',
@out_default_value = @out_default_value OUTPUT,
@out_param_int_1 = null;
SELECT @cvCurrentOrganizationalUnit = convert(int,@out_default_value);
/* Check if we have a value, if not leave this SP */
IF @cvCurrentOrganizationalUnit is null
BEGIN
SELECT @errno = 70001,
@errmsg = '(APS) Error cvCurrentOrganizationalUnit does not exist!';
goto error_99;
END
/* Get the subsidiary id and OU code */
SELECT @subsidiary_id = ou.OU_subsidiary, @ou = ou.OU_Code
FROM arizona.dbo.Organizational_unit ou with (nolock)
WHERE ou.Organizational_unit_ID = @cvCurrentOrganizationalUnit;
/* Check if we have a value, if not leave this SP */
IF @subsidiary_id is null
BEGIN
SELECT @errno = 70001,
@errmsg = '(APS) Error subsidiary_id does not exist!';
goto error_99;
END
/* Get the current format */
SELECT @format = sub.SUB_code
FROM arizona.dbo.Subsidiary sub with (nolock)
WHERE sub.Subsidiary_ID = @subsidiary_id;
/* Check if we have a value, if not leave this SP */
IF @format is null
BEGIN
SELECT @errno = 70001,
@errmsg = '(APS) Error format does not exist!';
goto error_99;
END
/* Change the value into a compatible format */
IF @format = 'COOP'
BEGIN
SET @format = 'CVI'
END
IF @format = 'CENT'
BEGIN
SET @format = 'SUN'
END
IF @format = '000'
BEGIN
SET @format = 'AAI'
END
END
ELSE
BEGIN
SELECT @format = DnsAlias FROM [master].[cfg].[Identity]
SET @ou = ''
END
/* ------------------------------------------------------------------------------------------------------------------------------------- */
/* \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 2 : RETRIEVE DDL EVENTS /////////////////////////////////////////////////// */
/* ------------------------------------------------------------------------------------------------------------------------------------- */
/* Insert into #DDLSysadminLog temp table all DDL events of type LOGIN (SYSADMIN) for the last 24 hours */
SELECT DA_App_Name,
DA_Host_Name,
DA_Event_Xml.value('(./EVENT_INSTANCE/PostTime)[1]','NVARCHAR(MAX)') AS PostTime,
DA_Event_Xml.value('(./EVENT_INSTANCE/SPID)[1]','NVARCHAR(MAX)') AS SPID,
DA_Event_Xml.value('(./EVENT_INSTANCE/ServerName)[1]','NVARCHAR(MAX)') AS ServerName,
DA_Event_Xml.value('(./EVENT_INSTANCE/LoginName)[1]','NVARCHAR(MAX)') AS LoginName,
DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectName)[1]','NVARCHAR(MAX)') AS ObjectName
INTO #DDLSysadminLog
FROM [master].[dba].[DDL_audit]
WHERE DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectType)[1]','NVARCHAR(MAX)') = 'LOGIN'
AND DA_Event_Xml.value('(./EVENT_INSTANCE/TSQLCommand/CommandText)[1]','NVARCHAR(MAX)') like '%sysadmin%add%'
AND DA_Event_Xml.value('(./EVENT_INSTANCE/PostTime)[1]','NVARCHAR(MAX)') > GETDATE()-1
AND DA_Event_Xml.value('(./EVENT_INSTANCE/LoginName)[1]','NVARCHAR(MAX)') <> 'dba'
ORDER BY DA_Event_Xml.value('(./EVENT_INSTANCE/PostTime)[1]','NVARCHAR(MAX)') DESC
/* ------------------------------------------------------------------------------------------------------------------------------------- */
/* \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 3 : CREATE AND SEND MAIL /////////////////////////////////////////////////// */
/* ------------------------------------------------------------------------------------------------------------------------------------- */
/* Count total critical alerts and set mail level */
SELECT @totDDL = COUNT(*) FROM #DDLSysadminLog AL
SET @mailImportance = 'High'
IF @totDDL > 0
BEGIN
SELECT @email = DML_Recipients
FROM HCITools.dbo.DBA_Mailing_list
WHERE DML_Code = 'DBA_operator'
SET @subject = @format+@ou+': ' + convert(varchar,@totDDL) + ' sysadmin account granted!!! - [' + @@SERVERNAME + ']'
SET @HTML =
N'<body>Server: ' + @format+@ou+'<br />List of all sysadmin accounts granted for the last day: <br /><br /><table border="1">' +
N'<tr><th>AlertLevel</th><th>Application Name</th><th>Host Name</th><th>Modified date</th><th>SPID</th><th>Server Name</th><th>Login Name</th><th>Object set as SYSADMIN</th></tr>' +
CAST(( SELECT 'CRITICAL' AS 'td','',AL.DA_App_Name AS 'td','',
DA_Host_Name AS 'td','',
PostTime AS 'td','',
SPID AS 'td','',
ServerName AS 'td','',
isnull(LoginName,'') AS 'td','',
isnull(ObjectName,'') AS 'td',''
FROM #DDLSysadminLog AL
FOR XML PATH('tr'), ELEMENTS ) AS NVARCHAR(MAX)) +
N'</table></body>' ;
/* Get default mailbox profile name */
DECLARE @defaultprofilname varchar(100)
SELECT DISTINCT @defaultprofilname = p.name FROM msdb.dbo.sysmail_profile p JOIN msdb.dbo.sysmail_principalprofile pp ON pp.profile_id = p.profile_id AND pp.is_default = 1
/* SEND MAIL */
EXEC msdb.dbo.sp_send_dbmail
@profile_name = @defaultprofilname,
@recipients = @email,
@body = @html,
@importance = @mailImportance,
@subject = @subject,
@body_format = 'HTML';
END
/* Drop temp tables */
DROP TABLE #DDLSysadminLog
END TRY
BEGIN CATCH
SELECT @errno = 70003,
@errmsg = 'error on sp_ddl_sysadmin! ' + error_message()
goto error_99
END CATCH;
/*------------------ Retour au programme appelant -----------------*/
RETURN(@@error);
/*---------------------- Traitement des erreurs ----------------------*/
error_99:
RAISERROR (@errmsg, 16, 1);
RETURN(@errno);
GO