Audit Tables Using XML Schema
-
Posted on July 16, 2011 by Derek Dieter
-
1
Auditing tables can be a complicated procedure if you require a new table for every table being audited. Fortunately the new XML datatype can help to automate this procedure of auditing multiple tables into a single table.
The following trigger template can be used to audit a table into a single table.
First let’s create the table needed to hold the audited values:
[cc lang=”sql”]
CREATE TABLE [Log].[AuditTableHistory](
[HistoryID] [int] IDENTITY(1,1) NOT NULL,
[TableSchema] [varchar](10) NULL,
[TableName] [varchar](100) NULL,
[AuditValue] [xml] NULL,
[DateCreated] [datetime] NULL,
CONSTRAINT [PK_AUDITTABLEHISTORY] PRIMARY KEY CLUSTERED
(
[HistoryID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]
— Now let’s create the trigger
CREATE TRIGGER [Audit].[Trg_Schema_Table]
ON [Schema].[Table]
AFTER UPDATE,DELETE
AS
BEGIN
— SET NOCOUNT ON added to prevent extra result sets from
— interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @AuditValue xml
SET @AuditValue =
(
SELECT TOP 1 *
FROM DELETED
FOR XML AUTO
)
INSERT INTO Log.AuditTableHistory
(
AuditValue,
TableSchema,
TableName,
DateCreated
)
SELECT
AuditValue = @AuditValue,
TableSchema = OBJECT_SCHEMA_NAME(parent_obj),
TableName = OBJECT_NAME(parent_obj),
DateCreated = GETDATE()
FROM sysobjects so
WHERE so.id = @@PROCID
END
GO
[/cc]
We can apply this trigger to any table we want just by changing the “ON” statement. It will work for any table. The only difficulty comes in when we change the schema for a particular table. When this happens, we need to know the date/time the table schema changed so we can query the table appropriately.
- Comments (RSS)
- Trackback
- Permalink