Logging schema changes (DDL) in the database is a common requirement in many organizations or development teams. We can choose from many tools offering complex auditing or write our solution. Let’s build our one and keep it as simple as possible. Please remember that the event log can be manipulated by everyone with access to the database and this solution isn’t suitable for security compliant auditing.
Our solution is based on a DDL trigger. You can read more about it in BOL.
Create table [dbo].[DDLEventLog] where logged events will be stored. Create trigger [trg_DatabaseDDLeventer] which will fire on all database level DDL events ( DDL_DATABASE_LEVEL_EVENTS) and store event detail in XML format to [dbo].[DDLEventLog] table.
-- Create events table CREATE TABLE [dbo].[DDLEventLog] ( [Id] INT IDENTITY(1,1) PRIMARY KEY, [EventDate] DATETIME, [Originator] NVARCHAR(256), [EventXML] XML ) GO -- Create trigger SET ANSI_NULLS, QUOTED_IDENTIFIER ON GO CREATE TRIGGER [trg_DatabaseDDLeventer] ON DATABASE FOR DDL_DATABASE_LEVEL_EVENTS AS BEGIN INSERT INTO [dbo].[DDLEventLog] ([EventDate], [Originator], [EventXML]) VALUES (GETDATE(), USER_NAME(), EVENTDATA()) END GO
We will run the DDL statement CREATE TABLE to test how it works.
-- Create sample DDL event to test trigger CREATE TABLE [dbo].[TestTable] ([Id] int) GO -- Get results SELECT * FROM [DDLEventLog] GO
If we will click on the link in EventXML column we can observe message details and identify who executed which DDL statement:
<EVENT_INSTANCE> <EventType>CREATE_TABLE</EventType> <PostTime>2010-07-11T10:55:04.710</PostTime> <SPID>51</SPID> <ServerName>TESTSERVER</ServerName> <LoginName>TESTSERVER\Admin</LoginName> <UserName>dbo</UserName> <DatabaseName>master</DatabaseName> <SchemaName>dbo</SchemaName> <ObjectName>TestTable</ObjectName> <ObjectType>TABLE</ObjectType> <TSQLCommand> <SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE" /> <CommandText>CREATE TABLE dbo.TestTable (Id int)</CommandText> </TSQLCommand> </EVENT_INSTANCE>
If you would like to implement a more robust and security compliant solution then please review SQL Server Audit functionality for more details.