Reputation: 15
Is there any DMV or query to track the ddl changes to objects on sql server 2008r2 that incudes the LOGINNAME and SERVERNAME of the USER who altered the specific object
I'm trying to create a monitoring tool that includes this feature. Please help!
Thank you very much!
Upvotes: 0
Views: 2197
Reputation: 35780
You can create DDL
trigger for your database like:
CREATE TABLE [dbo].[ddl_log](
[data] [XML] NULL,
[systemuser] [NVARCHAR](255) NULL,
[hostname] [NVARCHAR](255) NULL,
[date] [DATETIME] NULL,
[EventType] [NVARCHAR](255) NULL,
[SPID] [SMALLINT] NULL,
[SchemaName] [NVARCHAR](255) NULL,
[ObjectName] [NVARCHAR](255) NULL,
[ObjectType] [NVARCHAR](255) NULL,
[CommandText] [NVARCHAR](MAX) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
CREATE TRIGGER [ddl_log_all]
ON DATABASE FOR DDL_DATABASE_LEVEL_EVENTS
AS
SET NOCOUNT ON
INSERT INTO ddl_log (data, systemuser, hostname, date, EventType, SPID, SchemaName, ObjectName, ObjectType, CommandText)
SELECT
EVENTDATA(), SYSTEM_USER, HOST_NAME(), GETDATE(),
EVENTDATA().value('(/EVENT_INSTANCE/EventType)[1]','nvarchar(max)'),
EVENTDATA().value('(/EVENT_INSTANCE/SPID)[1]','smallint'),
EVENTDATA().value('(/EVENT_INSTANCE/SchemaName)[1]','nvarchar(max)'),
EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(max)'),
EVENTDATA().value('(/EVENT_INSTANCE/ObjectType)[1]','nvarchar(max)'),
EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
GO
ENABLE TRIGGER [ddl_log_all] ON DATABASE
GO
Then any change will be logged in table ddl_log
.
Upvotes: 3