Track down DDL Database changes

admin, 23 October 2008,
Categories: Databases
1 Star2 Stars3 Stars4 Stars5 Stars
(No Ratings Yet)
Loading ... Loading ...

If you want to know who alters/drops/creates tables/views/stored procedures… I would like to share with you the following script. As you know DDL Triggers (introduced in SQL Server 2005) work very like the DML triggers but details of the event that fired the a trigger are available only in XML format.

Fist of all I create a table that will hold events.

CREATE TABLE [dbo].[DDL_ChangeEvents](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Session_ID] [int] NOT NULL CONSTRAINT [DF_ddl_change_Session_ID] DEFAULT (@@spid),
[Session_IPAddress] [nvarchar](50) NULL,
[Insert_Date] [datetime] NOT NULL CONSTRAINT [DF_ddl_change_Insert_Date] DEFAULT (GETDATE()),
[Username] [nvarchar](100) NOT NULL CONSTRAINT [DF_DDL_change_Username] DEFAULT (CONVERT([nvarchar](100),ORIGINAL_LOGIN(),(0))),
[EventType] [nvarchar](200) NULL,
[objectName] [nvarchar](200) NULL,
[objectType] [nvarchar](200) NULL,
[sql] [nvarchar](max) NULL
) ON [PRIMARY]

It wont help if I get only SPID of the session as in many cases users get logged with only one defined login or even with ’sa’.So I need IP address of those workstations thus I added Session_IPAddress column.
Now, let’s create a database trigger to capture the info.

CREATE TRIGGER [trgDataDDLChangeEvent] ON DATABASE
FOR DDL_DATABASE_LEVEL_EVENTS
AS
DECLARE @eventdata XML
SET @eventdata = EVENTDATA()
IF @eventdata.value(’(/EVENT_INSTANCE/EventType)[1]‘, ‘nvarchar(200)’)
‘CREATE_STATISTICS’
INSERT INTO DDL_ChangeEvents
(
EventType,
ObjectName,
ObjectType,
[sql] ,
Session_IPAddress
)
SELECT @eventdata.value(’(/EVENT_INSTANCE/EventType)[1]‘,
‘nvarchar(200)’),
@eventdata.value(’(/EVENT_INSTANCE/ObjectName)[1]‘,
‘nvarchar(200)’),
@eventdata.value(’(/EVENT_INSTANCE/ObjectType)[1]‘,
‘nvarchar(200)’),
@eventdata.value(’(/EVENT_INSTANCE/TSQLCommand)[1]‘,
‘nvarchar(max)’), client_net_address
FROM sys.dm_exec_connections WHERE session_id=@@SPID
;

Well I won’t bother to record CREATE STATISTIC events hence there is an IF block to skip this event. I get the IP Address from sys.dm_exec_connections DMV which has client_net_address column.
Now create/drop/alter table (also via SSMS) for example and query the DDL_ChangeEvents table to see what happened.

Comments

Leave a Reply:

Name *

Mail (hidden) *

Website

 

Related posts:

  1. Change collation in tempdb What’s happening if you installed SQL Server instance with a...
  2. SQL Server Agent Jobs duration Report Hi folks. I would like to share with you the...
  3. Quick look at IN predicate There are lots of articles and techniques onnthe internet about...
  4. Getting next value Hi folks. I’d like to share with you some technique...
  5. Getting row count of table in SQL Server 2005 It is much easier in SQL Server 2005 to get...