我创建了一个管道和两个链接服务,用于将数据从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
答案 0 :(得分:1)
Azure数据工厂本身不支持打开或关闭表的标识属性,但需要考虑两种解决方法。
我无法测试这些,但相信它们会起作用。如果您有任何问题,请告诉我。
答案 1 :(得分:1)
我接受了wBob的回答,但想更详细地说明我的所作所为。
我可能有100个表可以移动各种依赖关系和身份。以下是我将数据导入azure的步骤:
创建一个管道来移动所有没有身份和没有依赖关系的表,通过查询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(无依赖关系)中,并将这些表放在管道中跑了。
我创建了一个Staging模式,并使用标识列重新创建了所有表(通过删除(1.)中查询中的'not'找到它们,其中有超过60个)并删除创建它们时的身份规范。
然后,我创建了另一个数据工厂管道,将数据移动到这些临时表中。
抛出一堆'insert into ...'语句,将数据从登台表移动到他们的身份识别对应物中,每次都打开和关闭identity_insert。注意:在这里,我还必须注意sp_msdependencies结果,以免出现外来错误
创建数据工厂管道以移动剩余的表。
嗯...
答案 2 :(得分:0)
今天在处理 2500 万行数据集时遇到了这个问题,因此真的很想进行 Ident 插入,而不是通过另一个表进行暂存。
在复制数据(接收器/预复制脚本)步骤中添加: 设置 identity_insert [schema].[table] on
在以下之后立即添加查找: 设置 identity_insert [schema].[table] off 选择 1 作为结果集
您需要结果,因为它是一个查找,不要忘记,您一次只能运行这些步骤之一,因为 Ident 插入一次只能在一张表上,除非有人会告诉我使用 SQL 2005 :-)