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

550 lines
18 KiB
Transact-SQL

/* 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