Audit databases – using ddl triggers
Posted on | June 5, 2010 | No Comments
As a DBA, do you ever wonder what is going inside your production database? Who is changing database schema during production time without informing you. Now, you need not to worry, you can setup DDL triggers to easily records all changes in table; like what was changed, when and by whom etc. Given is two set of commands that you need to use and leave all worries aside. Also, you can prepare customized email alerts on top of data table to notify you as soon as an event occurs.
- Create a table that will store all records. For example I am using MSDB database to store this table.
- a DDL trigger need to created inside database; for that you want to enable audit. This trigger will capture all DDL events and save in table.
- Test and check process by creating test procedure, tables etc.
1. — Script to create table
USE [msdb]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[DatabaseChangeLog](
[LogId] [int] IDENTITY(1,1) NOT NULL,
[DatabaseName] [varchar](256) NOT NULL,
[EventType] [varchar](50) NOT NULL,
[ObjectName] [varchar](256) NOT NULL,
[ObjectType] [varchar](25) NOT NULL,
[SqlCommand] [varchar](max) NOT NULL,
[EventDate] [datetime] NOT NULL CONSTRAINT [DF_DBChangeLog_EventDate] DEFAULT (getdate()),
[LoginName] [varchar](256) NOT NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
2.– Script to create database trigger
USE [SQLKnowledge]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE trigger [TrgDBChangeLog]
on database
for DDL_DATABASE_LEVEL_EVENTS
as
set nocount on
If Object_ID(‘msdb.dbo.DatabaseChangeLog’) IS NOT NULL
BEGIN
declare @data xml
set @data = EVENTDATA()
insert into msdb.dbo.DatabaseChangeLog(databasename, eventtype, objectname, objecttype, sqlcommand, loginname)
values(
@data.value(‘(/EVENT_INSTANCE/DatabaseName)[1]‘, ‘varchar(256)’),
@data.value(‘(/EVENT_INSTANCE/EventType)[1]‘, ‘varchar(50)’),
@data.value(‘(/EVENT_INSTANCE/ObjectName)[1]‘, ‘varchar(256)’),
@data.value(‘(/EVENT_INSTANCE/ObjectType)[1]‘, ‘varchar(25)’),
@data.value(‘(/EVENT_INSTANCE/TSQLCommand)[1]‘, ‘varchar(max)’),
@data.value(‘(/EVENT_INSTANCE/LoginName)[1]‘, ‘varchar(256)’)
)
END
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
ENABLE TRIGGER [TrgDBChangeLog] ON DATABASE
3. — Script to test process and check Audit records
–Test table creation
use SQLKnowledge
create table test (fname varchar(10), lname varchar(10))
– Test procedure creation
create proc test1
as
select * from msdb.dbo.DatabaseChangeLog
– check table records in msdb database
select * from msdb.dbo.DatabaseChangeLog
Please leave a comment, if you have questions or need suggestions
Tags: change log > DDL Triggers > DDL_DATABASE_LEVEL_EVENTS > event > event_instance > msdb > sql audit
Comments
Leave a Reply