Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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 server仅获取更新的记录_Sql_Sql Server - Fatal编程技术网

sql server仅获取更新的记录

sql server仅获取更新的记录,sql,sql-server,Sql,Sql Server,我正在使用SQLServer2000。我只需要从远程服务器获取更新的记录,并且需要每天将该记录插入本地服务器。但是该表没有创建日期或修改日期字段。如果您无法更改远程服务器的数据库,您最好的选择可能是对给定行的值使用某种哈希函数,比较新旧表,并仅提取函数(oldrow)!=函数(newrow) 您还可以直接比较有问题的列,并在新旧列之间的所有有问题的列都不相同时复制该记录 这意味着您不能修改新表中的值,否则它们将每天从旧表中被覆盖。如果这是一个问题,您需要另一个表来缓存前一天旧表的值;然后,您将能

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

如果您无法更改远程服务器的数据库,您最好的选择可能是对给定行的值使用某种哈希函数,比较新旧表,并仅提取函数(oldrow)!=函数(newrow)

您还可以直接比较有问题的列,并在新旧列之间的所有有问题的列都不相同时复制该记录


这意味着您不能修改新表中的值,否则它们将每天从旧表中被覆盖。如果这是一个问题,您需要另一个表来缓存前一天旧表的值;然后,您将能够判断旧的、新的或两者都在过渡期间进行了修改。

您需要以下选项之一

  • 表中的一列,以某种方式标记新记录或更新记录(lastupdate\u时间戳、增量更新计数器…)
  • 在表上的Insert和Update时会触发一些触发器,这会产生一些副作用,例如将相应的行id添加到单独的表中
您还可以逐行比较来自远程服务器的数据与生产服务器的数据,以获得新的或更新的行的列表。。。这样的差异更新也可以通过比较某个哈希值来产生,每行一个,该哈希值是从该行所有列的值计算出来的

除了上面提到的一个,以及一些MS-SQL内置复制设置,我能想到的唯一其他可能性是[不漂亮]:

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

      更新


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

      我通过使用tablediff实用程序解决了这个问题,该实用程序将比较两个表中的数据是否存在不收敛现象,对于排除复制拓扑中的不收敛现象特别有用

      请参阅链接

      总之:

    • 您有一个较旧的远程db服务器,无法修改其中的任何内容(如表、触发器等)
    • 您不能使用复制
    • 数据本身没有显示上次修改的日期/时间
    • 你不想每次都把整张桌子拉下来
    • 这给我们留下了一个不可能的局面

      如果上面的前3项为真,则您唯一的选择是拉取整个表。即使它们确实有一个修改过的日期/时间列,您也不会检测到删除。这让我们回到了原点


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

      我无法比较表中的每一行。因为记录大小在百万范围内(romote服务器中为400万行)。这方面的问题是,可能有一条或两条记录受到影响(插入、更新或删除)。我需要每天同步两个表(在服务器和本地)。我无法在该服务器上创建触发器。因为我只有读取该表的权限。我无法修改远程服务器中的表结构。我无法在远程服务器中创建任何触发器。只有我才能读取表记录。我知道这些是约束条件,我已经提供了您的选项,考虑到这些约束条件。我认识到这并不理想。不过,我认为每天更新400万行可能是可以管理的。如果您可以在远程服务器上安装一些东西,但根本无法修改数据库,那么您可以通过在该计算机上运行一个服务来加快速度,该服务将执行比较工作,并只报告受影响行的ID,这样更新查询就可以仅对少数受影响行跨线拉取数据。我假设必须配置此服务,这听起来像是OP对远程服务器束手无策。您意识到,要使此实用程序正常工作,它需要从源和目标获取所有400万条记录的副本?最初,当我通过直接字段对字段比较同步这两个表(有数百万条记录)时,需要1小时才能完成。但使用tablediff实用程序只需1分钟即可完成。