My company has just gone though its annual review process, and I have finally convinced them that it is time to find a better solution to manage our SQL schema/scripts. Cur
Here is my script to track stored proc and udf and triggers into a table.
Create a table to hold existing stored proc source code
INsert the table with all existing trigger and script data
Create a DDL trigger to monitor changes on them
/****** Object: Table [dbo].[sysupdatelog] Script Date: 9/17/2014 11:36:54 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[sysupdatelog] (
[id] [bigint] IDENTITY(1, 1) NOT NULL
,[UpdateUsername] [nvarchar](1000) NULL
,[actionname] [nvarchar](1000) NULL
,[objectname] [nvarchar](1000) NULL
,[type] [nvarchar](1000) NULL
,[createDate] [datetime] NULL
,[content] NTEXT NULL
,CONSTRAINT [PK_sysupdatelog] PRIMARY KEY CLUSTERED ([id] ASC) WITH (
PAD_INDEX = OFF
,STATISTICS_NORECOMPUTE = OFF
,IGNORE_DUP_KEY = OFF
,ALLOW_ROW_LOCKS = ON
,ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[sysupdatelog] ADD CONSTRAINT [DF__sysupdate__conte__4EDE7CE6] DEFAULT('')
FOR [content]
GO
INSERT INTO [dbo].[sysupdatelog] (
[UpdateUsername]
,[actionname]
,[objectname]
,[type]
,[createDate]
,[content]
)
SELECT 'sa'
,'loginitialdata'
,r.ROUTINE_NAME
,r.ROUTINE_TYPE
,GETDATE()
,r.ROUTINE_DEFINITION
FROM INFORMATION_SCHEMA.ROUTINES r
UNION
SELECT 'sa'
,'loginitialdata'
,v.TABLE_NAME
,'view'
,GETDATE()
,v.VIEW_DEFINITION
FROM INFORMATION_SCHEMA.VIEWS v
UNION
SELECT 'sa'
,'loginitialdata'
,o.NAME
,'trigger'
,GETDATE()
,m.DEFINITION
FROM sys.objects o
JOIN sys.sql_modules m ON o.object_id = m.object_id
WHERE o.type = 'TR'
GO
CREATE TRIGGER [SCHEMA_AUDIT] ON DATABASE
FOR CREATE_PROCEDURE
,ALTER_PROCEDURE
,DROP_PROCEDURE
,CREATE_INDEX
,ALTER_INDEX
,DROP_INDEX
,CREATE_TRIGGER
,ALTER_TRIGGER
,DROP_TRIGGER
,ALTER_TABLE
,ALTER_VIEW
,CREATE_VIEW
,DROP_VIEW AS
BEGIN
SET NOCOUNT ON
DECLARE @data XML
SET @data = Eventdata()
INSERT INTO sysupdatelog
VALUES (
@data.value('(/EVENT_INSTANCE/LoginName)[1]', 'nvarchar(255)')
,@data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(255)')
,@data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(255)')
,@data.value('(/EVENT_INSTANCE/ObjectType)[1]', 'nvarchar(255)')
,getdate()
,@data.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'nvarchar(max)')
)
SET NOCOUNT OFF
END
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
ENABLE TRIGGER [SCHEMA_AUDIT] ON DATABASE
GO