如何从应用程序监视数据库更新

How to monitor database updates from application?

本文关键字:数据库 更新 监视 应用程序      更新时间:2023-10-16

我使用ODBC、C++处理SQL Server数据库。我想检测数据库的某些表中的修改:另一个应用程序插入或更新行,我必须检测所有这些修改。它不一定是即时触发器,可以使用轮询定期检查数据库表是否有修改。

以下是我认为可以做到这一点的方法,需要你的意见,无论这是标准/正确的方法,还是存在任何更好的方法。

我想到的是:我在SQL Server中添加触发器,在任何修改时,它都会将修改/添加的行的标识符插入到特殊的表中,我会定期从应用程序中检查该表。假设有3个表:客户、产品、服务。我将制作三个额外的表:Change_Customers、Change_Products、Change_Services,并插入相应表的修改行的标识符。然后,我将定期从应用程序中读取这些Change_*表,并删除已处理的记录。

现在,如果您同意上述解决方案是正确的,我还有另一个问题:对于我希望监视的每个表,是最好有单独的Change_*表,还是最好有一个包含所有表的更改的胖Changes表。

Query Notifications是一项旨在实现所描述内容的技术。您可以通过众所周知的SqlDependency类利用来自托管客户端的查询通知,但也有本机Ole DB和ODBC方法。请参阅使用查询通知,有关SSPROP_QP_NOTIFICATION_MSGTEXT(OleDB)和SQL_SOPT_SS_QUERYNOTIFICATION_MSGTEXT(ODBC)的段落。请参阅神秘通知以了解查询通知的工作原理。

这是唯一一个可以与任何类型的更新一起使用的无轮询解决方案。触发器和更改轮询存在严重的可扩展性和性能问题。变更数据捕获和变更跟踪实际上涵盖了另一个主题(为偶尔连接的设备同步数据集,例如同步框架)。

变更数据捕获(CDC)--http://msdn.microsoft.com/en-us/library/cc645937.aspx

首先,您需要在数据库中启用CDC::使用数据库名称去EXEC sys.sp_cdc_enable_db转到

在表上启用CDC::sys.sp_cdc_enable_table

然后您可以查询更改

  • 如果Sql Server的版本是2005,则可以使用Notification Services
  • 如果您的Sql Server是2008+,那么最可取的方法是使用触发器并将更改记录到日志表中,并定期从应用程序中轮询这些表以查看更改