Как вы отслеживаете время реплицированных строк для подписчиков в SQL Server 2005? - PullRequest
3 голосов
/ 02 октября 2008

Основная проблема такова:
Подписчик успешно реплицировал строку от издателя, используя репликацию транзакций. Теперь, как мы отслеживаем время последней успешно реплицированной строки?

Друг предложил следующее решение, которое он использовал для своего SQL Server 2000:
1) Добавьте столбец даты и времени.
2) Измените хранимую процедуру репликации, чтобы обновить столбец datetime (!).

Шаг # 2 вызывает во мне все виды предупреждающих звонков, поэтому я спрашиваю, есть ли лучшие решения для SQL Server 2005 в этой ситуации, прежде чем я даже подробно расскажу о его решении.

Ответы [ 4 ]

1 голос
/ 14 сентября 2009

У меня была именно эта проблема несколько недель назад, когда я пытался найти записи, которые недавно изменились.

Создайте новый столбец и установите для типа данных значение TIMESTAMP. SS2005 автоматически обновляет этот тип при обновлении строки. Единственная проблема заключается в том, что эта «временная метка» не имеет никакого отношения к дате или времени, это просто число, которое отражает последнее успешное обновление этой строки (любое обновление, не только посредством репликации). Если это все, что вам нужно, то все будет в порядке.

Если вам нужно последнее обновление replication , все может стать немного сложнее, и вам нужно испачкать руки триггерами и хранимыми процессами.

http://www.sqlteam.com/article/timestamps-vs-datetime-data-types

Надеюсь, это поможет ~

0 голосов
/ 07 октября 2008

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

0 голосов
/ 10 октября 2008

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

Во всяком случае, я проверил метод моего друга, и он отлично работал для нашего требования.

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

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

0 голосов
/ 03 октября 2008

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

Проблема этого подхода в том, что вам нужна блокировка записи, но я не вижу другого практического способа.

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

...