4

Приветствую всех!Запуск хранимой процедуры при запросе без 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. Можем ли мы создать и subcribe некоторый запрос событий на изменение данных без SqlDependency (используя нативный T-SQL в Managment Studio)?
  2. Можем ли мы выполнить хранимую процедуру, когда «некоторые данные изменены»?

Благодарим за помощь!

P.S. Почему я не могу использовать триггеры?

У меня около 200 событий, которые зависят от нескольких таблиц с различными предикатами (фильтрами). К сожалению, пользователи могут его изменить.

+0

Да, вы можете. SqlDependency использует Service Broker SQL Server. Вы можете использовать сообщения из очереди Service broker непосредственно в SQL. [читайте это.] (https://msdn.microsoft.com/en-us/bb522893.aspx) –

+0

@ ZoharPeled, я знаю, что они работают на одной и той же технологии, но я не могу найти, как подписываться на изменение данных. Ссылка не помогла :( – alex7z

+0

небольшая помощь от google возвращена [этот список учебников] (https://technet.microsoft.com/en-us/library/bb839489 (v = sql.105) .aspx) в MSDN. первый должен помочь вам. –

ответ

2

Вместо использования SqlDependency вы можете использовать класс SqlNotificationRequest.

От MSDN article Enabling Query Notifications:

... SqlNotificationRequest требует, чтобы реализовать весь прослушивания инфраструктуры самостоятельно. Кроме того, должны быть определены все поддерживающие объекты 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 работу, которая периодически просматривает таблицы изменений и отсылает сообщения Broker соответствующей службы к вашим услугам.

Смежные вопросы