7

我正在尝试使用更改跟踪将数据从 SQL Server 增量复制到 Azure SQL 数据库。我按照教程进行操作,但在为大量表实施此操作时遇到了一些问题。

在复制活动的源部分中,我可以使用一个查询,该查询为我提供了自上次更改跟踪版本以来更新、插入或删除的所有记录的更改表。这张桌子看起来像

PersonID   Age    Name   SYS_CHANGE_OPERATION
---------------------------------------------
1          12     John   U
2          15     James  U
3          NULL   NULL   D
4          25     Jane   I

PersonID 是该表的主键。

问题是复制活动只能将数据附加到 Azure SQL 数据库,因此当更新记录时,由于主键重复,它会出错。我可以通过让复制活动使用将数据合并到 Azure SQL 数据库上的表中的存储过程来解决此问题,但问题是我有大量表。

我希望预复制脚本删除 Azure SQL 数据库上已删除和更新的记录,但我不知道如何执行此操作。我是否需要为要复制的每个表创建单独的存储过程和相应的表类型,或者预复制脚本是否可以根据更改跟踪表删除记录?

4

2 回答 2

9

您必须在复制活动之前使用查找活动。通过该查找活动,您可以查询数据库,以便获得已删除和更新的 PersonID,最好全部在一个字段中,用逗号分隔(因此在预复制脚本中更易于使用)。更多信息在这里:https ://docs.microsoft.com/en-us/azure/data-factory/control-flow-lookup-activity

然后,您可以在预复制脚本中执行以下操作:

delete from TableName where PersonID in (@{activity('MyLookUp').output.firstRow.PersonIDs})

这样,您将在插入新行之前删除所有已删除或更新的行。

希望这有帮助!

于 2018-05-30T16:49:02.693 回答
0

同时 Azure 数据工厂提供元数据驱动的复制任务。在完成对话驱动设置后,将创建一个元数据表,其中每个数据集都有一行要同步。我通过为要同步的每个数据集添加一个存储过程和一个表类型来解决这个 UPSERT 问题。然后我像这样在元数据表中为每一行添加了相关信息

    {
            "preCopyScript": null,
            "tableOption": "autoCreate",
            "storedProcedure": "schemaname.UPSERT_SHOP_SP",
            "tableType": "schemaname.TABLE_TYPE_SHOP",
            "tableTypeParameterName": "shops"
    }

之后,您需要像这样调整复制任务的接收器属性(存储过程、表类型、表类型参数名称):

@json(item().CopySinkSettings).storedProcedure
@json(item().CopySinkSettings).tableType
@json(item().CopySinkSettings).tableTypeParameterName

如果目标表不存在,则需要在添加上述变量之前运行整个任务一次,因为只有在接收器属性中没有给出存储过程时,表的自动创建才有效。

于 2021-11-09T11:00:21.040 回答