是否有任何DMV或查询来跟踪sql server 2008r2上对象的ddl更改,其中包含 USER 的 LOGINNAME 和 SERVERNAME 谁改变了特定的对象
我正在尝试创建包含此功能的监控工具。 请帮忙!
非常感谢!
答案 0 :(得分:3)
您可以为数据库创建DDL
触发器,如:
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
然后表ddl_log
中将记录任何更改。