2012-04-05 104 views
0

我在第二個SQL Server實例中有生產數據庫和存檔數據庫。使用SQL Server 2008存檔生產數據庫插入/更新

當我在生產數據庫中插入或更新(NOT DELETE)數據時,需要在存檔數據庫中插入或更新相同的數據。

這樣做的好方法是什麼?

感謝

+0

在檔案db ON AFTER INSERT上寫入觸發器到產品db – Teja 2012-04-05 19:09:32

+0

@Vutukuri如果他的數據庫中有很多事務處理,該怎麼辦?觸發是否是正確的解決方案? – rvphx 2012-04-05 20:55:10

回答

1

如果他們是在同一個數據庫實例,一個觸發器將假定它沒有很多的表是微不足道的。

如果這個增長的大小,你可能會想看看SQL Server複製。微軟花了很多時間和金錢來做正確的事情。

+0

我不想從數據庫生產中刪除的數據從存檔數據庫中刪除,我可以使用複製嗎? – Maxime 2012-04-05 19:26:21

+0

正確。您可以設置單向複製,生產 - >存檔。存檔數據的更改不會影響生產。 – 2012-04-05 20:26:43

+0

如果我刪除生產數據庫中的條目,我需要將此條目保留在存檔中。生產數據庫中所有表格的數據將在每天開始時被刪除......它是這樣做的嗎? – Maxime 2012-04-05 20:41:48

0

如果您正在考慮爲此使用觸發器,那麼您可能需要考慮生產數據庫的負載大小。如果它是非常密集的數據庫,請考慮使用一些高可用性解決方案,例如複製或鏡像或日誌傳送。根據您的需求,任何一種解決方案都可以爲您提供正確的服務。 同時,您應該考慮您的「冷」恢復解決方案,這需要根據您的實施情況進行更改。

0

複製也會複製您的刪除。但是,不刪除存檔數據庫中的刪除可能會導致唯一索引中出現問題,其中值在生產數據庫中有效,但在歸檔數據庫中無效,因爲這些值已在那裏存在。如果您的設計意味着,這不是一個問題,那麼在製作表格的簡單觸發器會爲你做這一點:

CREATE TRIGGER TR_MyTable_ToArchive ON MyTable FOR INSERT, UPDATE AS 
BEGIN 
    SET ROW_COUNT OFF 
    -- First inserts 
    SET IDENTITY_INSERT ArchiveDB..MyTable ON -- Only if identity column is used 
    INSERT INTO ArchiveDB..MyTable(MyTableKey, Col1, Col2, Col3, ...) 
    SELECT MyTableKey, Col1, Col2, Col3, ... 
    FROM inserted i LEFT JOIN deleted d ON i.MyTableKey = d.MyTableKey 
    WHERE d.MyTableKey IS NULL 
    SET IDENTITY_INSERT ArchiveDB..MyTable OFF -- Only if identity column is used 

    -- then updates 
    UPDATE t SET Col1 = i.col1, col2 = i.col2, col3 = i.col3, ... 
    FROM ArchiveDB..MyTable t INNER JOIN inserted i ON t.MyTableKey = i.MyTableKey 
     INNER JOIN deleted d ON i.MyTableKey = d.MyTableKey 
END 

這是假設你的檔案數據庫駐留在同一臺服務器上的生產數據庫。如果不是這種情況,則需要創建鏈接服務器條目,然後用ArchiveServer.ArchiveDB..MyTable替換ArchiveDB..MyTable,其中ArchiveServer是鏈接服務器的名稱。

但是,如果您的生產數據庫中有很多負載,請記住這會使其翻一番。爲了避免這種情況,您可以在每個表中添加一個更新標誌字段,並在數據庫負載最小時(例如凌晨1點)運行計劃任務。然後,您的觸發器將字段設置爲I(對於插入)或U(對於生產數據庫中的更新),並且計劃的任務將執行更新或插入存檔數據庫(取決於此字段的值),然後重置字段到NULL一旦完成。

相關問題