-- ============================================= -- Author: sqlforge.blogspot.com -- Create date: 20141008 -- Description: audit ddl changes -- compatible SQL Server 2005+ -- ============================================= USE [master] GO IF EXISTS (SELECT TOP 1 1 FROM [master].[sys].[server_triggers] WITH (NOLOCK) WHERE parent_class_desc = 'SERVER' AND name = N'tr_ObjectChangeAudit') -- sql server 2005+ DISABLE TRIGGER [tr_ObjectChangeAudit] ON ALL SERVER GO IF EXISTS (SELECT TOP 1 1 FROM sysobjects WITH (NOLOCK) WHERE TYPE = 'U' AND name = 'changelog') BEGIN PRINT 'master.dbo.changelog exists, check to be sure no differences in table from older version' END ELSE BEGIN CREATE TABLE [dbo].[changelog]( [id] [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, [loginname] [varchar](256) NOT NULL ) ALTER TABLE [dbo].[changelog] ADD CONSTRAINT [df_changelog_eventdate] DEFAULT (getdate()) FOR [eventdate] END GO IF EXISTS (SELECT * FROM sys.objects WITH (NOLOCK) WHERE type = 'P' AND name = 'sp_ObjectChangeAudit' ) DROP PROCEDURE [dbo].[sp_ObjectChangeAudit] GO -- ============================================= -- Author: sqlforge.blogspot.com -- Create date: 20141008 -- Description: audit ddl changes -- ============================================= CREATE PROCEDURE [dbo].[sp_ObjectChangeAudit] ( @databasename varchar(256) , @eventtype varchar(50) , @objectname varchar(256) , @objecttype varchar(25) , @sqlcommand varchar(max) , @loginname varchar(256) ) AS BEGIN SET NOCOUNT ON; INSERT INTO [master].[dbo].[changelog] ( databasename , eventtype , objectname , objecttype , sqlcommand , loginname ) VALUES ( @databasename , @eventtype , @objectname , @objecttype , @sqlcommand , @loginname ) END --sp_ObjectChangeAudit GO IF EXISTS (SELECT TOP 1 1 FROM [master].[sys].[server_triggers] WITH (NOLOCK) WHERE parent_class_desc = 'SERVER' AND name = N'tr_ObjectChangeAudit') -- sql server 2005+ DISABLE TRIGGER [tr_ObjectChangeAudit] ON ALL SERVER GO IF EXISTS (SELECT TOP 1 1 FROM [master].[sys].[server_triggers] WITH (NOLOCK) WHERE parent_class_desc = 'SERVER' AND name = N'tr_ObjectChangeAudit') -- sql server 2005+ DROP TRIGGER [tr_ObjectChangeAudit] ON ALL SERVER GO -- ============================================= -- Author: sqlforge.blogspot.com -- Create date: 20141008 -- Description: audit ddl changes -- ============================================= CREATE TRIGGER [tr_ObjectChangeAudit] ON ALL SERVER WITH EXECUTE AS 'sa' FOR create_procedure, alter_procedure, drop_procedure, create_table, alter_table, drop_table, create_function, alter_function, drop_function AS DECLARE @databasename varchar(256) , @eventtype varchar(50) , @objectname varchar(256) , @objecttype varchar(25) , @sqlcommand varchar(max) , @loginname varchar(256) BEGIN SET NOCOUNT ON; SET ANSI_PADDING ON; DECLARE @data xml SET @data = eventdata() SELECT @databasename = @data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'varchar(256)') , @eventtype = @data.value('(/EVENT_INSTANCE/EventType)[1]', 'varchar(50)') , @objectname = @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(256)') , @objecttype = @data.value('(/EVENT_INSTANCE/ObjectType)[1]', 'varchar(25)') , @sqlcommand = @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'varchar(max)') , @loginname = @data.value('(/EVENT_INSTANCE/LoginName)[1]', 'varchar(256)') BEGIN TRY EXEC [master].[dbo].[sp_ObjectChangeAudit] @databasename , @eventtype , @objectname , @objecttype , @sqlcommand , @loginname END TRY BEGIN CATCH PRINT 'SERVER TRIGGER tr_ObjectChangeAudit ' + ERROR_MESSAGE(); END CATCH END --tr_ObjectChangeAudit GO DISABLE TRIGGER [tr_ObjectChangeAudit] ON ALL SERVER GO ENABLE TRIGGER [tr_ObjectChangeAudit] ON ALL SERVER GO /***************************** IF EXISTS ( SELECT TOP 1 1 FROM sysobjects WHERE type = 'P' AND name = 'TESTME_01234' ) DROP PROCEDURE TESTME_01234 GO CREATE PROCEDURE TESTME_01234 AS BEGIN SELECT 1; END GO DROP PROCEDURE TESTME_01234 GO SELECT * FROM master.dbo.changelog ORDER BY eventdate DESC GO ****************************************/