Schema使用t-sql更改历史记录

时间:2015-03-30 07:22:15

标签: sql sql-server sql-server-2008

是否有任何DMV或查询来跟踪sql server 2008r2上对象的ddl更改,其中包含 USER LOGINNAME SERVERNAME 谁改变了特定的对象

我正在尝试创建包含此功能的监控工具。 请帮忙!

非常感谢!

1 个答案:

答案 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中将记录任何更改。