问候所有人!
在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'
我的问题是:
感谢您的帮助!
P.S。为什么我不能使用触发器?
我有大约200个"事件"它依赖于具有不同谓词(过滤器)的多个表。不幸的是,用户可以更改它。
答案 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企业版。
使用这些功能,您仍然需要创建一些服务或SQL代理作业,定期查看更改表并将相应的Service Broker消息发送到您的服务。