316 lines
21 KiB
Transact-SQL
316 lines
21 KiB
Transact-SQL
/*=============================================================================
|
||
|
||
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
|
||
*/
|
||
|