/*============================================================================= Explication du traitement realise par la SP ------------------------------------------- 1. Creation de la table [HCITools].[dbo].[CommandLog] 2. Creation de la procédure stockée [HCITools].[dbo].[CommandExecute] 3. Creation de la procédure stockée [HCITools].[dbo].[IndexOptimize] 4. Creation de la catégorie de job de l'agent SQL "DBA-Maintenance" 5. Creation du job de l'agent SQL "D93020 - Index and Statistics Optimize" 6. Creation du job de l'agent SQL "W93070 - CommandLog Cleanup" 7. Creation du job de l'agent SQL "W93080 – Output Files Cleanup" 8. Creation du job de l'agent SQL "W93090 - Index and Statistics Optimize Fullscan" Creation : 23.03.2015 / LPE Dossier : Déploiement de la solution de maintenance des index et des statistiques SQL http://sharepoint/retailpharma/dba/Reference%20documents/1800%20-%20Maintenance%20des%20index%20et%20des%20statistiques%20SQL.docx Modifications : 13.10.15 / FLA : Changement du répertoire de log de D: vers G: 13.10.15 / FLA : Appelle de la SP aps_Send_Mail_with_template à partir de HCITools 14.10.15 / FLA : Modification du SortInTempDB à No dans "D90800 - Index and Statistics Optimize" 09.03.16 / LPE : Ajout de @StatisticsSample='100' dans "D90800 - Index and Statistics Optimize" 09.03.16 / LPE : Exclude databases "apstest", "arizonatest", "arizonacashtest" 27.05.16 / LPE : Set parameter @Execute='Y' when calling job [W90800] 30.06.16 / FLA : Adding dynamic path 05.07.16 / LPE : Modify execution time of SQL job "D90800 - Index and Statistics Optimize" 21.07.16 / FLA : Standardize the name of job and schedule 09.09.16 / FLA : Ajout de Get_Job_Error_Info dans empty step et Send Mail KO 22.03.17 / FLA : Changement du schedule du job D93020 - Index and Statistics Optimize 06.09.17 / RTC : Split Document_line and others for du job D93020 - Index and Statistics Optimize. 09.03.18 / RTC : Update Ola hallengren solution with 16th octobre 2016 for sql 2016 compatibility. 22.03.18 / RTC : Move sp IndexOptimize in a HCITools sp. 15.08.19 / SPE : #TFS54630# - Update Ola hallengren solution with 14th june 2019 version and change SQL maintenance jobs. 06.11.19 / SPE : #TFS54630# - Disable job DR93010 - Index and Statistics Optimize 17.11.20 / SPE : #TFS62147# - Modify index optimize and DBCC check db weekly to optimize global performances 17.03.22 / FLA : Change DBA mail 27.04.23 / TSC : OCTPDBA-588 remove usage of sqlCmd in job "W93070 - CommandLog Cleanup" 01.09.23 / SPE : OCTPDBA-718: Remove txt file output in jobs to be compliant with SQL Managed Instances =============================================================================*/ /****************************************************************/ /********** SUPPRESSION TEMPORAIRE DES ANCIENS JOBS ************/ /****************************************************************/ USE [msdb] GO IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'D90800 - Index and Statistics Optimize') EXEC msdb.dbo.sp_delete_job @job_name=N'D90800 - Index and Statistics Optimize', @delete_unused_schedule=1 GO IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'W90600 - CommandLog Cleanup') EXEC msdb.dbo.sp_delete_job @job_name=N'W90600 - CommandLog Cleanup', @delete_unused_schedule=1 GO IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'W90700 – Output Files Cleanup') EXEC msdb.dbo.sp_delete_job @job_name=N'W90700 – Output Files Cleanup', @delete_unused_schedule=1 GO IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'W90800 - Index and Statistics Optimize Fullscan') EXEC msdb.dbo.sp_delete_job @job_name=N'W90800 - Index and Statistics Optimize Fullscan', @delete_unused_schedule=1 GO IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'D93020 - Index and Statistics Optimize') EXEC msdb.dbo.sp_delete_job @job_name=N'D93020 - Index and Statistics Optimize', @delete_unused_schedule=1 GO IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'DR93010 - Index and Statistics Optimize') EXEC msdb.dbo.sp_delete_job @job_name=N'DR93010 - Index and Statistics Optimize', @delete_unused_schedule=1 GO /*****************************************************************/ /********* 1. CREATE TABLE [HCITools].[dbo].[CommandLog] *********/ /*****************************************************************/ USE [HCITools] GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[HCITools].[dbo].[CommandLog]') AND type in (N'U')) CREATE TABLE [HCITools].[dbo].[CommandLog]( [ID] int IDENTITY(1,1) NOT NULL CONSTRAINT [PK_CommandLog] PRIMARY KEY CLUSTERED, [DatabaseName] sysname NULL, [SchemaName] sysname NULL, [ObjectName] sysname NULL, [ObjectType] char(2) NULL, [IndexName] sysname NULL, [IndexType] tinyint NULL, [StatisticsName] sysname NULL, [PartitionNumber] int NULL, [ExtendedInfo] xml NULL, [Command] nvarchar(max) NOT NULL, [CommandType] nvarchar(60) NOT NULL, [StartTime] datetime NOT NULL, [EndTime] datetime NULL, [ErrorNumber] int NULL, [ErrorMessage] nvarchar(max) NULL ) GO /********************************************************************************/ /********* 2. CREATE STORED PROCEDURE [HCITools].[dbo].[CommandExecute] *********/ /********************************************************************************/ USE [HCITools] GO IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[HCITools].[dbo].[CommandExecute]') AND type in (N'P', N'PC')) DROP PROCEDURE [dbo].[CommandExecute] GO CREATE PROCEDURE [dbo].[CommandExecute] @DatabaseContext nvarchar(max), @Command nvarchar(max), @CommandType nvarchar(max), @Mode int, @Comment nvarchar(max) = NULL, @DatabaseName nvarchar(max) = NULL, @SchemaName nvarchar(max) = NULL, @ObjectName nvarchar(max) = NULL, @ObjectType nvarchar(max) = NULL, @IndexName nvarchar(max) = NULL, @IndexType int = NULL, @StatisticsName nvarchar(max) = NULL, @PartitionNumber int = NULL, @ExtendedInfo xml = NULL, @LockMessageSeverity int = 16, @LogToTable nvarchar(max), @Execute nvarchar(max) AS BEGIN ---------------------------------------------------------------------------------------------------- --// Source: https://ola.hallengren.com //-- --// License: https://ola.hallengren.com/license.html //-- --// GitHub: https://github.com/olahallengren/sql-server-maintenance-solution //-- --// Version: 2020-11-15 18:44:03 //-- ---------------------------------------------------------------------------------------------------- SET NOCOUNT ON DECLARE @StartMessage nvarchar(max) DECLARE @EndMessage nvarchar(max) DECLARE @ErrorMessage nvarchar(max) DECLARE @ErrorMessageOriginal nvarchar(max) DECLARE @Severity int DECLARE @Errors TABLE (ID int IDENTITY PRIMARY KEY, [Message] nvarchar(max) NOT NULL, Severity int NOT NULL, [State] int) DECLARE @CurrentMessage nvarchar(max) DECLARE @CurrentSeverity int DECLARE @CurrentState int DECLARE @sp_executesql nvarchar(max) = QUOTENAME(@DatabaseContext) + '.sys.sp_executesql' DECLARE @StartTime datetime2 DECLARE @EndTime datetime2 DECLARE @ID int DECLARE @Error int = 0 DECLARE @ReturnCode int = 0 DECLARE @EmptyLine nvarchar(max) = CHAR(9) ---------------------------------------------------------------------------------------------------- --// Check core requirements //-- ---------------------------------------------------------------------------------------------------- IF NOT (SELECT [compatibility_level] FROM sys.databases WHERE database_id = DB_ID()) >= 90 BEGIN INSERT INTO @Errors ([Message], Severity, [State]) SELECT 'The database ' + QUOTENAME(DB_NAME(DB_ID())) + ' has to be in compatibility level 90 or higher.', 16, 1 END IF NOT (SELECT uses_ansi_nulls FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1 BEGIN INSERT INTO @Errors ([Message], Severity, [State]) SELECT 'ANSI_NULLS has to be set to ON for the stored procedure.', 16, 1 END IF NOT (SELECT uses_quoted_identifier FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1 BEGIN INSERT INTO @Errors ([Message], Severity, [State]) SELECT 'QUOTED_IDENTIFIER has to be set to ON for the stored procedure.', 16, 1 END IF @LogToTable = 'Y' AND NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'U' AND schemas.[name] = 'dbo' AND objects.[name] = 'CommandLog') BEGIN INSERT INTO @Errors ([Message], Severity, [State]) SELECT 'The table CommandLog is missing. Download https://ola.hallengren.com/scripts/CommandLog.sql.', 16, 1 END ---------------------------------------------------------------------------------------------------- --// Check input parameters //-- ---------------------------------------------------------------------------------------------------- IF @DatabaseContext IS NULL OR NOT EXISTS (SELECT * FROM sys.databases WHERE name = @DatabaseContext) BEGIN INSERT INTO @Errors ([Message], Severity, [State]) SELECT 'The value for the parameter @DatabaseContext is not supported.', 16, 1 END IF @Command IS NULL OR @Command = '' BEGIN INSERT INTO @Errors ([Message], Severity, [State]) SELECT 'The value for the parameter @Command is not supported.', 16, 1 END IF @CommandType IS NULL OR @CommandType = '' OR LEN(@CommandType) > 60 BEGIN INSERT INTO @Errors ([Message], Severity, [State]) SELECT 'The value for the parameter @CommandType is not supported.', 16, 1 END IF @Mode NOT IN(1,2) OR @Mode IS NULL BEGIN INSERT INTO @Errors ([Message], Severity, [State]) SELECT 'The value for the parameter @Mode is not supported.', 16, 1 END IF @LockMessageSeverity NOT IN(10,16) OR @LockMessageSeverity IS NULL BEGIN INSERT INTO @Errors ([Message], Severity, [State]) SELECT 'The value for the parameter @LockMessageSeverity is not supported.', 16, 1 END IF @LogToTable NOT IN('Y','N') OR @LogToTable IS NULL BEGIN INSERT INTO @Errors ([Message], Severity, [State]) SELECT 'The value for the parameter @LogToTable is not supported.', 16, 1 END IF @Execute NOT IN('Y','N') OR @Execute IS NULL BEGIN INSERT INTO @Errors ([Message], Severity, [State]) SELECT 'The value for the parameter @Execute is not supported.', 16, 1 END ---------------------------------------------------------------------------------------------------- --// Raise errors //-- ---------------------------------------------------------------------------------------------------- DECLARE ErrorCursor CURSOR FAST_FORWARD FOR SELECT [Message], Severity, [State] FROM @Errors ORDER BY [ID] ASC OPEN ErrorCursor FETCH ErrorCursor INTO @CurrentMessage, @CurrentSeverity, @CurrentState WHILE @@FETCH_STATUS = 0 BEGIN RAISERROR('%s', @CurrentSeverity, @CurrentState, @CurrentMessage) WITH NOWAIT RAISERROR(@EmptyLine, 10, 1) WITH NOWAIT FETCH NEXT FROM ErrorCursor INTO @CurrentMessage, @CurrentSeverity, @CurrentState END CLOSE ErrorCursor DEALLOCATE ErrorCursor IF EXISTS (SELECT * FROM @Errors WHERE Severity >= 16) BEGIN SET @ReturnCode = 50000 GOTO ReturnCode END ---------------------------------------------------------------------------------------------------- --// Log initial information //-- ---------------------------------------------------------------------------------------------------- SET @StartTime = SYSDATETIME() SET @StartMessage = 'Date and time: ' + CONVERT(nvarchar,@StartTime,120) RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT SET @StartMessage = 'Database context: ' + QUOTENAME(@DatabaseContext) RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT SET @StartMessage = 'Command: ' + @Command RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT IF @Comment IS NOT NULL BEGIN SET @StartMessage = 'Comment: ' + @Comment RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT END IF @LogToTable = 'Y' BEGIN INSERT INTO dbo.CommandLog (DatabaseName, SchemaName, ObjectName, ObjectType, IndexName, IndexType, StatisticsName, PartitionNumber, ExtendedInfo, CommandType, Command, StartTime) VALUES (@DatabaseName, @SchemaName, @ObjectName, @ObjectType, @IndexName, @IndexType, @StatisticsName, @PartitionNumber, @ExtendedInfo, @CommandType, @Command, @StartTime) END SET @ID = SCOPE_IDENTITY() ---------------------------------------------------------------------------------------------------- --// Execute command //-- ---------------------------------------------------------------------------------------------------- IF @Mode = 1 AND @Execute = 'Y' BEGIN EXECUTE @sp_executesql @stmt = @Command SET @Error = @@ERROR SET @ReturnCode = @Error END IF @Mode = 2 AND @Execute = 'Y' BEGIN BEGIN TRY EXECUTE @sp_executesql @stmt = @Command END TRY BEGIN CATCH SET @Error = ERROR_NUMBER() SET @ErrorMessageOriginal = ERROR_MESSAGE() SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'') SET @Severity = CASE WHEN ERROR_NUMBER() IN(1205,1222) THEN @LockMessageSeverity ELSE 16 END RAISERROR('%s',@Severity,1,@ErrorMessage) WITH NOWAIT IF NOT (ERROR_NUMBER() IN(1205,1222) AND @LockMessageSeverity = 10) BEGIN SET @ReturnCode = ERROR_NUMBER() END END CATCH END ---------------------------------------------------------------------------------------------------- --// Log completing information //-- ---------------------------------------------------------------------------------------------------- SET @EndTime = SYSDATETIME() SET @EndMessage = 'Outcome: ' + CASE WHEN @Execute = 'N' THEN 'Not Executed' WHEN @Error = 0 THEN 'Succeeded' ELSE 'Failed' END RAISERROR('%s',10,1,@EndMessage) WITH NOWAIT SET @EndMessage = 'Duration: ' + CASE WHEN (DATEDIFF(SECOND,@StartTime,@EndTime) / (24 * 3600)) > 0 THEN CAST((DATEDIFF(SECOND,@StartTime,@EndTime) / (24 * 3600)) AS nvarchar) + '.' ELSE '' END + CONVERT(nvarchar,DATEADD(SECOND,DATEDIFF(SECOND,@StartTime,@EndTime),'1900-01-01'),108) RAISERROR('%s',10,1,@EndMessage) WITH NOWAIT SET @EndMessage = 'Date and time: ' + CONVERT(nvarchar,@EndTime,120) RAISERROR('%s',10,1,@EndMessage) WITH NOWAIT RAISERROR(@EmptyLine,10,1) WITH NOWAIT IF @LogToTable = 'Y' BEGIN UPDATE dbo.CommandLog SET EndTime = @EndTime, ErrorNumber = CASE WHEN @Execute = 'N' THEN NULL ELSE @Error END, ErrorMessage = @ErrorMessageOriginal WHERE ID = @ID END ReturnCode: IF @ReturnCode <> 0 BEGIN RETURN @ReturnCode END ---------------------------------------------------------------------------------------------------- END GO /********************************************************************************/ /********* 4. CREATE SQL AGENT JOB CATEGORY "DBA-Maintenance" *********/ /********************************************************************************/ USE [msdb] GO IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Maintenance' AND category_class=1) BEGIN EXEC msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Maintenance' END /********************************************************************************/ /********* 5. CREATE SQL AGENT JOB "W93070 - CommandLog Cleanup" ***************/ /********************************************************************************/ USE [msdb] ; DECLARE @job_description NVARCHAR(1024) SET @job_description = 'Création du job le ' + CONVERT(VARCHAR(10),GETDATE(),104) + ' (Source SharePoint : "1800 - Maintenance des index et des statistiques SQL.docx") 27.04.2023 TSC OCTPDBA-588 Adapt step "CommandLog Cleanup" to not use a sqlCmd ' /* Drop existing standard schedule for job */ declare @schedule_id int declare c_schedules cursor local forward_only static for select ss.schedule_id from msdb.dbo.sysjobschedules sjs INNER JOIN msdb.dbo.sysschedules ss ON sjs.schedule_id = ss.schedule_id AND ss.name NOT LIKE '%#SPEC#' INNER JOIN msdb.dbo.sysjobs sj ON sjs.job_id = sj.job_id WHERE sj.name = N'W93070 - CommandLog Cleanup' open c_schedules FETCH NEXT FROM c_schedules into @schedule_id while @@fetch_status = 0 begin IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 FETCH NEXT FROM c_schedules into @schedule_id end close c_schedules deallocate c_schedules IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'W93070 - CommandLog Cleanup') EXEC msdb.dbo.sp_delete_job @job_name = N'W93070 - CommandLog Cleanup', @delete_unused_schedule=0 /* Creation Job and Steps*/ BEGIN TRANSACTION DECLARE @ReturnCode INT SELECT @ReturnCode = 0 IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Maintenance' AND category_class=1) BEGIN EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Maintenance' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback END /* Add Job */ DECLARE @jobId BINARY(16) EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'W93070 - CommandLog Cleanup', @enabled=1, @notify_level_eventlog=2, @notify_level_email=0, @notify_level_netsend=0, @notify_level_page=0, @delete_level=0, @description=@job_description, @category_name=N'DBA-Maintenance', @start_step_id=1, @owner_login_name=N'sa', @job_id = @jobId OUTPUT IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /* Add Step */ EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', @step_id=1, @cmdexec_success_code=0, @on_success_action=3, @on_success_step_id=0, @on_fail_action=3, @on_fail_step_id=0, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'TSQL', @command=N'/* Empty step */', @database_name=N'master', @output_file_name=NULL, @flags=0, @database_user_name=NULL, @server=NULL, @additional_parameters=NULL, @proxy_id=NULL, @proxy_name=NULL IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /* Add Step */ EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'CommandLog Cleanup', @step_id=2, @cmdexec_success_code=0, @on_success_action=3, @on_success_step_id=0, @on_fail_action=4, @on_fail_step_id=4, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'TSQL', @command=N'DELETE FROM [dbo].[CommandLog] WHERE StartTime < DATEADD(dd,-30,GETDATE())', @database_name=N'HCITools', @output_file_name=NULL, @flags=0, @database_user_name=NULL, @server=NULL, @additional_parameters=NULL, @proxy_id=NULL, @proxy_name=NULL IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /* Add Step */ EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', @step_id=3, @cmdexec_success_code=0, @on_success_action=1, @on_success_step_id=0, @on_fail_action=4, @on_fail_step_id=4, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'TSQL', @command=N'/* Empty step */ exec Get_Job_Error_Info @in_JobName = ''W93070 - CommandLog Cleanup'', @in_Recipients = ''DBA_operator''', @database_name=N'HCITools', @output_file_name=NULL, @flags=0, @database_user_name=NULL, @server=NULL, @additional_parameters=NULL, @proxy_id=NULL, @proxy_name=NULL IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /* Add Step */ EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', @step_id=4, @cmdexec_success_code=0, @on_success_action=2, @on_success_step_id=0, @on_fail_action=2, @on_fail_step_id=0, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'TSQL', @command=N'exec Get_Job_Error_Info @in_JobName = ''W93070 - CommandLog Cleanup'', @in_Recipients = ''DBA_operator''', @database_name=N'HCITools', @output_file_name=NULL, @flags=0, @database_user_name=NULL, @server=NULL, @additional_parameters=NULL, @proxy_id=NULL, @proxy_name=NULL IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /* Add Standard Schedule */ EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'W93070-W', @enabled=1, @freq_type=8, @freq_interval=1, @freq_subday_type=1, @freq_subday_interval=0, @freq_relative_interval=0, @freq_recurrence_factor=1, @active_start_date=20150305, @active_end_date=99991231, @active_start_time=0, @active_end_time=235959 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /* Attach existing specific schedule for job */ declare @enabled_schedule int, @schedule_name nvarchar(50) declare c_schedules cursor local forward_only static for select enabled, name from msdb.dbo.sysschedules where name LIKE 'W93070%' and name LIKE '%#SPEC#' open c_schedules FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name while @@fetch_status = 0 begin EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name IF(@enabled_schedule = 1) begin SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 end IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name end close c_schedules deallocate c_schedules EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback COMMIT TRANSACTION GOTO EndSave QuitWithRollback: IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION EndSave: GO /********************************************************************************/ /********* 6. DROP SQL AGENT JOB "W93080 – Output Files Cleanup" *********/ /********************************************************************************/ USE [msdb] ; IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'W93080 - Output Files Cleanup') EXEC msdb.dbo.sp_delete_job @job_name = N'W93080 - Output Files Cleanup', @delete_unused_schedule=1 /*********************************************************************************************/ /********* 7. CREATE SQL AGENT JOB "W93090 - Index and Statistics Optimize Fullscan" *********/ /*********************************************************************************************/ USE [msdb] ; DECLARE @job_description NVARCHAR(1024) SET @job_description = 'Création du job le ' + CONVERT(VARCHAR(10),GETDATE(),104) + ' (Source SharePoint : "1800 - Maintenance des index et des statistiques SQL.docx")' /* Drop existing standard schedule for job */ declare @schedule_id int declare c_schedules cursor local forward_only static for select ss.schedule_id from msdb.dbo.sysjobschedules sjs INNER JOIN msdb.dbo.sysschedules ss ON sjs.schedule_id = ss.schedule_id AND ss.name NOT LIKE '%#SPEC#' INNER JOIN msdb.dbo.sysjobs sj ON sjs.job_id = sj.job_id WHERE sj.name = N'W93090 - Index and Statistics Optimize Fullscan' open c_schedules FETCH NEXT FROM c_schedules into @schedule_id while @@fetch_status = 0 begin IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 FETCH NEXT FROM c_schedules into @schedule_id end close c_schedules deallocate c_schedules IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'W93090 - Index and Statistics Optimize Fullscan') EXEC msdb.dbo.sp_delete_job @job_name = N'W93090 - Index and Statistics Optimize Fullscan', @delete_unused_schedule=0 /* Creation Job and Steps*/ BEGIN TRANSACTION DECLARE @ReturnCode INT SELECT @ReturnCode = 0 IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Maintenance' AND category_class=1) BEGIN EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Maintenance' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback END /* Add Job */ DECLARE @jobId BINARY(16) EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'W93090 - Index and Statistics Optimize Fullscan', @enabled=1, @notify_level_eventlog=2, @notify_level_email=0, @notify_level_netsend=0, @notify_level_page=0, @delete_level=0, @description=@job_description, @category_name=N'DBA-Maintenance', @start_step_id=1, @owner_login_name=N'sa', @job_id = @jobId OUTPUT IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /* Add Step */ EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', @step_id=1, @cmdexec_success_code=0, @on_success_action=3, @on_success_step_id=0, @on_fail_action=3, @on_fail_step_id=0, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'TSQL', @command=N'/* Empty step */', @database_name=N'master', @output_file_name=NULL, @flags=0, @database_user_name=NULL, @server=NULL, @additional_parameters=NULL, @proxy_id=NULL, @proxy_name=NULL IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /* Add Step */ EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Wait for a random delay of 0..1150 minutes', @step_id=2, @cmdexec_success_code=0, @on_success_action=3, @on_success_step_id=0, @on_fail_action=4, @on_fail_step_id=5, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'TSQL', @command=N'EXEC [dbo].[Wait_Random_Time_Sunday] @in_Minutes = 1150', @database_name=N'HCITools', @output_file_name=NULL, @flags=0, @database_user_name=NULL, @server=NULL, @additional_parameters=NULL, @proxy_id=NULL, @proxy_name=NULL IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /* Add Step */ EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'IndexOptimize - ALL_DATABASES', @step_id=3, @cmdexec_success_code=0, @on_success_action=3, @on_success_step_id=0, @on_fail_action=4, @on_fail_step_id=5, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'TSQL', @command=N'EXECUTE [dbo].[IndexOptimize] @Databases = ''ALL_DATABASES,-tempdb,-symbiose,-ArizonaDW,-%test%,-%dbi%,-%snapshot%,-%capucine%'', @FragmentationMedium=''INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE'', @FragmentationHigh=''INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE'', @FragmentationLevel1=5, @FragmentationLevel2=30, @MinNumberOfPages=1000, @SortInTempdb=''N'', @LOBCompaction=''Y'', @UpdateStatistics=''ALL'', @OnlyModifiedStatistics=''N'', @StatisticsSample=''100'', @PartitionLevel=''Y'', @MSShippedObjects=''Y'', @Indexes=''ALL_INDEXES'', @LogToTable=''Y'', @Execute=''Y'';', @database_name=N'HCITools', @output_file_name=NULL, @flags=0, @database_user_name=NULL, @server=NULL, @additional_parameters=NULL, @proxy_id=NULL, @proxy_name=NULL IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /* Add Step */ EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', @step_id=4, @cmdexec_success_code=0, @on_success_action=1, @on_success_step_id=0, @on_fail_action=4, @on_fail_step_id=5, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'TSQL', @command=N'/* Empty step */ exec Get_Job_Error_Info @in_JobName = ''W93090 - Index and Statistics Optimize Fullscan'', @in_Recipients = ''DBA_operator''', @database_name=N'HCITools', @output_file_name=NULL, @flags=0, @database_user_name=NULL, @server=NULL, @additional_parameters=NULL, @proxy_id=NULL, @proxy_name=NULL IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /* Add Step */ EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', @step_id=5, @cmdexec_success_code=0, @on_success_action=2, @on_success_step_id=0, @on_fail_action=2, @on_fail_step_id=0, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'TSQL', @command=N'exec Get_Job_Error_Info @in_JobName = ''W93090 - Index and Statistics Optimize Fullscan'', @in_Recipients = ''DBA_operator''', @database_name=N'HCITools', @output_file_name=NULL, @flags=0, @database_user_name=NULL, @server=NULL, @additional_parameters=NULL, @proxy_id=NULL, @proxy_name=NULL IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /* Add Standard Schedule */ EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'W93090-W', @enabled=1, @freq_type=8, @freq_interval=1, @freq_subday_type=1, @freq_subday_interval=0, @freq_relative_interval=0, @freq_recurrence_factor=1, @active_start_date=20150305, @active_end_date=99991231, @active_start_time=42000, @active_end_time=235959 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /* Attach existing specific schedule for job */ declare @enabled_schedule int, @schedule_name nvarchar(50) declare c_schedules cursor local forward_only static for select enabled, name from msdb.dbo.sysschedules where name LIKE 'W93090%' and name LIKE '%#SPEC#' open c_schedules FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name while @@fetch_status = 0 begin EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name IF(@enabled_schedule = 1) begin SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 end IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name end close c_schedules deallocate c_schedules EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback COMMIT TRANSACTION GOTO EndSave QuitWithRollback: IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION EndSave: GO