我在第二個SQL Server實例中有生產數據庫和存檔數據庫。使用SQL Server 2008存檔生產數據庫插入/更新
當我在生產數據庫中插入或更新(NOT DELETE)數據時,需要在存檔數據庫中插入或更新相同的數據。
這樣做的好方法是什麼?
感謝
我在第二個SQL Server實例中有生產數據庫和存檔數據庫。使用SQL Server 2008存檔生產數據庫插入/更新
當我在生產數據庫中插入或更新(NOT DELETE)數據時,需要在存檔數據庫中插入或更新相同的數據。
這樣做的好方法是什麼?
感謝
如果他們是在同一個數據庫實例,一個觸發器將假定它沒有很多的表是微不足道的。
如果這個增長的大小,你可能會想看看SQL Server複製。微軟花了很多時間和金錢來做正確的事情。
如果您正在考慮爲此使用觸發器,那麼您可能需要考慮生產數據庫的負載大小。如果它是非常密集的數據庫,請考慮使用一些高可用性解決方案,例如複製或鏡像或日誌傳送。根據您的需求,任何一種解決方案都可以爲您提供正確的服務。 同時,您應該考慮您的「冷」恢復解決方案,這需要根據您的實施情況進行更改。
複製也會複製您的刪除。但是,不刪除存檔數據庫中的刪除可能會導致唯一索引中出現問題,其中值在生產數據庫中有效,但在歸檔數據庫中無效,因爲這些值已在那裏存在。如果您的設計意味着,這不是一個問題,那麼在製作表格的簡單觸發器會爲你做這一點:
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
一旦完成。
在檔案db ON AFTER INSERT上寫入觸發器到產品db – Teja 2012-04-05 19:09:32
@Vutukuri如果他的數據庫中有很多事務處理,該怎麼辦?觸發是否是正確的解決方案? – rvphx 2012-04-05 20:55:10