/* Création des catégories manquantes si besoin*/ USE [msdb] 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 IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Monitoring' AND category_class=1) BEGIN EXEC msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Monitoring' END IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'SQL Server Agent Alerts' AND category_class=2) BEGIN EXEC msdb.dbo.sp_add_category @class=N'ALERT', @type=N'NONE', @name=N'SQL Server Agent Alerts' END IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA-Configuration' AND category_class=1) BEGIN EXEC msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Configuration' END /*============================================================================= Création d'une alerte sur l'autogrow de tempDB ----------------------------------------------- Ce script créer une alerte sur les autogrows de tempDB et envoie un mail d'alerte le cas échéant Contexte d'utilisation ---------------------- Cette alerte doit être créée après l'installation d'une nouvelle instance SQL. Création : 14.07.2015 / FLA Modifications : 21.07.2016 / FLA : Standardisation du nom du job et du schedule 20.12.2018 / SPE : #TFS49408# Migrate identification table [master].[cfg].[Identity] 17.03.2022 - FLA : Change DBA mail =============================================================================*/ /* 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'_92010 - Response - DATABASE Growth Event' 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'_92010 - Response - DATABASE Growth Event') EXEC msdb.dbo.sp_delete_job @job_name = N'_92010 - Response - DATABASE Growth Event', @delete_unused_schedule=0 GO /* 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-Monitoring' AND category_class=1) BEGIN EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Monitoring' 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'_92010 - Response - DATABASE Growth Event', @enabled=1, @notify_level_eventlog=0, @notify_level_email=0, @notify_level_netsend=0, @notify_level_page=0, @delete_level=0, @description=N'Sends notifications to DBA when DATABASE File Growth event(s) occur(s)', @category_name=N'DBA-Monitoring', @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'Send e-mail in response to WMI alert(s)', @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=1, @os_run_priority=0, @subsystem=N'TSQL', @command=N'declare @mysubject nvarchar(200) set @mysubject = ''Database file growth event - ''''$(ESCAPE_SQUOTE(WMI(DatabaseName)))'''' on server '' + @@SERVERNAME exec aps_Send_Mail_with_template @in_param_message = ''File Name: $(ESCAPE_SQUOTE(WMI(FileName))) Growth Size (KB): $(ESCAPE_SQUOTE(WMI(IntegerData))) Start Time: $(ESCAPE_SQUOTE(WMI(STartTime))) Duration (ms): $(ESCAPE_SQUOTE(WMI(Duration))) Application Name: $(ESCAPE_SQUOTE(WMI(ApplicationName))) Host Name: $(ESCAPE_SQUOTE(WMI(HostName))) Login Name: $(ESCAPE_SQUOTE(WMI(LoginName))) Session Login Name: $(ESCAPE_SQUOTE(WMI(SessionLoginName)))'', @in_param_subject = @mysubject, @in_param_varchar_2 = ''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'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 */', @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'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 = ''_92010 - Response - DATABASE Growth Event'', @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 /* 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 '_92010%' 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 IF EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = N'DBA - WMI: Database Growth Events') EXEC msdb.dbo.sp_delete_alert @name=N'DBA - WMI: Database Growth Events' GO IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'SQL Server Agent Alerts' AND category_class=2) EXEC msdb.dbo.sp_add_category @class=N'ALERT', @type=N'NONE', @name=N'SQL Server Agent Alerts' GO DECLARE @namespace NVARCHAR(200); IF (SERVERPROPERTY('InstanceName') IS NOT NULL) BEGIN SELECT @namespace = N'\\.\root\Microsoft\SqlServer\ServerEvents\' + CONVERT(NVARCHAR(128), SERVERPROPERTY('InstanceName')); END; ELSE BEGIN SELECT @namespace = N'\\.\root\Microsoft\SqlServer\ServerEvents\APSSQL'; END; /* Création de l'alerte sur l'autogrow de tempDB */ EXEC msdb.dbo.sp_add_alert @name=N'DBA - WMI: Database Growth Events', @message_id=0, @severity=0, @enabled=1, @category_name=N'SQL Server Agent Alerts', @delay_between_responses=300, @include_event_description_in=1, @notification_message=N'WMI - DB Growth notification', @wmi_namespace=@namespace, @wmi_query=N'select * from DATA_FILE_AUTO_GROW where DatabaseID = 2', @job_name=N'_92010 - Response - DATABASE Growth Event' GO DECLARE @alert_replace_runtime_tokens INT EXECUTE master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'SOFTWARE\Microsoft\MSSQLServer\SQLServerAgent', N'AlertReplaceRuntimeTokens', @alert_replace_runtime_tokens OUTPUT, N'no_output' if ISNULL(@alert_replace_runtime_tokens, 0) = 0 EXEC msdb.dbo.sp_set_sqlagent_properties @alert_replace_runtime_tokens=1 GO /**********************************************************************************************/ /********** CREATION DES FICHIERS TEMPDB MANQUANT et RESIZE DU LOG DE TRANSACTION ************/ /**********************************************************************************************/ declare @Client varchar(4) select @Client = Customer from master.[cfg].[Identity] EXEC HCITools.dbo.Set_TempDB @in_Entity = @Client, @in_Mode = 0 /*============================================================================= Modification automatique du fichier MDF pour tempDB en fonction des paramètres en entrée ----------------------------------------------- Ce script shrink et resize automatiquement le fichiers de tempDB en fonction des paramètres en entrée. Il créer un job lancé au démarrage de l'instance afin de pouvoir modifier le fichier de tempDB hors production Création : 01.11.2016 / FLA =============================================================================*/ IF (CAST(CAST(SERVERPROPERTY('productversion') as varchar(4)) as FLOAT) >= 13) GOTO QuitWithRollback declare @job_name varchar(100), @command varchar(500) IF @Client = 'SUN' SET @job_name = N'_94021 - Redefine TempDB file Size' ELSE IF @Client = 'AMA' SET @job_name = N'_94022 - Redefine TempDB file Size' ELSE IF @Client = 'CVI' SET @job_name = N'_94024 - Redefine TempDB file Size' declare @schedule_id int /* Drop existing standard schedule for job */ 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 = @job_name 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 = @job_name) EXEC msdb.dbo.sp_delete_job @job_name = @job_name, @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-Monitoring' AND category_class=1) BEGIN EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Monitoring' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback END /* Add Job */ DECLARE @jobId BINARY(16) EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=@job_name, @enabled=1, @notify_level_eventlog=0, @notify_level_email=0, @notify_level_netsend=0, @notify_level_page=0, @delete_level=0, @description=N'Redefine tempDB file size 01.11.2016 - FLA - Created ', @category_name=N'DBA-Monitoring', @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 IF @Client = 'SUN' SET @command=N'EXEC [Set_TempDB] @in_Entity = ''SUN''' ELSE IF @Client = 'AMA' SET @command=N'EXEC [Set_TempDB] @in_Entity = ''AMA''' ELSE IF @Client = 'CVI' SET @command=N'EXEC [Set_TempDB] @in_Entity = ''CVI''' /* Add Step */ EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Redefine TempDB file Size', @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=1, @os_run_priority=0, @subsystem=N'TSQL', @command=@command, @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 IF @Client = 'SUN' SET @command=N'/* Empty step */ exec Get_Job_Error_Info @in_JobName = ''_94021 - Redefine TempDB file Size'', @in_Recipients = ''DBA_operator''' ELSE IF @Client = 'AMA' SET @command=N'/* Empty step */ exec Get_Job_Error_Info @in_JobName = ''_94022 - Redefine TempDB file Size'', @in_Recipients = ''DBA_operator''' ELSE IF @Client = 'CVI' SET @command=N'/* Empty step */ exec Get_Job_Error_Info @in_JobName = ''_94024 - Redefine TempDB file Size'', @in_Recipients = ''DBA_operator''' /* 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=@command, @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 IF @Client = 'SUN' SET @command=N'exec Get_Job_Error_Info @in_JobName = ''_94021 - Redefine TempDB file Size'', @in_Recipients = ''DBA_operator''' ELSE IF @Client = 'AMA' SET @command=N'exec Get_Job_Error_Info @in_JobName = ''_94022 - Redefine TempDB file Size'', @in_Recipients = ''DBA_operator''' ELSE IF @Client = 'CVI' SET @command=N'exec Get_Job_Error_Info @in_JobName = ''_94024 - Redefine TempDB file Size'', @in_Recipients = ''DBA_operator''' /* 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=@command, @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 IF @Client = 'SUN' SET @job_name=N'_94021' ELSE IF @Client = 'AMA' SET @job_name=N'_94022' ELSE IF @Client = 'CVI' SET @job_name=N'_94024' /* Add Standard Schedule */ EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=@job_name, @enabled=1, @freq_type=64, @freq_interval=0, @freq_subday_type=0, @freq_subday_interval=0, @freq_relative_interval=0, @freq_recurrence_factor=0, @active_start_date=20160408, @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 @job_name+'%' 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