带有差距的Azure数据工厂副本标识列

时间:2017-02-06 21:55:46

标签: sql-server azure-sql-database azure-data-factory

我创建了一个管道和两个链接服务,用于将数据从SQL Server的本地实例移动到Azure Sql实例。我遇到的问题是我们在本地有一个表“Table-1”,而Identity(1,1)列缺少一个顺序ID(例如值为1,2,3,4) ,6)。当管道运行时,它会尝试插入ID为1,2,3,4,5的行,这是一个很大的问题,因为ID 6是另一个表“Table-2”上的外键,现在它不存在,因此数据到表-2的移动失败,出现SQL错误547(插入语句与外键约束冲突......)。

在我看来,正确的做法是使该列不是一个标识,但这对我来说不是一个选项,因为创建记录的应用程序代码需要自动生成该列。

除了不使用Data Factory之外还有其他方法吗?我想看到它自动为具有Identity列的表打开和关闭identity_insert,虽然我知道这会强制这些表一次处理一个,该选项会很好,它不会破坏我的关系。 / p>

编辑:根据wBob的建议,我还在这里添加了一个功能请求(如果您需要投票):https://feedback.azure.com/forums/270578-data-factory/suggestions/17996950-add-support-for-maintaining-identity-column-values

3 个答案:

答案 0 :(得分:1)

Azure数据工厂本身不支持打开或关闭表的标识属性,但需要考虑两种解决方法。

  1. 使用Data Factory将数据加载到临时表(未设置identity属性),然后使用Stored Proc任务调用存储过程,您可以在其中进行更严格的控制,包括设置标识的能力财产开启或关闭。
  2. 如果您使用的是Azure SQL数据库(或VM上的SQL Server),则可以使用表值参数并将数据传递到存储的proc任务,从而跳过临时表。此技术不适用于Azure SQL数据仓库。我可能不会推荐这个用于高音量。这个example显示了如何:
  3. https://github.com/Microsoft/azure-docs/blob/master/includes/data-factory-sql-invoke-stored-procedure.md

    我无法测试这些,但相信它们会起作用。如果您有任何问题,请告诉我。

答案 1 :(得分:1)

我接受了wBob的回答,但想更详细地说明我的所作所为。

我可能有100个表可以移动各种依赖关系和身份。以下是我将数据导入azure的步骤:

  1. 创建一个管道来移动所有没有身份和没有依赖关系的表,通过查询sys.tables找到:

    select *
    from sys.tables t
    where not exists (
        select *
        from sys.columns c 
        where c.object_id = t.object_id
        and is_identity = 1
    )
    

    并将结果与​​sp_msdependencies的结果相对应,其中oType = 8.然后,我将这个结果集中的所有表都放在oSequence = 1(无依赖关系)中,并将这些表放在管道中跑了。

  2. 我创建了一个Staging模式,并使用标识列重新创建了所有表(通过删除(1.)中查询中的'not'找到它们,其中有超过60个)并删除创建它们时的身份规范。

  3. 然后,我创建了另一个数据工厂管道,将数据移动到这些临时表中。

  4. 抛出一堆'insert into ...'语句,将数据从登台表移动到他们的身份识别对应物中,每次都打开和关闭identity_insert。注意:在这里,我还必须注意sp_msdependencies结果,以免出现外来错误

  5. 创建数据工厂管道以移动剩余的表。

  6. 嗯...

答案 2 :(得分:0)

今天在处理 2500 万行数据集时遇到了这个问题,因此真的很想进行 Ident 插入,而不是通过另一个表进行暂存。

在复制数据(接收器/预复制脚本)步骤中添加: 设置 identity_insert [schema].[table] on

在以下之后立即添加查找: 设置 identity_insert [schema].[table] off 选择 1 作为结果集

您需要结果,因为它是一个查找,不要忘记,您一次只能运行这些步骤之一,因为 Ident 插入一次只能在一张表上,除非有人会告诉我使用 SQL 2005 :-)

相关问题