我需要確定MS SQL Server上的數據庫是否在兩個不同的時刻之間發生了變化。如何確定數據庫是否已更改?
更改可以是結構或數據相關的,檢查應該是通用的(即獨立於數據庫的結構)。 最好,我想檢查是基於T-SQL或SMO,而不是基於文件。我檢查了MSDN,但迄今爲止我還沒有發現任何相關信息。
我需要確定MS SQL Server上的數據庫是否在兩個不同的時刻之間發生了變化。如何確定數據庫是否已更改?
更改可以是結構或數據相關的,檢查應該是通用的(即獨立於數據庫的結構)。 最好,我想檢查是基於T-SQL或SMO,而不是基於文件。我檢查了MSDN,但迄今爲止我還沒有發現任何相關信息。
我們實際上使用SQL Compare,它是一個非常好的產品。但在這裏,我的意思是編程式的,無論是在T-SQL中還是在使用SMO的應用程序服務器上。 – Locksfree 2010-03-24 12:15:26
對於結構性更改,您可能需要考慮使用DDL triggers或Service Broker在您的服務器上記錄DDL事件。然而,除非你有比較的東西,否則識別數據變化可能要難得多。我可以認爲Database Snapshot是一個可能的解決方案(需要企業版)。
對於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
爲你描述的情況可能的解決方案是讀取數據庫事務日誌(一個LDF文件)。在數據庫事務日誌中記錄對數據庫提交的模式或數據級別的任何更改。現在,如何讀取t日誌中的信息?
您可以使用原生的SQL Server功能fn_dblog,DBCC PAGE或fn_dump_dblog或一些第三方工具。但是,原生函數沒有記錄,很難理解它們提供的結果。至於第三方工具,你可以查詢詳細的什麼需要讀取事務日誌信息
免責聲明Open LDF file and view LDF file content網上的文章,更深入的分析:我作爲ApexSQL
產品支持工程師工作
像任何變化一樣變化嗎?您可以檢查交易編號。 – TomTom 2010-03-24 12:10:15
是的,喜歡任何改變。任何表或更改表中的插入/更新/刪除都會更改索引等。時間戳/ rowid的種類,但是對於整個數據庫。 – Locksfree 2010-03-24 12:13:42
檢查問題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