我想将Azure SQL DB表从源数据库完全复制到目标数据库。我目前有一个“复制数据”的活动,工程伟大的upserting数据。但我还想从目标中删除源中不存在的任何记录。截断和重新创建目标表不是一个选项(大量FK)。我能想到的唯一解决方法是在目标数据库中创建一个staging表,将所有源记录转储到其中,如果staging中不存在,则从目标中删除,然后删除staging表。有没有更优雅的方式来做这件事?我很惊讶这不仅仅是复制数据活动中的一个复选框!
n3schb8v1#
下面将是最好的方式与快速性能:1.将所有表从源复制到接收器中的staging表(通过truncate insert或drop和auto create)1.编写一个存储过程,在其中按照FK关键方面的相反顺序截断表,并根据事务中的相反顺序将数据从暂存器填充到最终表中。不幸的是,这就是方式,并且没有删除的方面不存在于源中,而是存在于具有upsert选项的接收器中,因为:1.如果您每天只从源接收增量更新,则接收表中的记录可能会被删除。因此,在upsert的情况下,到目前为止,在sink中没有删除
fhity93d2#
如果您想删除sink中不在source中的记录,您可以按照以下选项操作:
1.如果你想从接收器(比如sink)中删除数据,你可能需要将以前的源数据加载到接收器数据库的临时表中,编写一个存储过程来删除数据并将数据从temp更新到sink,并在第一个将数据从源复制到临时表的复制活动之后从存储过程活动中调用它。1.如果允许使用数据流,那么为了创建从接收器中删除数据的条件,您可以选择添加两个源(源表和接收器表),并在Map表中的接收器表上使用Alter行转换。
sink
temp
2条答案
按热度按时间n3schb8v1#
下面将是最好的方式与快速性能:
1.将所有表从源复制到接收器中的staging表(通过truncate insert或drop和auto create)
1.编写一个存储过程,在其中按照FK关键方面的相反顺序截断表,并根据事务中的相反顺序将数据从暂存器填充到最终表中。
不幸的是,这就是方式,并且没有删除的方面不存在于源中,而是存在于具有upsert选项的接收器中,因为:
1.如果您每天只从源接收增量更新,则接收表中的记录可能会被删除。因此,在upsert的情况下,到目前为止,在sink中没有删除
fhity93d2#
如果您想删除sink中不在source中的记录,您可以按照以下选项操作:
1.如果你想从接收器(比如
sink
)中删除数据,你可能需要将以前的源数据加载到接收器数据库的临时表中,编写一个存储过程来删除数据并将数据从temp
更新到sink
,并在第一个将数据从源复制到临时表的复制活动之后从存储过程活动中调用它。1.如果允许使用数据流,那么为了创建从接收器中删除数据的条件,您可以选择添加两个源(源表和接收器表),并在Map表中的接收器表上使用Alter行转换。