Audit Tables Using XML Schema

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.

One comment
Exchange Public Folder 22 Mar 2012 at 9:42 pm

Hi,
I read your post, i really appreciate your experience and i will get good knowledge from their as well.

Featured Articles

 Site Author

  • Thanks for visiting!
css.php