【问题标题】:Is there a way to force replication that replicate only inserted and updated data?有没有办法强制复制只复制插入和更新的数据?
【发布时间】:2010-02-22 08:24:28
【问题描述】:

我想要一个包含从最初到现在的所有数据的数据库版本。如果我使用 sql server 复制,我可以强制它忽略复制的删除操作吗?

【问题讨论】:

    标签: sql-server replication


    【解决方案1】:

    我不知道有这样的功能。

    如果有一个开箱即用,我会感到惊讶。如果用DELETEINSERT 代替UPDATE 会怎样?您的目标数据库将无法处理此类更改,因为它不会删除具有某些唯一标识符(列值)XXX 的行,然后会尝试插入具有此标识符的新行,从而导致unique key violation

    EDIT-1:如果您想要的是生产中的only-recent 数据库和用于审计的whole 数据库,那么也许您应该尝试不同的解决方案:

    1. 逻辑删除和视图:您更改 DELETE 逻辑(通过更改 DELETE 命令或使用 INSERT OF 触发器)以仅将行标记为已删除。然后,您创建一个视图,该视图基本上包含您的表,但仅过滤那些未删除的视图。改为针对此视图运行所有 SELECT/INSERT/UPDATE 查询。最后,在您当前的解决方案中,您确实会以某种方式将“已删除”记录标记为已删除,对吧?
    2. 审核表:将您的历史记录也保存在主数据库中,但保存在 AUDIT(影子)表中。同样,您可以使用 AFTER 触发器几乎非侵入式地执行此操作。

    【讨论】:

    • 我有一个有 400 个表的数据库。我不能在每张桌子上都设置触发器。
    • 我不认为表的数量会限制您对触发器的使用。使用很少的脚本,您可以自动创建这些触发器。但这更多是您设计的问题。一般来说,逻辑删除存在问题:您可能有从“活动”表/行到逻辑删除的 FK 约束,这不应该发生。但是您能否详细说明您通过这种复制尝试实现的目标?
    • 如果您不喜欢您的 PROD 数据库上的触发器,那么您不是只在 REPLICA 上拥有它们吗?这样您就可以不执行任何操作或将其标记为已删除,而不是 DELETE。
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      是的,你可以。如果您使用事务复制,您可以定义对您发布的表格文章的更新、删除和插入操作。

      编辑以添加更多细节:
      因此,在创建新的 Transactional Publication 时,在 Articles 步骤(图 1)下,您可以选择所有表和“Set Properties of All Table Articles”。 “Statement Delivery”(图 2)下的部分为 INSERTUPDATEDELETE 语句提供了“delivery formats”选项。您可以将格式设置为“不复制 DELETE 语句”,或者例如“调用 ”,它可以调用存储过程,在发布服务器上已删除的每一行上设置一个标志。

      图 1

      图 2

      参考 Hilary Cotter 的answer on MSDN

      【讨论】:

        猜你喜欢
        • 2012-07-01
        • 2021-10-26
        • 1970-01-01
        • 2021-04-29
        • 1970-01-01
        • 1970-01-01
        • 2015-02-12
        • 2016-01-11
        • 1970-01-01
        相关资源
        最近更新 更多