SQLDependency + Service Broker

我正在使用SqlDependency在某些表中的数据发生更改时获取通知。

private void subscribeBroker() { using (var conn = new SqlConnection(connString)) { conn.Open(); var cmd = new SqlCommand("SELECT text FROM dbo.Test"); cmd.Connection = conn; var dependency = new SqlDependency(cmd); dependency.OnChange += dependency_OnChange; SqlDependency.Start(connString); cmd.ExecuteNonQuery(); } } void dependency_OnChange(object sender, SqlNotificationEventArgs e) { //Do something... subscribeBroker(); } 

它有效,但我有一些问题。

1)我没有找到一种方法来获取哪些行被更改的信息。 我需要读取整个表中的所有数据,看看有什么不同。 有没有办法获得这些信息? (主要ID,或者其他)也许使用与SqlDependency不同的方法?

2)如果“某人”非常快速地改变数据怎么办? 某些更改可能不会被通知? (我关注通知和再次订阅时间之间的时间。

谢谢。

关于1-查询通知会告知您事情已发生变化。 如果你想获得自上次以来改变的内容 – 你可能会使用timestamp列。

关于2-查询通知会通知您有关更改的信息,然后被删除。 然后你再次订阅通知。 删除和创建通知之间的平均时间是不发送有关更改的通知的时间。

当您的数据不经常更改时,查询通知更适用于这种情况。 例如 – 一些兑现的分类值。 所以你订阅了某些表中的更改,等待更改,并在它们发生时获得最新版本的数据。 应该考虑查询通知也使用服务器资源,因此如果你有一个庞大的表并希望对一小部分数据进行更改,那么很多查询都会受到性能影响(比如索引视图)。

如果您需要根据更改的数据采取某些操作,并且每个更改都很重要,那么我猜测触发器+服务代理可能更有效。 或者,根据您的需要,更改数据捕获。