我无法更改此数据库的架构。这是一个 ERP 数据库,有自己的触发器,它的版本更新会挤压我的。由于通知服务即将消失或消失,还有其他方法可以做到这一点吗?也许是一些低级 COM API 或 .NET SQL Server Management APi 中的一些东西?
2 回答
由于您无法添加触发器,我认为您唯一的选择是定时轮询。当您使用轮询时,您实际上并没有收到更新,而是在半频率周期内查询数据的更改,这基本上最终会像通知一样工作。
这实现起来并不简单,但也不是那么困难。复杂性来自需要轮询的表的数量和结构。它的最佳工作方式是查询每个表中的 DateTime 列(如果有的话)并将最后一个最大时间与当前查询中的最大时间进行比较。如果这两者不同,那么就会发生变化,你就会触发你需要的任何商业逻辑。
如果没有可用的 DateTime 列,您还可以测试主键更改(比较自动增量字段的最大值。)对于插入 DateTime 和 int PKey 比较都可以工作。对于更新,仅 DateTime 比较将起作用(更新时没有 pkey 增量),但对于检测删除,如果您实际上从数据库中删除一行,它会变得更加有趣,因为自从您键入的数据以来没有 DateTime 更改和 pkey 增量走了。(如果在轮询查询之间插入和删除相同数量的项目,则计算表的行数将破坏逻辑。)
System.Data.SqlClient 命名空间有一些可能有帮助的类,例如SqlDependency。不过要小心:
SqlDependency 设计用于 ASP.NET 或中间层服务,在这些服务中,相对少量的服务器对数据库具有活动的依赖项。它不是为在客户端应用程序中使用而设计的,在客户端应用程序中,成百上千的客户端计算机将为单个数据库服务器设置 SqlDependency 对象。
这意味着如果你使用 SqlDependency,你应该确保它是一个服务器组件,它使用某种机制来通知客户端更改(推送),或者发布易于查询的数据以供客户端“拉”。
我们通过复制来做到这一点,在订阅者数据库上使用我们自己的触发器。