4

问候大家!

在 SqlDependency 中,您可以使用查询通知机制轻松订阅数据更改。(或通过设置 odbc 属性

 SqlDependency dependency = new SqlDependency(
      new SqlCommand("SELECT [ID], [Name] FROM [dbo].[tbl_Contact]", this.CurrentConnection)
 );
 dependency.OnChange += this.dependency_OnChange;

另一方面,使用本机 sql,您可以对某些 DMV 事件执行存储过程。(如用户注销)

create queue [myEventQueue] with activation (
   status = on,
   procedure_name = dbo.QueueProcessing,
   max_queue_readers = 2,
   execute as self
)

create service [myNotifications] on queue [myEventQueue]
([http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]);

CREATE EVENT NOTIFICATION [myEvent]
ON server
FOR AUDIT_LOGOUT
TO SERVICE 'myNotifications', 'current database'

我的问题是:

  1. 我们可以在没有 SqlDependency 的情况下创建和订阅一些事件查询来进行数据更改(在 Managment Studio 中使用本机 t-sql)吗?
  2. 当“某些数据被修改”时我们可以执行存储过程吗?

感谢您的任何帮助!

PS 为什么我不能使用触发器?

我有大约 200 个“事件”,它们依赖于具有不同谓词(过滤器)的多个表。不幸的是,用户可以更改它。

4

1 回答 1

2

您可以使用SqlNotificationRequest类,而不是使用 SqlDependency。

来自MSDN 文章启用查询通知

...SqlNotificationRequest 要求您自己实现整个侦听基础架构。此外,必须定义队列支持的队列、服务和消息类型等所有支持的 Service Broker 对象。如果您的应用程序需要特殊的通知消息或通知行为,或者如果您的应用程序是更大的 Service Broker 应用程序的一部分,则此手动方法很有用。

但这仍然不允许您使用本机 T-SQL 代码订阅数据更改通知。我想可以创建一个 CLR 函数来提交通知订阅。

此外,MS SQL Server 具有可能对您有用的“更改跟踪”功能。您启用数据库以进行更改跟踪并配置您希望跟踪的表。SQL Server 然后在每次更新、插入、删除表时创建更改记录,然后让您查询自上次检查以来对记录所做的更改。这对于同步更改非常有用,并且比使用触发器更有效。它也比制作自己的跟踪表更容易管理。这是自 SQL Server 2005 以来的一项功能。

如何:使用 SQL Server 更改跟踪

更改跟踪仅捕获表的主键,让您查询哪些字段可能已被修改。然后您可以查询这些键上的表连接以获取当前数据。如果您希望它捕获数据,也可以使用 Change Capture,但它需要更多开销并且至少需要 SQL Server 2008 企业版。

变更数据捕获

使用这些功能,您仍然需要创建一些服务或 SQL 代理作业,定期查看更改表并将适当的 Service Broker 消息发送到您的服务。

于 2015-06-10T19:18:03.773 回答