使用Azure Data Factory重复写入SQL Sink失败

时间:2019-07-22 17:57:39

标签: azure-sql-database azure-table-storage azure-data-factory

方案:我正在使用如下所示的upsert存储过程将数据从Azure表存储复制到Azure SQL数据库:

CREATE PROCEDURE [dbo].[upsertCustomer] @customerTransaction dbo.CustomerTransaction READONLY
AS
BEGIN
    MERGE customerTransactionstable WITH (HOLDLOCK) AS target_sqldb
    USING @customerTransaction AS source_tblstg
    ON (target_sqldb.customerReferenceId = source_tblstg.customerReferenceId AND
        target_sqldb.Timestamp = source_tblstg.Timestamp)
    WHEN MATCHED THEN
        UPDATE SET
            AccountId = source_tblstg.AccountId,
            TransactionId = source_tblstg.TransactionId,
            CustomerName = source_tblstg.CustomerName
    WHEN NOT MATCHED THEN
        INSERT (
            AccountId,
            TransactionId,
            CustomerName,
            CustomerReferenceId,
            Timestamp
            )
        VALUES (
            source_tblstg.AccountId,
            source_tblstg.TransactionId,
            source_tblstg.CustomerName,
            source_tblstg.CustomerReferenceId,
            source_tblstg.Timestamp
            );
END

GO

其中 customerReferenceId Timestamp 构成 CustomerTransactionstable

的组合键

但是,当我更新源(Azure表)中的行并重新运行Azure数据工厂时,会看到此错误:

  

“ ErrorCode = FailedDbOperation,'Type = Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message = A   数据库操作失败,并出现以下错误:'违反   主键约束'PK_CustomerTransactionstable'。   无法在对象中插入重复键   'dbo.CustomerTransactionstable'。重复的键值为   (1990年12月31日,上午12:49,ABCDEFGHIGK)。\ r \ n声明已   已终止。',Source = .Net SqlClient数据   Provider,SqlErrorNumber = 2627,Class = 14,ErrorCode = -2146232060,State = 1,Errors = [{Class = 14,Number = 2627,State = 1,Message =违反   KEY约束'PK_CustomerTransactionstable'的结果“”

现在,我已验证源和接收器中只有一行具有匹配的主键,唯一的区别是源行中的某些列已更新。

Azure文档中的此{​​{3}}涉及可重复复制,但是我不想在插入任何数据之前从目的地删除该时间段内的行,也不能添加新的sliceIdentifierColumn到我现有的表或任何架构更改。

问题

  1. 我的upsert逻辑有问题吗?如果是,是否有更好的方法对Azure SQL数据库进行上升级?
  2. 如果我选择使用SQL清理脚本,是否可以从接收器中仅删除那些与主键匹配的行?

修改

  

此问题现已解决。

解决方案

  

仅在试图插入主键时才会发生主键冲突   记录已具有匹配的主键。就我而言   尽管水槽里只有一个记录,但条件是   合并由于不匹配而无法满足   在 datetime datetimeoffset 字段之间。

1 个答案:

答案 0 :(得分:0)

您是否尝试过将ADF数据流与映射数据流一起使用,而不是通过SPROC对其进行编码?对于使用SQL的专家来说,它可能要容易得多。

通过Alter Row转换,您可以通过UI设置执行Upsert,Update,Delete,Insert并选择PK:https://docs.microsoft.com/en-us/azure/data-factory/data-flow-alter-row

您仍然只需要在“数据流”活动之前执行“复制”活动即可从表存储中复制数据。将其放在Blob文件夹中,然后数据流可以从中读取源。