Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何跟踪SQL中导入了哪些行?_Sql_Integration - Fatal编程技术网

如何跟踪SQL中导入了哪些行?

如何跟踪SQL中导入了哪些行?,sql,integration,Sql,Integration,假设我想将某个特定表中的所有客户或所有行导入到某个外部系统。不是一次完成所有操作,而是在数据库中创建之后完成所有操作。为此,我必须记录所有已报告的行,因为我只想找到尚未报告的行。一般来说,添加一列来实现这一点还是创建某种batchlog表更好 如果相关的话,我正在使用MS SQL Server 一个简化的例子: 从reportedToExternalSystem为空的客户中选择* 或 从客户中选择*客户id不在integrationBatchLog中选择客户id 或者有没有其他更好的方法?这是我

假设我想将某个特定表中的所有客户或所有行导入到某个外部系统。不是一次完成所有操作,而是在数据库中创建之后完成所有操作。为此,我必须记录所有已报告的行,因为我只想找到尚未报告的行。一般来说,添加一列来实现这一点还是创建某种batchlog表更好

如果相关的话,我正在使用MS SQL Server

一个简化的例子:

从reportedToExternalSystem为空的客户中选择*

从客户中选择*客户id不在integrationBatchLog中选择客户id


或者有没有其他更好的方法?这是我第一次这样做,所以我还不知道最佳做法。

我将使用一个单独的表,指示(比如)与您跟踪的表中记录的键交叉引用的导入日期。换句话说,一个有3列的表:自动递增键、来自其他表的记录id、导入日期。差不多吧。这也允许以后重新导入记录。您可以按日期跟踪所有导入。

我更喜欢有一列显示导入状态。维护一个单独的日志会导致时间消耗的结果和不断增长的表大小。我确实对SQL Server有概念上的想法,但似乎它是可行的。继续发帖

除非您必须使实现复杂化,否则请使用最简单的解决方案。你应该考虑的一件重要事情是,如果你需要的话,把这个简单的东西改造成更一般的东西是多么困难。
在您的例子中,我只看到从列升级到表的一个问题。如果您需要进口历史记录。解决方案:将reportedToExternalSystem列设置为DateTime或Timestamp类型

简单的解决方案是添加一列,将该行标记为已导入。状态int 0/1,或者如果要跟踪何时导入,则为导入日期。此解决方案确实存在一些限制:

您只能导入该行一次。更新记录时是否需要再次导入客户?更新客户时是否要清除更新字段

它会导致在更新行状态时锁定行。您确定插入客户记录的应用程序会满意您的代码锁定记录吗

在某些系统上,它会导致将整行写入日志系统进行恢复。根据行的大小,仅一个字段可能需要大量的日志写入

在一个高度并行的导入系统中,您可能会有很多资源争用。如果一个导入程序正在锁定表,那么想想如果多个导入程序同时锁定表会有多糟糕

如果在导入轮询间隔期间多次更新客户数据,您将只看到最新数据,并跳过中间更新。这只是一个问题,如果你关心的intermedaite更新。对于您可能不关心的客户,对于订单状态,您可能非常关心

您必须修改表结构。由于数据/支持/政治问题,源应用程序可能不允许这样做

除了在表中放置status列之外,还有一种很有效的技术,即在表上放置触发器并将导入数据镜像到第二个表。然后,您将“使用”第二个表中的数据。这有几个优点:

它将包含的锁定问题保留到第二个表中

它允许您处理对主表的每次更新

您可以向第二个表添加索引,该索引用于跟踪更新状态,而无需更改主表

如果在第二个表中的行被使用时立即删除,或者在短审核期后删除,则表/索引的大小将降至最小


在SQLServer中使用此技术时,我将第二个表放在一个单独的模式中。由于大多数应用程序都将表存储在dbo中,因此最终可能会出现dbo.Customers和Import.Customers。这可以帮助您跟踪要导入的表,并避免为导入表提供新名称。

在这种情况下,这会导致数据冗余。即使在源表中维护一个col也可以作为重新导入状态。只需将其声明为默认初始值为“0”的数字列类型,并在每次导入时添加“1”。你说呢?我提到的解决方案提供了最大的功能,因为原始海报不清楚每个钥匙是否只需要一个导入日期,我选择了凯迪拉克解决方案。当然有几种好的解决方案,但OP需要根据其具体需求进行选择。