-- =============================================
-- 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
****************************************/