如何使用副本 activity 中的预复制脚本根据源中的更改跟踪 table 删除接收器中的记录?

How to use the pre-copy script from the copy activity to remove records in the sink based on the change tracking table from the source?

我正在尝试使用更改跟踪将数据从 SQL 服务器增量复制到 Azure SQL 数据库。我遵循了 Microsoft Azure 文档中的 tutorial,但在为大量 table 实施此操作时,我 运行 遇到了一些问题。

在副本的源代码部分 activity 我可以使用一个查询来更改 table 自上次更改跟踪版本以来更新、插入或删除的所有记录。这个 table 看起来像

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

PersonID 是此 table 的主键。

问题是副本 activity 只能将数据附加到 Azure SQL 数据库,因此当更新记录时,由于主键重复,会出现错误。我可以通过让副本 activity 使用将数据合并到 Azure SQL 数据库上的 table 中的存储过程来处理这个问题,但问题是我有大量table 秒。

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

您必须在复制 Activity 之前使用 LookUp activity。使用该 LookUp activity,您可以查询数据库,以便获得已删除和更新的 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})

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

希望对您有所帮助!

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

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

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

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

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