使用SQL Server 2008存档生产数据库插入/更新

问题描述:

我在第二个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

如果他们是在同一个数据库实例,一个触发器将假定它没有很多的表是微不足道的。

如果这个增长的大小,你可能会想看看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

如果您正在考虑为此使用触发器,那么您可能需要考虑生产数据库的负载大小。如果它是非常密集的数据库,请考虑使用一些高可用性解决方案,例如复制或镜像或日志传送。根据您的需求,任何一种解决方案都可以为您提供正确的服务。 同时,您应该考虑您的“冷”恢复解决方案,这需要根据您的实施情况进行更改。

复制也会复制您的删除。但是,不删除存档数据库中的删除可能会导致唯一索引中出现问题,其中值在生产数据库中有效,但在归档数据库中无效,因为这些值已在那里存在。如果您的设计意味着,这不是一个问题,那么在制作表格的简单触发器会为你做这一点:

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一旦完成。