The easiest and fastest way to create ad hoc reports from SQL Server
Got a SQL Server or .NET question? Discuss it in the forums. (SQL Server Forums | Dot NET Forums)
First Time? You can support us by signing up. It takes only 5 seconds. Click here to sign up. If you already have an account, click here to login.

Who Created a Table – DDL Triggers in SQL SERVER 2008

Hi all this post is about the new features in SQL Server 2008 ..
SQL Server 2008 has a power full feature called DDL triggers which uses for Auditing changes in database and this is very useful too. You will find a blog entry about auditing using transaction log  here  and find a example of LOGON Trigger here. You can find several ways to do that. So if you want to who create or Delete a table from your database and when then here is a way to do so with the help of “EVENTDATA” function.
”EVENTDATA”  function returns a XML value.So here we go and see how it can be done…

First Create a Database to test …

USE MASTER
GO
 
-- First Create a DATABASE
CREATE DATABASE TestDDLTriggers ON PRIMARY
(NAME=N'TestDDLTriggers' ,FILENAME=N'D:\TestDDLTriggers.mdf')
LOG ON 
(NAME=N'TestDDLTriggers_LOG' ,FILENAME=N'D:\TestDDLTriggers.ldf')

You can change you path for .mdf & .ldf file

Now you create a table to hold result for you… and made a DDL Trigger..like this..

USE TestDDLTriggers
GO
 
 
-- Create a table to hold results
CREATE TABLE info_ddl (PostTime datetime, DB_User nvarchar(100), Event nvarchar(100));
GO
 
-- Now create a Trigger
CREATE TRIGGER ddl_test 
ON DATABASE 
FOR DDL_DATABASE_LEVEL_EVENTS 
AS
INSERT info_ddl 
   (PostTime, DB_User, Event) 
   VALUES 
   (GETDATE(), 
   CONVERT(nvarchar(100), CURRENT_USER), 
   EVENTDATA().value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)')) ;
GO

 

So here we create a table to hold the results and a trigger on “DATABASE LEVEL EVENTS” you can see events using this

select * from sys.trigger_events

 

 

So after Creating a Trigger time to test the Trigger….

So we try first we try to create a table in the database and then after this we try to Drop that table ..so here it is…

 

-- Test Trigger
 
-- Create a table in Database
CREATE TABLE TestDDlTrigger (a int,b int,c int)
GO
 
-- Now Check our table which holds the data
select * from info_ddl
GO
 
-- Now we drop the table from Database
DROP TABLE TestDDlTrigger;
GO
 
-- Again check the data 
select * from info_ddl
GO

 

And here are the results

Result

 

So in this you can track on the DDL operations like Create and Drop Table in your database.

Additionally you can store T-SQL fired at that time for this you can add a column in your table  using alter table …

-- Adding additional column to table to store T-SQL
ALTER TABLE info_ddl ADD TSQL VARCHAR(2000);
GO

 

then you have to Drop the existing trigger and create a new one here it is…

-- Drop Trigger
DROP TRIGGER ddl_test
ON DATABASE;
GO
 
-- Again Creating a Trigger
CREATE TRIGGER ddl_test 
ON DATABASE 
FOR DDL_DATABASE_LEVEL_EVENTS 
AS
INSERT info_ddl 
   (PostTime, DB_User, Event, TSQL) 
   VALUES 
   (GETDATE(), 
   CONVERT(nvarchar(100), CURRENT_USER), 
   EVENTDATA().value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'), 
   EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)') ) ;
GO

So in this you get T-SQL in your table..

 

You can also look at the Events for triggers in SQL Server 2008 by..

-- Exploring Trigger Events
select * from sys.trigger_events

Thanks And Happy Querying..

If you like this article,  Subscribe in a reader or Subscribe by Email. Show your support by sharing this article with your friends through the services given below.

Share

Copyright © Beyondrelational.com