如何确定数据库是否已更改?

时间:2010-03-24 12:08:28

标签: sql-server database

我需要确定MS SQL Server上的数据库是否在两个不同时刻之间发生了变化。

更改可以是结构性的或与数据相关的,并且检查应该是通用的(即独立于数据库的结构)。 我希望检查是基于T-SQL或SMO,而不是基于文件。我在MSDN上查了但到目前为止我还没有找到任何相关内容。

4 个答案:

答案 0 :(得分:3)

您描述的方案的可能解决方案是读取数据库事务日志(LDF文件)。在针对数据库提交的架构或数据级别上的任何更改都记录在数据库事务日志中。现在,如何阅读t-log中的信息?

您可以使用本机SQL Server函数 fn_dblog DBCC PAGE fn_dump_dblog 或某些第三方工具。但是,本机功能没有记录,很难理解它们提供的结果。对于第三方工具,您可以查看 Open LDF file and view LDF file content 在线文章,了解更多详细信息,并深入分析阅读事务日志信息所需的内容

免责声明:我在ApexSQL担任产品支持工程师

答案 1 :(得分:2)

对于SQL Server 2005及更高版本,您可以添加DDL触发器,例如:

CREATE TRIGGER [YourDatabaseTrigger]
ON DATABASE
FOR DDL_EVENTS
AS

DECLARE @EventData      xml
DECLARE @Message        varchar(1000)
SET @EventData=EVENTDATA()

INSERT INTO YourLogTable 
    (EventDateTime,EventDescription) 
    VALUES (GETDATE(),SUSER_NAME()
                     +'; '+@EventData.value('(/EVENT_INSTANCE/ObjectType)[1]', 'varchar(250)')
                     +'; '+@EventData.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(250)')
                     +'; '+@EventData.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
           )
RETURN
GO

ENABLE TRIGGER [YourDatabaseTrigger] ON DATABASE

然后,您需要在数据库中的每个表上创建一个触发器(对于INSERT / UPDATE / DELETE),该表将插入到同一个表中:

CREATE TRIGGER YourTableTrigger On YourTable
FOR INSERT
AS

INSERT INTO YourLogTable 
    (EventDateTime,EventDescription) 
    SELECT GETDATE(),SUSER_NAME()
                     +'; INSERT YourTable'+
                     +'; data='+...your column data here...
    FROM INSERTED
GO

答案 2 :(得分:1)

Red Gate制作了两款您可能感兴趣的产品:

他们可以将当前版本的数据库与备份副本进行比较,并分别查找架构或数据中的更改。

答案 3 :(得分:1)

对于结构更改,您可能希望考虑使用DDL triggersService Broker在服务器上记录DDL事件。但是,除非您需要进行比较,否则识别数据更改可能要难得多。我可以将Database Snapshot视为可能的解决方案(需要企业版)。