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

418 lines
13 KiB
Transact-SQL

USE [HCITools]
GO
IF NOT EXISTS (SELECT * FROM master.sys.schemas WHERE name = N'dba')
BEGIN
EXEC('CREATE SCHEMA [dba] AUTHORIZATION [dbo]')
END
GO
/* Creation de la table DBA_trace_flags */
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dba].[DBA_trace_flags]') AND type in (N'U'))
BEGIN
CREATE TABLE [dba].[DBA_trace_flags](
[DBA_trace_flags_ID] [int] NOT NULL,
[DTF_name] [varchar](MAX) NOT NULL,
[DTF_lowerstVersion] [smallint] NOT NULL,
[DTF_highestVersion] [smallint] NULL,
[DTF_active] [bit] NOT NULL
CONSTRAINT [PK_DBA_trace_flags] PRIMARY KEY CLUSTERED
(
[DBA_trace_flags_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
/* DEBUT CONFIGURATIONS DES TRACEFLAGS ------------------------------------------------------------------------------*/
/*
10 = SQL 2008
11 = SQL 2012
12 = SQL 2014
13 = SQL 2016
14 = SQL 2017
15 = SQL 2019
In SQL Managed instance, only these trace flags are compatible: 460, 2301, 2389, 2390, 2453, 2467, 7471, 8207, 9389, 10316, and 11024 */
IF (SERVERPROPERTY('EngineEdition') <> 8)
BEGIN
/* TraceFlag 1117 Grow All Files in a FileGroup Equally */
IF NOT EXISTS(SELECT 1 FROM [dba].[DBA_trace_flags] WHERE DBA_trace_flags_ID =1117)
BEGIN
INSERT INTO [dba].[DBA_trace_flags](DBA_trace_flags_ID,DTF_name,DTF_lowerstVersion,DTF_highestVersion,DTF_active)
VALUES(1117,'Grow All Files in a FileGroup Equally',10,12,1)
END
/* TraceFlag 3226 Suppress all successful backups in SQL server error log */
IF NOT EXISTS(SELECT 1 FROM [dba].[DBA_trace_flags] WHERE DBA_trace_flags_ID =3226)
BEGIN
INSERT INTO [dba].[DBA_trace_flags](DBA_trace_flags_ID,DTF_name,DTF_lowerstVersion,DTF_highestVersion,DTF_active)
VALUES(3226,'Suppress all successful backups in SQL server error log',10,NULL,1)
END
/* TraceFlag 9481 Set the Query Optimizer cardinality estimation model to 70 (LEGACY) */
IF NOT EXISTS(SELECT 1 FROM [dba].[DBA_trace_flags] WHERE DBA_trace_flags_ID =9481)
BEGIN
INSERT INTO [dba].[DBA_trace_flags](DBA_trace_flags_ID,DTF_name,DTF_lowerstVersion,DTF_highestVersion,DTF_active)
VALUES(9481,'Set the Query Optimizer cardinality estimation model to 70 (LEGACY)',12,12,1)
END
END
/* FIN CONFIGURATIONS DES TRACEFLAGS --------------------------------------------------------------------------------*/
/* CREATION DE LA PROCEDURE STOCKEE */
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dba].[DBA_Set_All_TraceFlags]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dba].[DBA_Set_All_TraceFlags]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dba].[DBA_Set_All_TraceFlags]
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
La SP va rechercher la configuration des traceflags par rapport a la version actuelle du moteur SQL et configure le necessaire.
Contexte d'utilisation
----------------------
Appelé depuis le job _94010 - Set Traceflags
Parametres
----------
Creation : 16.03.21 / SPE
Modifications :
=============================================================================*/
SET NOCOUNT ON;
/*------------------- Declaration des variables --------------------*/
DECLARE @currentSQLVersion SMALLINT,
@lowestSQLVersion SMALLINT,
@highestSQLVersion SMALLINT,
@traceFlagNumber INT,
@sqlstmt VARCHAR(MAX)
/*------------ Affectation des parametres aux variables ------------*/
SET @currentSQLVersion = SUBSTRING(CAST(SERVERPROPERTY('ProductVersion') AS NVARCHAR(128)), 1, CHARINDEX('.', CAST(SERVERPROPERTY('ProductVersion') AS NVARCHAR(128))) - 1 )
/*-------------------------- Traitement ---------------------------*/
BEGIN TRY
DECLARE c_traceflags CURSOR LOCAL FORWARD_ONLY STATIC FOR
SELECT DBA_trace_flags_ID,DTF_lowerstVersion,DTF_highestVersion
FROM [dba].[DBA_trace_flags]
WHERE DTF_active = 1
;
OPEN c_traceflags
;
FETCH NEXT FROM c_traceflags
INTO @traceFlagNumber,@lowestSQLVersion,@highestSQLVersion
;
WHILE @@fetch_status = 0
BEGIN
IF ((SERVERPROPERTY('EngineEdition') = 8) and (@traceFlagNumber IN (460,2301,2389,2390,2453,2467,7471,8207,9389,10316,11024 ))) OR (SERVERPROPERTY('EngineEdition') <> 8)
BEGIN
IF @currentSQLVersion >= @lowestSQLVersion
BEGIN
IF @currentSQLVersion <= isnull(@highestSQLVersion,9999)
BEGIN
SET @sqlstmt = 'DBCC TRACEON (' + convert(VARCHAR,@traceFlagNumber) + ', -1) WITH NO_INFOMSGS;'
EXEC (@sqlstmt)
END
END
END
FETCH NEXT FROM c_traceflags
INTO @traceFlagNumber,@lowestSQLVersion,@highestSQLVersion
;
END
;
CLOSE c_traceflags
;
DEALLOCATE c_traceflags
/*---------------------- Traitement des erreurs ----------------------*/
END TRY
BEGIN CATCH
/* Traitement des erreurs (avec RaiseError) */
EXEC dbo.get_Error_Info @in_RaiseError = 1
END CATCH
GO
/* CREATION DU JOB SQL */
USE [msdb]
GO
/****************************************************************/
/********** SUPPRESSION TEMPORAIRE DES ANCIENS JOBS ************/
/****************************************************************/
IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'_90210 - Set Traceflag 1117')
EXEC msdb.dbo.sp_delete_job @job_name=N'_90210 - Set Traceflag 1117', @delete_unused_schedule=1
GO
IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'_94010 - Set Traceflag 1117')
EXEC msdb.dbo.sp_delete_job @job_name=N'_94010 - Set Traceflag 1117', @delete_unused_schedule=1
GO
IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'_94010 - Set Traceflag 1117 and 3226')
EXEC msdb.dbo.sp_delete_job @job_name=N'_94010 - Set Traceflag 1117 and 3226', @delete_unused_schedule=1
GO
/* Creation des categories manquantes si besoin*/
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
/*=============================================================================
Job utilise avec la table DBA_trace_flags pour les configurations sur les traceflags selon la version SQL
Création : 16.03.2021 / SPE
Modifications :
=============================================================================*/
/* 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'_94010 - Set Traceflags'
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'_94010 - Set Traceflags')
EXEC msdb.dbo.sp_delete_job @job_name = N'_94010 - Set Traceflags', @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-Configuration' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'DBA-Configuration'
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'_94010 - Set Traceflags',
@enabled=1,
@notify_level_eventlog=0,
@notify_level_email=0,
@notify_level_netsend=0,
@notify_level_page=0,
@delete_level=0,
@description=N'Use table DBA_trace_flags to set all SQL traceflags',
@category_name=N'DBA-Configuration',
@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'Set ALL Traceflags',
@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'EXEC [dba].[DBA_Set_All_TraceFlags]',
@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 = ''_94010 - Set Traceflags'', @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 = ''_94010 - Set Traceflags'', @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'_94010',
@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=20150714,
@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 '_94010%'
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
/* EXECUTION DU JOB POUR ACTIVER LES TRACEFLAGS */
EXEC dbo.sp_start_job @job_name = N'_94010 - Set Traceflags'
GO