Как отслеживать изменения во многих базах данных SQL Server из приложения .NET? - PullRequest
7 голосов
/ 22 апреля 2010

Проблема:

Существует множество различных баз данных, которые заполняются многими различными приложениями напрямую (без какого-либо общего прикладного уровня). Доступ к данным возможен только через SP (по правилам)

Задача:

Приложение должно отслеживать изменения в этих базах данных и реагировать в минимальные сроки.

Возможные решения:

1) Создайте триггер для каждой таблицы в каждой базе данных, которая будет заполнять одну таблицу событиями. Приложение будет смотреть эту таблицу через SqlDependency.

2) Просматривать каждую таблицу в каждой базе данных через SqlDependency.

3) Создать триггер для каждой таблицы в каждой базе данных, который будет уведомлять приложение, используя управляемое расширение.

Какой путь лучше?

Ответы [ 3 ]

5 голосов
/ 22 апреля 2010

Это может быть обширная тема. Прежде всего: Какая версия SQL Server используется?

если вы используете SQL 2008, Change Data Capture - инструмент выбора Эта новая функция позволяет отслеживать КАЖДЫЙ изменения, внесенные в базы данных в SQL 2008. Сюда входят изменения DDL , а также изменения данных . Проверьте введение здесь .

Если вы используете более старую версию SQL 2008 и вам разрешено изменить DDL базы данных, опция 3 будет одним из вариантов (из того описано). Я не рекомендовал бы это, хотя, поскольку есть другие вещи, которые следует учитывать, например, что происходит, когда транзакция откатывается или когда триггеры деактивируются при массовой вставке , например?

Во всех этих случаях будет непросто заставить ваше решение работать должным образом.

Другой способ, которым вы могли бы пойти, - посмотреть файл Transaction Log . Это, безусловно, лучший, но и самый сложный способ , поскольку почти нет документации по проприетарному формату журнала. Также он привязан к конкретной версии SQL Server. Это приведет к отсутствию влияния мониторинга выбранных баз данных.

Еще один подход заключается в создании копии данных , которую необходимо отслеживать, и периодически проверять наличие различий. Это дает то преимущество, что НЕТ изменений в исходных базах данных . А также избавиться от проблем с транзакциями или массовыми вставками. Начиная с последнего этапа следующего мониторинга вы сможете обнаружить изменения.

Влияние на производительность довольно минимально, так как для таблиц, подлежащих мониторингу, потребуется только последовательное чтение первичного индекса. И это, безусловно, самый оптимизированный способ взаимодействия с базой данных. Однако этот подход потребует значительных усилий для развития. Я должен знать, так как это мой основной фокус с последних лет. Отметьте здесь ;)

(я надеюсь, что связывание в порядке, в данном случае, так как по теме, в противном случае я удаляю его)

0 голосов
/ 23 февраля 2015

Вы можете использовать реализацию класса SqlDependency с открытым исходным кодом - SqlDependencyEx . Он использует триггер базы данных и собственное уведомление Service Broker для получения событий об изменениях таблицы. Это пример использования:

int changesReceived = 0;
using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
          TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) 
{
    sqlDependency.TableChanged += (o, e) => changesReceived++;
    sqlDependency.Start();

    // Make table changes.
    MakeTableInsertDeleteChanges(changesCount);

    // Wait a little bit to receive all changes.
    Thread.Sleep(1000);
}

Assert.AreEqual(changesCount, changesReceived);

С SqlDependecyEx вы можете отслеживать только INSERT или DELETE, избегая UPDATE. Надеюсь, это поможет.

0 голосов
/ 22 апреля 2010

Не рассматриваете возможность использования SQL profiler. Используя фильтр, вы можете выбрать только операции обновления, а затем записать в журнал.

...