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((''+REPLACE(@param_group_counter_list, @delimiter, '')+'') 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