sync
This commit is contained in:
@@ -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
|
||||
@@ -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;
|
||||
Binary file not shown.
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
254
TPDT-268 - ACP in task sequence/dba_storedProcedures/Medor.sql
Normal file
254
TPDT-268 - ACP in task sequence/dba_storedProcedures/Medor.sql
Normal 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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
Binary file not shown.
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
149
TPDT-268 - ACP in task sequence/dba_storedProcedures/bkp_Log.sql
Normal file
149
TPDT-268 - ACP in task sequence/dba_storedProcedures/bkp_Log.sql
Normal 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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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;
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Binary file not shown.
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user