sql server仅获取更新的记录
我正在使用SQLServer2000。我只需要从远程服务器获取更新的记录,并且需要每天将该记录插入本地服务器。但是该表没有创建日期或修改日期字段。如果您无法更改远程服务器的数据库,您最好的选择可能是对给定行的值使用某种哈希函数,比较新旧表,并仅提取函数(oldrow)!=函数(newrow) 您还可以直接比较有问题的列,并在新旧列之间的所有有问题的列都不相同时复制该记录sql server仅获取更新的记录,sql,sql-server,Sql,Sql Server,我正在使用SQLServer2000。我只需要从远程服务器获取更新的记录,并且需要每天将该记录插入本地服务器。但是该表没有创建日期或修改日期字段。如果您无法更改远程服务器的数据库,您最好的选择可能是对给定行的值使用某种哈希函数,比较新旧表,并仅提取函数(oldrow)!=函数(newrow) 您还可以直接比较有问题的列,并在新旧列之间的所有有问题的列都不相同时复制该记录 这意味着您不能修改新表中的值,否则它们将每天从旧表中被覆盖。如果这是一个问题,您需要另一个表来缓存前一天旧表的值;然后,您将能
这意味着您不能修改新表中的值,否则它们将每天从旧表中被覆盖。如果这是一个问题,您需要另一个表来缓存前一天旧表的值;然后,您将能够判断旧的、新的或两者都在过渡期间进行了修改。您需要以下选项之一
- 表中的一列,以某种方式标记新记录或更新记录(lastupdate\u时间戳、增量更新计数器…)
- 在表上的Insert和Update时会触发一些触发器,这会产生一些副作用,例如将相应的行id添加到单独的表中
- 解析SQL日志以识别更新和添加到表中的内容。这需要专门的软件;我甚至不确定日志文件格式是否已发布/记录,尽管我见过这种类型的工具。坦白地说,这种方法更适用于法医类型的情况
- 您有一个较旧的远程db服务器,无法修改其中的任何内容(如表、触发器等)
- 您不能使用复制
- 数据本身没有显示上次修改的日期/时间
- 你不想每次都把整张桌子拉下来 这给我们留下了一个不可能的局面 如果上面的前3项为真,则您唯一的选择是拉取整个表。即使它们确实有一个修改过的日期/时间列,您也不会检测到删除。这让我们回到了原点
- 使用
更新
如果无法对源执行管理操作,则必须每天读取所有数据。由于无法检测更改(请记住,即使有时间戳,也无法检测更改,因为无法使用时间戳检测删除),因此每次同步时都必须读取每一行。如果您读取每一行,那么最简单的解决方案就是用新快照替换所有数据 我通过使用tablediff实用程序解决了这个问题,该实用程序将比较两个表中的数据是否存在不收敛现象,对于排除复制拓扑中的不收敛现象特别有用 请参阅链接 总之:
去和你的老板谈谈,要求更好的要求。也许这次可以做点什么。我无法比较表中的每一行。因为记录大小在百万范围内(romote服务器中为400万行)。这方面的问题是,可能有一条或两条记录受到影响(插入、更新或删除)。我需要每天同步两个表(在服务器和本地)。我无法在该服务器上创建触发器。因为我只有读取该表的权限。我无法修改远程服务器中的表结构。我无法在远程服务器中创建任何触发器。只有我才能读取表记录。我知道这些是约束条件,我已经提供了您的选项,考虑到这些约束条件。我认识到这并不理想。不过,我认为每天更新400万行可能是可以管理的。如果您可以在远程服务器上安装一些东西,但根本无法修改数据库,那么您可以通过在该计算机上运行一个服务来加快速度,该服务将执行比较工作,并只报告受影响行的ID,这样更新查询就可以仅对少数受影响行跨线拉取数据。我假设必须配置此服务,这听起来像是OP对远程服务器束手无策。您意识到,要使此实用程序正常工作,它需要从源和目标获取所有400万条记录的副本?最初,当我通过直接字段对字段比较同步这两个表(有数百万条记录)时,需要1小时才能完成。但使用tablediff实用程序只需1分钟即可完成。