运行 没有 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'
我的问题是:
- 我们可以在没有 SqlDependency 的情况下创建和订阅一些事件查询以更改数据吗(在 Managment Studio 中使用本机 t-sql)?
- 我们可以在"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 企业版。
使用这些功能,您仍然需要创建一些服务或 SQL 代理作业,定期查看更改 table 并向您的服务发送适当的 Service Broker 消息。
大家好!
在 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'
我的问题是:
- 我们可以在没有 SqlDependency 的情况下创建和订阅一些事件查询以更改数据吗(在 Managment Studio 中使用本机 t-sql)?
- 我们可以在"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 企业版。
使用这些功能,您仍然需要创建一些服务或 SQL 代理作业,定期查看更改 table 并向您的服务发送适当的 Service Broker 消息。