如何将远程系统中的数据复制和验证到SQL Server中

如何将远程系统中的数据复制和验证到SQL Server中,sql,sql-server,ssis,replication,integration,Sql,Sql Server,Ssis,Replication,Integration,我手头的任务是为数据库创建某种逻辑。现在有一个IBMMQ系列设置,它可以从两个远程系统复制数据。此时,它会在远程系统中进行更改,并将数据转储到SQLServer2005数据库中的一个暂存表中 我想根据一些简单的验证逻辑(必填字段和数据格式)和一些更高级的数据层次结构检查来验证数据。导入的数据是分层的,其中一些数据之间存在父子关系。层次结构验证应检查暂存表和生产表中当前可用的数据,以确保导入完成后存在有效的层次结构 如果记录验证失败,则应以某种方式记录失败,不应导入失败记录,但应导入其余记录。如果

我手头的任务是为数据库创建某种逻辑。现在有一个IBMMQ系列设置,它可以从两个远程系统复制数据。此时,它会在远程系统中进行更改,并将数据转储到SQLServer2005数据库中的一个暂存表中

我想根据一些简单的验证逻辑(必填字段和数据格式)和一些更高级的数据层次结构检查来验证数据。导入的数据是分层的,其中一些数据之间存在父子关系。层次结构验证应检查暂存表和生产表中当前可用的数据,以确保导入完成后存在有效的层次结构

如果记录验证失败,则应以某种方式记录失败,不应导入失败记录,但应导入其余记录。如果当前生产表中的记录具有相同的id,则应将其替换为新记录。在数据出现在暂存表中后,应尽快从暂存表传输数据

据我目前所知,生产表中的记录总数不会超过100万条,每批更新的项目可能最多只有几千行

我的问题是什么解决方案最适合导入数据

我想到了几个可能的解决方案:

开始转移的方式:

  • 轮询 以固定的时间间隔放置临时表 开始某种形式的转移 每当需要新数据时进行处理 插入
  • 在将新数据插入MQ时,让MQ启动传输过程 桌子
  • 计划SSIS作业以定期运行
验证和传输数据的方法:

  • 创建SSIS作业
  • 创建存储过程
  • 自定义.NET代码

我主要关心的是,层次结构必须始终保持在生产表中的完整性,并且数据在登台表中出现后不久就应该在生产表中可用。我不能确定在暂存表中是否始终有完整的层次结构可用。

对于此类工作,我们使用一个封闭的流程

将数据从远程系统获取到暂存表中,导入到产品表中

如果任何内容都可以随意插入到临时表中,并且存在子表,那么就有可能在临时表中创建所有子记录之前将其导入到生产数据库中

如果您可以自由地向临时表添加列(远程端将忽略这些列),或者临时表具有唯一/不重复的标识或GUID,则可以创建并行表

理想情况下,在暂存表中创建行的例程将使用批次号,然后在成功时创建“批次号完成”记录。因此,您有一个信号量来停止导入,直到所有相关记录都已导入

(它们可以插入到事务块中,但您必须确信插入到暂存表中的所有进程都能做到这一点)

给定标识/GUID,我将创建一个1:1的“错误表”来存储描述导入失败的任何消息

您可以选择将故障行移动或复制到单独的故障暂存表中,这样主暂存表就不会被阻塞,并且更容易确保故障被分拣(我想是由人工分拣的)

话虽如此,以下是我们具体流程的更详细描述:

为了最大限度地减少带宽和更新(即减少阻塞和减少不必要的事务日志条目等),我们采取以下措施:

在源计算机上保存正在传输的表的副本。这有额外的列用于Updated on和Action(更新或删除标志-更新包括Insert,并且Insert可能在目标获得该行之前已再次更新…)

在此表中插入新的行即可

只有在至少一列中存在差异时,才会更新此表-因此,将整个源表与暂存表进行比较以找出发生了哪些更改是可以的(如果需要大量CPU)。更新设置“更新时间”列。(当心时钟倒转)

如果在源表中找不到stagin表行,我们会定期标记stagin表行Action=Deleted

数据将从源复制到目标上的相同表中,在该表中,上次传输后更新了

在目标服务器上,检查数据并将其导入生产的例程仅在更新日期起作用(处理自上次更新日期起的所有内容)

所有暂存表都位于一个单独的数据库中,该数据库具有最少的日志记录-如果恢复,该数据库将从“上次更新日期”自动刷新,因此我们的目标是最大限度地减少事务日志记录。我们没有;t将暂存表存储在生产数据库中(将有完整的事务日志记录),以避免TLOG膨胀

同样,如果这些过程是连续的,这样它们就不能同时发生,这是很有帮助的,否则需要某种批次号来防止在存在父/子表的情况下传输部分完成的批次

我们以源数据库的方式传输数据,并且只在目标端进行数据操作。这样做的原因是,如果数据操作错误,并且我们修复了它,我们只需要在目标端重新运行它-源数据都存在于目标端的暂存表中。如果我们在源端进行操作,我们还必须重新传输所有数据

对于调试,在暂存表中更新日期很有帮助