Azure 数据工厂复制带有间隙的标识列
Azure Data Factory Copy Identity Column With Gaps
我创建了一个管道和两个链接服务,用于将数据从 SQL 服务器的本地实例移动到 Azure Sql 实例。我 运行 遇到的问题是我们的内部部署中有一个 table "Table-1",其标识 (1,1) 列缺少顺序 ID(例如值是 1、2、3、4、6)。当管道运行时,它会尝试插入 ID 为 1、2、3、4、5 的行,这是一个大问题,因为 ID 6 是另一个 table "Table-2" 上的外键,现在它不存在,因此将数据移动到 Table-2 失败并出现 SQL 错误 547(插入语句与外键约束冲突...)。
在我看来,正确的做法是使该列不是身份,但现在这对我来说不是一个选项,因为创建记录的应用程序代码希望自动生成该列。
除了不使用数据工厂之外,还有其他解决方法吗?我希望看到它自动为带有身份列的 table 切换 identity_insert 打开和关闭,虽然我知道这会强制这些 table 一次处理一个,但选项会很好,它不会破坏我的关系。
编辑:根据 wBob 的建议,我还在此处添加了一个功能请求(如果您愿意投票的话):https://feedback.azure.com/forums/270578-data-factory/suggestions/17996950-add-support-for-maintaining-identity-column-values
Azure 数据工厂本身不支持打开或关闭 table 的身份 属性,但有两种解决方法 spring。
- 使用数据工厂将数据加载到分段 table(未设置身份 属性),然后使用 Stored Proc 任务调用存储过程更严格的控制,包括设置身份 属性 打开或关闭的能力。
- 如果您使用的是 Azure SQL 数据库(或 VM 上的 SQL 服务器),您可以使用 table-valued 参数并以这种方式将数据传递到存储过程任务中,跳过分期 table。此技术不适用于 Azure SQL 数据仓库。我可能不会推荐这个用于高音量。 example 展示了如何:
我无法测试这些,但相信它们会起作用。如果您有任何问题,请告诉我。
我接受了 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
)
并将此处的结果与 oType = 8 的 sp_msdependencies
的结果相比较。然后我获取了此结果集中 oSequence = 1(无依赖项)的所有表,并将这些表放入管道和 运行 它。
我创建了一个暂存模式和 re-created 所有具有标识列的表(通过删除 (1.) 中的查询中的 'not' 找到的,并且有超过 60 个)并在创建它们时删除了标识规范。
然后我创建了另一个数据工厂管道以将数据移动到这些暂存表中。
运行 一堆 'insert into...' 语句将数据从登台表移动到它们的 identity-laden 对应表中,设置 identity_insert 打开和关闭每一次。注意:在这里,我还必须注意 sp_msdependencies 结果,以免出现外部错误
创建了一个数据工厂管道来移动剩余的表。
哇...
今天在 2500 万行数据集上遇到了这个问题,所以真的很想做一个 Ident Insert 而不是通过另一个 table。
在复制数据(接收/预复制脚本)步骤中添加:
设置 identity_insert [架构].[table] on
在以下内容后立即添加查找:
设置 identity_insert [架构].[table] 关闭
select 1 作为结果集
您需要结果,因为它是一个查找并且不要忘记,您一次只能 运行 这些步骤之一,因为 Ident 插入一次只能在一个 table时间,除非有人告诉我 SQL 2005 :-)
我创建了一个管道和两个链接服务,用于将数据从 SQL 服务器的本地实例移动到 Azure Sql 实例。我 运行 遇到的问题是我们的内部部署中有一个 table "Table-1",其标识 (1,1) 列缺少顺序 ID(例如值是 1、2、3、4、6)。当管道运行时,它会尝试插入 ID 为 1、2、3、4、5 的行,这是一个大问题,因为 ID 6 是另一个 table "Table-2" 上的外键,现在它不存在,因此将数据移动到 Table-2 失败并出现 SQL 错误 547(插入语句与外键约束冲突...)。
在我看来,正确的做法是使该列不是身份,但现在这对我来说不是一个选项,因为创建记录的应用程序代码希望自动生成该列。
除了不使用数据工厂之外,还有其他解决方法吗?我希望看到它自动为带有身份列的 table 切换 identity_insert 打开和关闭,虽然我知道这会强制这些 table 一次处理一个,但选项会很好,它不会破坏我的关系。
编辑:根据 wBob 的建议,我还在此处添加了一个功能请求(如果您愿意投票的话):https://feedback.azure.com/forums/270578-data-factory/suggestions/17996950-add-support-for-maintaining-identity-column-values
Azure 数据工厂本身不支持打开或关闭 table 的身份 属性,但有两种解决方法 spring。
- 使用数据工厂将数据加载到分段 table(未设置身份 属性),然后使用 Stored Proc 任务调用存储过程更严格的控制,包括设置身份 属性 打开或关闭的能力。
- 如果您使用的是 Azure SQL 数据库(或 VM 上的 SQL 服务器),您可以使用 table-valued 参数并以这种方式将数据传递到存储过程任务中,跳过分期 table。此技术不适用于 Azure SQL 数据仓库。我可能不会推荐这个用于高音量。 example 展示了如何:
我无法测试这些,但相信它们会起作用。如果您有任何问题,请告诉我。
我接受了 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 )
并将此处的结果与 oType = 8 的
sp_msdependencies
的结果相比较。然后我获取了此结果集中 oSequence = 1(无依赖项)的所有表,并将这些表放入管道和 运行 它。我创建了一个暂存模式和 re-created 所有具有标识列的表(通过删除 (1.) 中的查询中的 'not' 找到的,并且有超过 60 个)并在创建它们时删除了标识规范。
然后我创建了另一个数据工厂管道以将数据移动到这些暂存表中。
运行 一堆 'insert into...' 语句将数据从登台表移动到它们的 identity-laden 对应表中,设置 identity_insert 打开和关闭每一次。注意:在这里,我还必须注意 sp_msdependencies 结果,以免出现外部错误
创建了一个数据工厂管道来移动剩余的表。
哇...
今天在 2500 万行数据集上遇到了这个问题,所以真的很想做一个 Ident Insert 而不是通过另一个 table。
在复制数据(接收/预复制脚本)步骤中添加: 设置 identity_insert [架构].[table] on
在以下内容后立即添加查找: 设置 identity_insert [架构].[table] 关闭 select 1 作为结果集
您需要结果,因为它是一个查找并且不要忘记,您一次只能 运行 这些步骤之一,因为 Ident 插入一次只能在一个 table时间,除非有人告诉我 SQL 2005 :-)