【问题标题】:SQL Custom Replication Via Triggers通过触发器的 SQL 自定义复制
【发布时间】:2010-07-13 22:57:40
【问题描述】:

正如我所见,SQL 2008 不再以非常简单的方法通过 Internet 提供复制。不仅如此,我可以看到合并复制方法在数据库中安装了太多的触发器和视图,并添加了名为“rowguid”的附加字段。

我们今天的可用磁盘空间比处理器速度还多。所以我决定为 SQL Server 编写我自己的通用复制。它需要以下步骤。

假设我的所有表都有一个主键(bigint 或 nvarchar(50))

Setup Table : SyncItems
SyncItemID  (Primary,AutoNumber)
SyncTable (nvarchar(50) name of table)
RowID (bigint)
RowIDStr (nvarchar(50))
RowOp (nvarchar(10), 'Inserted','Updated','Deleted')
RowTime (datetime, current_timestamp)

我可以在数据库的每个表上设置三个触发器,可以在 SyncItems 中插入一个项目来指定 DML。

现在所有的复制器,只能先扫描 SyncItems 并加载修改后的表行并在目的地更新。

问题:

  1. 我已经将数据库恢复模式设置为完整。是否有任何替代方法可以让我读取 DML 历史记录并进行复制而不是设置触发器?

  2. 事务日志的历史记录会保留多长时间?在基于触发器的自定义复制中,我可以删除旧记录并相应地截断表。

  3. 如果我可以读取事务日志并手动复制,那就太好了,因为我们甚至可以复制 DDL 事务。我尝试使用搜索各种存储过程并进行了足够的谷歌搜索,但没有找到任何提示。

  4. 是否有读取复制发布者日志的选项?这样我们就可以编写自己的复制代理来通过互联网复制数据,而不是使用 SQL Server 自己的复制?

(我尝试过网络同步和各种选项,但我们的数据量很大,使用网络同步并不实用)

【问题讨论】:

  • 从我在此处阅读的内容看来,您似乎假设触发器中一次只处理一行。确保您的触发器可以处理多行插入、更新、删除。
  • 是的,它们可以处理多行。

标签: sql-server tsql logging


【解决方案1】:

如果您使用的是 SQL Server 2008 EE,使用变更数据捕获会不会更容易?

我正在使用它来加载不同的数据库来分析数据随时间的变化,似乎工作正常。

【讨论】:

  • 我们只有SQL 2008标准版,无法升级,因为成本太高,而且我们使用标准版来存储用户文档,所以它们体积很大,但存储也很重要在数据库上。
【解决方案2】:

您是否考虑过日志传送?它可能会更简单地完成您想要的操作,并且只需稍做工作,您就可以通过 Internet 使其工作。

【讨论】:

  • 日志传送无法通过互联网进行,一切都只能通过局域网进行。如果我可以自己阅读日志并重建,那就太好了!
  • 确实,日志传送并非旨在通过 Internet 工作,但有一些方法可以使其工作。最直接的当然是设置一个合适的vpn,让windows把整个事情看成一个域,但是如果你愿意为某些部分编写自己的脚本也可以做到。
【解决方案3】:

我没有找到任何读取 SQL 日志的选项。但是,在完全恢复模式下,SQL 确实将整个事务日志存储到 SQL 日志中,但没有记录的读取方式。我们继续编写自己的复制方法,使用触发器填充 SyncItems 表!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-27
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多