使用SQL Server 2008存档生产数据库插入/更新
我在第二个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