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

316 lines
21 KiB
Transact-SQL
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*=============================================================================
Explication du traitement realise par le script SQL pour creer un trigger
capturant les evenements DML configures manuellement
---------------------------------------------------
1. Create schema [dba]
2. Create table [DML_audit]
3. Create SP [HCITools].[dba].[create_DML_Capture_DML_Events]
4. Manually create DML triggers
Creation : 07.04.2017 / LPE
Modifications :
=============================================================================*/
/****************************************************************/
/**************** 1. CREATE SCHEMA [dba] *****************/
/****************************************************************/
USE [master]
GO
IF NOT EXISTS (SELECT * FROM master.sys.schemas WHERE name = N'dba')
BEGIN
EXEC('CREATE SCHEMA [dba] AUTHORIZATION [dbo]')
END
GO
/****************************************************************/
/************** 2. CREATE TABLE [DML_audit] ****************/
/****************************************************************/
USE [master]
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dba].[DML_audit]') AND type in (N'U'))
BEGIN
CREATE TABLE [dba].[DML_audit](
[DMA_DML_audit_ID] [bigint] IDENTITY(1,1) NOT NULL,
[DMA_DB_Name] [nvarchar](128) NULL,
[DMA_Schema_Name] [sysname] NULL,
[DMA_Table_Name] [sysname] NULL,
[DMA_Event_Info] [nvarchar](4000) NULL,
[DMA_Old_Content] [nvarchar](max) NULL,
[DMA_New_Content] [nvarchar](max) NULL,
[DMA_SPID] [smallint] NULL,
[DMA_Host_Name] [nvarchar](128) NULL,
[DMA_App_Name] [nvarchar](128) NULL,
[DMA_Datetime] [datetime] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
END
GO
/****************************************************************/
/******* AUTHORISATIONS DE LA TABLE [DML_audit] *********/
/****************************************************************/
USE [master]
GO
GRANT INSERT ON [master].[dba].[DML_audit] TO [public] AS [dbo]
GO
/****************************************************************/
/******* 3. CREATE SP [create_DML_Capture_DML_Events] *******/
/****************************************************************/
USE [HCITools]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dba].[create_DML_Capture_DML_Events]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dba].[create_DML_Capture_DML_Events]
GO
USE [HCITools]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dba].[create_DML_Capture_DML_Events]
@in_database_name SYSNAME,
@in_schema_name SYSNAME,
@in_table_name SYSNAME
AS
/*=============================================================================
Explication du traitement realise par la SP
-------------------------------------------
Create a trigger to collect in table [master].[dba].[DML_audit] all data
modifications for a given table.
Contexte d'utilisation
----------------------
DBA support is required to use this stored procedure.
This stored procedure is manually executed.
The created trigger does not capture text, ntext and image columns.
Script de controle des triggers existants
-----------------------------------------
EXEC sp_MSforeachdb @command1= "USE [?]; SELECT '?', * FROM sys.triggers WHERE NAME LIKE 'tDML_Capture_DML_Events_On_Table%'"
Parametres
----------
@in_database_name = database name
@in_schema_name = schema name
@in_table_name = table name
Creation : 27.03.17 / LPE
Dossier : #TFS37883# + Create a DML audit for given tables
Modifications :
07.04.17 / LPE : Move TRY/CATCH inside the trigger created dynamically
Check existence of table [master].[dba].[DML_audit]
07.04.17 / LPE : Choose dynamically schema when dropping a DML trigger
=============================================================================*/
SET NOCOUNT ON;
/**************** Declare variables ****************/
DECLARE @sql NVARCHAR(MAX),
@statment NVARCHAR(MAX),
@database_name SYSNAME,
@schema_name SYSNAME,
@table_name SYSNAME;
DECLARE @tColumn_list TABLE (tColumnName NVARCHAR(MAX));
DECLARE @column_list NVARCHAR(MAX) = '';
SELECT @database_name = @in_database_name,
@schema_name = @in_schema_name,
@table_name = @in_table_name;
/**************** Define the execution context ****************/
SELECT @sql = QUOTENAME(@database_name) + '.[sys].[sp_executesql]';
/**************** Get columns list without text, ntext and image ****************/
INSERT INTO @tColumn_list
EXECUTE ('
SELECT col.name
FROM [' + @database_name + '].sys.tables tbl
JOIN [' + @database_name + '].sys.columns col
ON col.object_id = tbl.object_id
JOIN [' + @database_name + '].sys.types uty
ON uty.user_type_id = col.user_type_id
AND uty.system_type_id NOT IN (SELECT sty.system_type_id
FROM [' + @database_name + '].sys.types sty
WHERE sty.name IN (''text'', ''ntext'', ''image''))
WHERE tbl.name = ''' + @table_name + '''
ORDER BY col.name
')
SELECT @column_list = @column_list + tColumnName + ',' from @tColumn_list
SELECT @column_list = SUBSTRING(@column_list,1,LEN(@column_list)-1)
/**************** Drop existing DML trigger ****************/
SELECT @statment = '
IF EXISTS (SELECT * FROM [' + @database_name + '].[sys].[triggers] WHERE object_id = OBJECT_ID(N''[' + @schema_name + '].[tDML_Capture_DML_Events_On_Table_' + @table_name + ']''))
DROP TRIGGER [' + @schema_name + '].[tDML_Capture_DML_Events_On_Table_' + @table_name + ']
';
EXEC @sql @statment;
/**************** Create DML trigger ****************/
SELECT @statment = '
CREATE TRIGGER [' + @schema_name + '].[tDML_Capture_DML_Events_On_Table_' + @table_name + ']
ON [' + @database_name + '].[' + @schema_name + '].[' + @table_name + ']
AFTER INSERT,DELETE,UPDATE
AS
/*=============================================================================
Trigger capturing DML Events for table [' + @database_name + '].[' + @schema_name + '].[' + @table_name + ']
Creation : ' + CONVERT(VARCHAR(60),GETDATE(),104) + ' / ' + SYSTEM_USER + '
Modifications :
DD.MM.YY / xxx :
=============================================================================*/
BEGIN
SET NOCOUNT ON
BEGIN TRY
/**************** Check if table [master].[dba].[DML_audit] exists ****************/
IF EXISTS (SELECT *
FROM master.sys.tables t
JOIN master.sys.schemas s
ON s.schema_id = t.schema_id
AND s.name = ''dba''
WHERE t.name = ''DML_audit'')
BEGIN
DECLARE @TEMP TABLE
(EventType NVARCHAR(30),
Parameters INT,
EventInfo NVARCHAR(4000))
INSERT INTO @TEMP
EXEC(''DBCC INPUTBUFFER(@@SPID) WITH NO_INFOMSGS'')
INSERT INTO [master].[dba].[DML_audit]
([DMA_DB_Name],
[DMA_Schema_Name],
[DMA_Table_Name],
[DMA_Event_Info],
[DMA_Old_Content],
[DMA_New_Content],
[DMA_SPID],
[DMA_Host_Name],
[DMA_App_Name],
[DMA_Datetime])
SELECT ''' + @database_name + ''',
''' + @schema_name + ''',
''' + @table_name + ''',
EventInfo,
(SELECT ' + @column_list + ' FROM deleted FOR XML RAW),
(SELECT ' + @column_list + ' FROM inserted FOR XML RAW),
@@SPID,
HOST_NAME(),
APP_NAME(),
GETDATE()
FROM @TEMP
END /* Check if table [master].[dba].[DML_audit] exists */
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE() AS ''Error Message'',
ERROR_NUMBER() AS ''Error Number'',
ERROR_SEVERITY() AS ''Error Severity'',
ERROR_STATE() AS ''Error State'',
ERROR_LINE() AS ''Error Line'',
COALESCE(ERROR_PROCEDURE(), ''Not within procedure'') AS ''Error Proc''
END CATCH
END
';
EXEC @sql @statment;
GO
/*******************************************************************************************************/
/****************************** 4. MANUAL CONFIGURATION EXEMPLES ***************************************/
/*******************************************************************************************************/
/*
USE [HCITools]
DECLARE @DML_trigger_list TABLE
(tDTL_ID INT NOT NULL IDENTITY(1,1),
tDatabase_name SYSNAME NOT NULL,
tSchema_name SYSNAME NOT NULL,
tTable_name SYSNAME NOT NULL)
DECLARE @rowcount SMALLINT = 0,
@i SMALLINT = 1,
@database_name SYSNAME,
@schema_name SYSNAME,
@table_name SYSNAME
INSERT INTO @DML_trigger_list
VALUES
('Arizona','dbo','APS_monitor_table'),
('Arizona','dbo','Bmc_application_default'),
('Arizona','dbo','Bmc_application_key'),
('Arizona','dbo','Bmc_form_preference'),
('Arizona','dbo','Bmc_form_property'),
('Arizona','dbo','Bmc_user_role'),
('Arizona','dbo','Organizational_unit'),
('Arizona','dbo','PH_organizational_unit'),
('Arizona','dbo','System_site'),
('Arizona','dbo','System_site_transfer'),
('Arizona','dbo','Web_service_access'),
('Arizona','dbo','WSA_connection'),
('ArizonaCASH','dbo','CR_application_default'),
('ArizonaCASH','dbo','CR_application_key'),
('ArizonaCASH','dbo','CR_organizational_unit'),
('ArizonaCASH','dbo','CR_point_of_sale'),
('ActivePos_write','dbo','Settings'),
('ActiveSystemClient','cfg','Settings'),
('ActiveSystemServer','cfg','Settings'),
('ActivePos_server','dbo','Settings')
SELECT @rowcount = @@ROWCOUNT
WHILE @i <= @rowcount
BEGIN
SELECT @database_name = t.tDatabase_name,
@schema_name = t.tSchema_name,
@table_name = t.tTable_name
FROM @DML_trigger_list t
WHERE t.tDTL_ID = @i
EXEC [HCITools].[dba].[create_DML_Capture_DML_Events]
@in_database_name = @database_name,
@in_schema_name = @schema_name,
@in_table_name = @table_name
SELECT @i += 1
END
*/