2010-03-24 104 views
4

我需要確定MS SQL Server上的數據庫是否在兩個不同的時刻之間發生了變化。如何確定數據庫是否已更改?

更改可以是結構或數據相關的,檢查應該是通用的(即獨立於數據庫的結構)。 最好,我想檢查是基於T-SQL或SMO,而不是基於文件。我檢查了MSDN,但迄今爲止我還沒有發現任何相關信息。

+0

像任何變化一樣變化嗎?您可以檢查交易編號。 – TomTom 2010-03-24 12:10:15

+0

是的,喜歡任何改變。任何表或更改表中的插入/更新/刪除都會更改索引等。時間戳/ rowid的種類,但是對於整個數據庫。 – Locksfree 2010-03-24 12:13:42

+0

檢查問題http://stackoverflow.com/questions/2423909/is-there-meta-data-i-can-read-from-sql-server-to-know-the-last-changed-row-table/2424035 #2424035 – Andrew 2010-03-24 12:28:55

回答

1

紅門使您可能感興趣的兩個產品:

他們可以用備份副本比較數據庫的當前版本,並找到在架構更改或數據。

+0

我們實際上使用SQL Compare,它是一個非常好的產品。但在這裏,我的意思是編程式的,無論是在T-SQL中還是在使用SMO的應用程序服務器上。 – Locksfree 2010-03-24 12:15:26

1

對於結構性更改,您可能需要考慮使用DDL triggersService Broker在您的服務器上記錄DDL事件。然而,除非你有比較的東西,否則識別數據變化可能要難得多。我可以認爲Database Snapshot是一個可能的解決方案(需要企業版)。

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() 
        +'; '[email protected]('(/EVENT_INSTANCE/ObjectType)[1]', 'varchar(250)') 
        +'; '[email protected]('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(250)') 
        +'; '[email protected]('(/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 
3

爲你描述的情況可能的解決方案是讀取數據庫事務日誌(一個LDF文件)。在數據庫事務日誌中記錄對數據庫提交的模式或數據級別的任何更改。現在,如何讀取t日誌中的信息?

您可以使用原生的SQL Server功能fn_dblogDBCC PAGEfn_dump_dblog或一些第三方工具。但是,原生函數沒有記錄,很難理解它們提供的結果。至於第三方工具,你可以查詢詳細的什麼需要讀取事務日誌信息

免責聲明Open LDF file and view LDF file content網上的文章,更深入的分析:我作爲ApexSQL

產品支持工程師工作
相關問題