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

119 lines
3.0 KiB
Transact-SQL

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