SQL Server 2008 — Проверка изменений в строке

#sql-server #sql-server-2008

#sql-сервер #sql-server-2008

Вопрос:

Вместо того, чтобы использовать кучу инструкций or для проверки того, была ли изменена строка, я просматривал checksum() или binary_checksum(). Что является наилучшей практикой в этой ситуации? Используется ли контрольная сумма (), binary_checksum() или какой-либо другой метод? Мне нравится идея использования одного из параметров контрольной суммы, поэтому мне не нужно создавать массивную инструкцию or для моего обновления.

РЕДАКТИРОВАТЬ: Извините всех, я должен был предоставить более подробную информацию. Мне нужно получить данные из некоторых внешних источников, но поскольку я использую репликацию слиянием, я не хочу просто удалять и перестраивать таблицы. Я хочу обновлять или вставлять только те строки, которые действительно имеют изменения или не существуют. У меня будет сопряженная версия исходных данных в моей целевой базе данных, которая будет синхронизирована с клиентами. Я пытался найти хороший способ обнаружить изменения в строке без необходимости просматривать каждый отдельный столбец для выполнения обновления.

Приветствуются любые предложения.

Спасибо,

S

Комментарии:

1. Не могли бы вы описать сложившуюся ситуацию чуть более подробно?

2. Для чего это? Слияние или оптимистичный параллелизм?

3. имейте в виду, что вы можете использовать контрольную сумму или binary_checksum, чтобы определить, что две строки определенно отличаются, но вы не можете использовать это, чтобы подтвердить, что они в точности одинаковы — могут быть два набора значений, которые отличаются, но возвращают одну и ту же контрольную сумму — так что здесь все еще может быть некоторая серая область.

4. @Damien_The_Unbeliever таким образом, я действительно мог бы генерировать некоторые обновления для записей, которые действительно одинаковы, если я использую контрольную сумму ()

5. @scarpacci — наоборот — вы можете считать, что две строки одинаковы (потому что они имеют одинаковое значение контрольной суммы), когда на самом деле они разные.

Ответ №1:

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

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

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

Ответ №2:

Может помочь, если у нас будет немного больше информации о том, что вы делаете, но в целом опция checksum () работает хорошо, пока у вас есть доступ к исходной контрольной сумме строки для сравнения.