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

时间:2012-02-01 07:38:19

标签: c++ sql sql-server database odbc

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

以下是我认为可以这样做的方式,并且需要您的意见,无论这是标准/正确的方式,还是存在任何更好的方法。

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

现在,如果您同意上述解决方案是正确的,我还有另一个问题:为我希望监控的每个表都有单独的Change_ *表是否更好,或者更好的是有一个胖的更改表将包含所有表格的变化。

3 个答案:

答案 0 :(得分:3)

Query Notifications是专为完全所描述的内容而设计的技术。您可以通过众所周知的SqlDependency类从托管客户端利用查询通知,但也有本机Ole DB和ODBC方法。请参阅Working with Query Notifications,关于SSPROP_QP_NOTIFICATION_MSGTEXT(OleDB)和SQL_SOPT_SS_QUERYNOTIFICATION_MSGTEXT(ODBC)的段落。有关查询通知如何工作的说明,请参阅The Mysterious Notification

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

答案 1 :(得分:1)

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

首先,您需要在数据库中启用CDC :: 使用db_name 走 EXEC sys.sp_cdc_enable_db GO

然后在桌面上启用CDC :: sys.sp_cdc_enable_table

然后您可以查询更改

答案 2 :(得分:0)

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