如何从SQL Server数据库中获取已修改记录的列表?

时间:2010-05-19 15:22:34

标签: sql-server

我目前正在改进我公司的管理系统,以便在网络流量方面更加精益。现在我正试图找出一种有效的方法来查询自上次询问以来(由任何用户)修改过的记录。

当应用程序启动时,它会加载作业信息并在本地缓存它,如下所示:SELECT * FROM jobs

我正在写出修改记录的日期/时间ala UPDATE jobs SET Widgets=@Widgets, LastModified=GetDate() WHERE JobID=@JobID

当任何用户请求作业列表时,我查询自上次请求列表以来修改过的所有记录,如下所示:SELECT * FROM jobs WHERE LastModified>=@LastRequested并将请求的日期/时间存储为@用户再次询问时的LastRequest。理论上,这将仅返回自上次请求以来已修改的记录。

我遇到的问题是,当查询未编制索引的日期/时间列时,用户的日期/时间与服务器的日期/时间以及服务器负载并不完全同步。是否有更有效的系统,然后查询日期/时间信息?

5 个答案:

答案 0 :(得分:2)

我不知道我会依赖Date-Time,因为它是SQL Server的外部。

如果您有Identity列,我会在表UserId, LastQueryDateTime, LastIdRetrieved

中使用该列

每次查询基表时,都会在此表中为用户插入新行(或更新,如果存在)max id。此外,查询应该读取此表中的行以获取LastIdRetrieved并在where子句中使用它。

如果您的所有代码选择从SQL Server而不是从客户端计算机插入GetDate(),则可以消除所有这些,但该任务非常耗费人力。

答案 1 :(得分:0)

最简单的解决方案似乎一度成为领先者。

一种方法是确定服务器时间。更新行后,将select LastModified where JobID = @JobID返回的值存储在客户端。这样,客户端可以仅使用服务器时间作为参考进行有效查询。

答案 2 :(得分:0)

使用与Active Directory和DNS一样的更新序列号(USN)来跟踪自上次复制以来已更改的对象。选择一个数字开始,每次插入或修改Jobs表中的记录时,写下最新的USN。在执行最后一个Select查询时跟踪USN,然后您始终知道自上次查询以来哪些记录已更改。例如......

Set LastQryUSN = 100

Update Jobs Set USN=101, ...

Update Jobs Set USN=102, ...

Insert Jobs (USN, ...) Values (103, ...)

Select * From Jobs Where USN > LastQryUSN

Set LastQryUSN = 103

Update Jobs Set USN=104

Insert Jobs (USN, ...) Values (105, ...)

Select * From Jobs Where USN > LastQryUSN

Set LastQryUSN = 105

......等等

答案 3 :(得分:0)

获得工作时,也要获得服务器时间:

DECLARE @now DATETIME = GETUTCDATE();

SELECT @now AS [ServerTime], * FROM Jobs WHERE Modified >= @LastModified;

首次将最小日期作为@LastModified传递。在每次后续调用中,传入ServerTime返回的最后一次调用。通过这种方式,客户时间可以从等式中取出。

我希望,服务器负载的答案显而易见:在Modified列上添加一个索引。

还有一个问题:永远不要使用本地时间,甚至不要使用服务器。始终使用UTC时间,并将UTC时间存储在已修改。就像现在一样,您的程序每年完全拧紧两次,当夏令时设置更改或移除时。

答案 4 :(得分:0)

当前SQL Server具有您可以使用的更改跟踪。只需在要跟踪的表格上启用更改跟踪。