运行 没有 SqlDependency 的查询通知存储过程

Run stored procedure on query notification without SqlDependency

大家好!

在 SqlDependency 中,您可以使用查询通知机制轻松订阅数据更改。 (或按 setting odbc attributes

 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. 我们可以在"some data modified"时执行存储过程吗?

感谢您的帮助!

P.S。为什么我不能使用触发器?

I have about 200 "events" wich are dependent on multiple tables with different predicates (filters). Unfortunately, users can change it.

您可以使用 SqlNotificationRequest class.

而不是使用 SqlDependency

来自 MSDN article Enabling Query Notifications:

...SqlNotificationRequest requires you to implement the entire listening infrastructure yourself. In addition, all the supporting Service Broker objects such as the queue, service, and message types supported by the queue must be defined. This manual approach is useful if your application requires special notification messages or notification behaviors, or if your application is part of a larger Service Broker application.

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

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

How to: Use SQL Server Change Tracking

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

Change Data Capture

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