sql server只获取更新记录

时间:2010-01-28 05:11:29

标签: sql sql-server

我正在使用sql server 2000.我只需要从远程服务器获取更新的记录,并且需要每天在我的本地服务器中插入该记录。但该表没有创建日期或修改日期字段。

5 个答案:

答案 0 :(得分:2)

使用Transactional Replication

<强>更新

如果您无法对源进行管理操作,那么您将不得不每天读取所有数据。由于您无法检测到更改(请记住,即使您有时间戳,仍然无法检测到更改,因为无法检测带时间戳的删除),那么您必须每次都读取每一行你同步。如果您阅读每一行,那么最简单的解决方案就是用新快照替换您拥有的所有数据。

答案 1 :(得分:1)

您需要以下其中一项

  • 表格中的一列,用于标记时尚或其他方式的新记录或更新记录(lastupdate_timestamp,增量更新计数器......)
  • 表上的Insert和Update上的一些触发器,它会产生一些副作用,例如将相应的行id添加到单独的表中

您还可以逐行比较来自远程服务器的数据与生产服务器的数据,以获取新行或更新行的列表......这样的差异更新也可以通过比较一些散列值来生成,每行一个,根据行的所有列的值计算。

除了以上一点,并禁止一些MS-SQL内置的复制设置,我能想到的唯一另一种可能性是[不太漂亮]:

  • 解析SQL日志以识别更新并添加到表中。这需要专门的软件;我甚至不确定日志文件格式是否已发布/记录,尽管我已经看过这类工具。坦率地说,这种方法更适用于法医类型的情况......

答案 2 :(得分:0)

如果你不能改变远程服务器的数据库,你最好的选择可能是在给定行的值上提出某种散列函数,比较旧表和新表,并只拉取函数中的那些(oldrow)!= function(newrow)。

您也可以直接比较相关列,并在不是所有相关列都相同的时候复制该记录。

这意味着您无法修改新表中的值,或者它们将从旧表中被覆盖。如果这是一个问题,您将需要另一个表来缓存前一天的旧表值;然后你就可以判断旧的,新的或者两者都是在过渡期间被修改过的。

答案 3 :(得分:0)

我通过使用tablediff实用程序解决了这个问题,该实用程序将比较两个表中的数据以进行非收敛,对于解决复制拓扑中的非收敛问题特别有用。

请参阅链接。

tablediff utility

答案 4 :(得分:0)

总结:

  1. 您有一个较旧的远程数据库服务器,您无法修改任何内容(例如表,触发器等)。
  2. 您无法使用复制。
  3. 数据本身没有上次修改日期/时间的指示。
  4. 您不希望每次都拉下整张桌子。
  5. 这给我们留下了一个不可能的情况。

    如果上面的前3项都是真的,那么你只能选择拉整个表格。即使他们确实有修改的日期/时间列,您也不会检测删除。这让我们回到原点。

    与老板谈谈,并要求更好的要求。也许这次可以做点什么。