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