【问题标题】:Should I use SQL Server triggers for migrating a database?我应该使用 SQL Server 触发器来迁移数据库吗?
【发布时间】:2021-08-25 05:05:06
【问题描述】:

我需要将任何东西从 SQL Server 迁移到 MongoDB。

SQL Server 不断插入、更新、删除数据,我想将这些数据移动到 MongoDB。

示例触发器:

BEGIN
BEGIN TRY
BEGIN TRAN
    DECLARE @tableName VARCHAR(50) = 'AutoPushData_OK'
    DECLARE @event_type varchar(42)
    IF EXISTS(SELECT * FROM inserted)
        IF EXISTS(SELECT * FROM deleted)
            SELECT @event_type = 'update'
    ELSE
            SELECT @event_type = 'insert'
    ELSE
        IF EXISTS(SELECT * FROM deleted)
            SELECT @event_type = 'delete'
        ELSE
            SELECT @event_type = 'unknown'

    IF @event_type ='insert' or @event_type = 'update'
    BEGIN
        INSERT INTO ReplicationData.dbo.MigrateData (JsonData, TableName, CRUD)
            SELECT
                (SELECT * FROM inserted FOR JSON AUTO), 
                @tableName, @event_type
    END
    ELSE IF @event_type = 'delete'
    BEGIN
        INSERT INTO ReplicationData.dbo.MigrateData (JsonData, TableName, CRUD)
            SELECT 
                (SELECT * FROM deleted FOR JSON AUTO),
                @tableName, @event_type
    END

    COMMIT TRAN
END TRY
BEGIN CATCH
    DECLARE @ErrorMsg VARCHAR(MAX), 
            @ErrorNumber INT, 
            @ErrorProc sysname, 
            @ErrorLine INT 

    SELECT 
        @ErrorMsg = ERROR_MESSAGE(), 
        @ErrorNumber = ERROR_NUMBER(), 
        @ErrorProc = ERROR_PROCEDURE(), 
        @ErrorLine = ERROR_LINE();

    ROLLBACK TRAN;

    INSERT INTO ErrorLog (ErrorMsg,  ErrorNumber,  ErrorProc,  ErrorLine)
    VALUES               (@ErrorMsg, @ErrorNumber, @ErrorProc, @ErrorLine)
END CATCH 
END

我会将表 AutoPushData_OK 的所有更改插入到 dbo.MigrateData 并使用服务将数据从 dbo.MigrateData 插入到 MongoDB。

问题:我这样做有什么危险吗?

有没有更好的办法?

谢谢

【问题讨论】:

  • 有点见仁见智。你的 json 在同一个“CRUD”blob 中包含多行,你还好吗?您是否考虑过对原始应用程序性能的影响?如果答案是“是”和“是”,那么可以肯定,这将起作用。 SymmetricDS 工具使用这种方法。如果担心对原始系统性能的影响,您可能希望将 SQL 更改数据捕获视为行源,但这确实会增加复杂性。
  • 我不知道你的要求,但你为什么不使用Temporal Table
  • 我不认为有任何真正的“危险”,但很好奇,您打算如何确保 Mongo 中的数据与 SQL 中的数据一致?我假设您使用 dbo.MigrateData 作为队列,并在处理后从中清除记录。如果是这种情况,我将在表中包含更多元数据,例如 ID,也许还有时间戳,因此如果 Mongo 端出现故障,则有一种解决方法。也许是软删除,每 10 天左右清除一次。我不知道你的要求的细节,但我想我会提供这个。

标签: sql-server mongodb triggers


【解决方案1】:

一般来说,如果可以,请避免使用触发器。尤其是这种类型的数据迁移,在运行速度上会非常低效(生产数据库的额外负载)。

SQL Server 具有用于维护数据库副本的特殊工具 - 数据库镜像。您可以找到更多信息here

我的建议是,您首先将数据迁移到第二个 SQL Server 数据库(数据库镜像),然后再从那里迁移到 MongoDB(如果需要,也可以使用触发器)。多亏了这一点,您将获得更接近异步数据交换的东西,这不会给生产数据库带来太多触发器负担。 SQL Server 数据库将以自己的方式交换数据,而不会中断主系统。

【讨论】:

    【解决方案2】:

    您不会遇到任何问题。但始终建议避免在多个表中使用相同的数据。

    【讨论】:

    • 将数据副本保存在运行在不同基础架构上的位置是完全正确的,并且可以在需要时快速插入生产。
    猜你喜欢
    • 2010-12-04
    • 2014-06-15
    • 2012-07-07
    • 1970-01-01
    • 2018-04-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多