在没有SqlDependency的情况下在查询通知上运行存储过程

时间:2015-06-07 10:29:20

标签: sql-server stored-procedures sql-server-2008-r2 query-notifications

问候所有人!

在SqlDependency中,您可以使用Query Notification机制轻松订阅数据更改。 (或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. 我们可以在"某些数据被修改"?
  3. 时执行存储过程

    感谢您的帮助!

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

      

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

1 个答案:

答案 0 :(得分:2)

您可以使用SqlNotificationRequest类。

,而不是使用SqlDependency

来自MSDN article Enabling Query Notifications

  

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

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

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

How to: Use SQL Server Change Tracking

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

Change Data Capture

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