SQL Server 2005/8 ID транзакции репликации - PullRequest
0 голосов
/ 13 ноября 2009

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

Затем я выполняю некоторую обработку реплицированных данных для целей отчетности. Я использую триггеры уровня таблицы, чтобы определить изменения, какие действия выполняет мой код постобработки.

До этого момента все в порядке.

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

Базовый пример: у меня есть таблица TUser и таблица TAddress. Если бы я должен был создать оба в одной транзакции, они также были бы скопированы в одну транзакцию. Однако в реплицированной базе данных будет запущено два триггера, что в настоящее время приводит к тому, что мой код постобработки запускается дважды. То, что я действительно хотел бы идентифицировать, - то, что эти два изменения прибыли в реплицированном в той же самой транзакции.

Возможно ли это как-нибудь? Существует ли идентификатор, который я описал, и доступен ли он?

1 Ответ

1 голос
/ 13 ноября 2009

Короткий ответ - нет, нет ничего такого, на что вы могли бы положиться. Вкратце, можно сказать, что да, он существует, но никоим образом не рекомендуется его использовать.

Принимая во внимание, что репликация является транзакционной последовательностью, вы могли бы рассмотреть один из подходов - поместить идентификатор основной записи (в данном случае TUser, поскольку TAddress связан с TUser) в очередь (используя что-то вроде Service Broker. в идеале или потенциально пользовательская очередь * (1006 *), а затем выполнить постобработку, отбрасывая данные из очереди и обрабатывая отдельно.

Другой возможностью будет просто пакетная обработка каждого «x» промежутка времени путем опроса новых / обновленных записей из первичных таблиц и последующей обработки таким способом - вам необходимо отслеживать идентификаторы, версии строк или временные метки некоторых отсортируйте обработанную для каждой первичной таблицы метаданные и извлеките все, что еще не было обработано во время каждого пакетного запуска.

Несколько мыслей, надеюсь, это поможет.

...