SQL Server получить только обновленную запись - PullRequest
2 голосов
/ 28 января 2010

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

Ответы [ 5 ]

2 голосов
/ 28 января 2010

Использование Транзакционная репликация .

Обновление

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

1 голос
/ 28 января 2010

Вам нужно одно из следующих

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

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

Если исключить одно из вышеперечисленных и запретить некоторые настройки встроенной репликации MS-SQL, единственная другая возможность, о которой я могу подумать, - это [не красиво]:

  • синтаксический анализ журнала SQL для определения обновлений и дополнений в таблице. Это требует специализированного программного обеспечения; Я даже не уверен, что формат файла журнала опубликован / задокументирован, хотя я видел этот тип инструментов. Откровенно говоря, этот подход больше подходит для ситуаций криминалистического типа ...
0 голосов
/ 28 января 2010

В сумме:

  1. У вас есть более старый удаленный сервер БД, в котором вы ничего не можете изменить (например, таблицы, триггеры и т. Д.).
  2. Вы не можете использовать репликацию.
  3. В самих данных нет указания даты / времени их последнего изменения.
  4. Вы не хотите каждый раз опускать всю таблицу вниз.

Это оставляет нас в невозможной ситуации.

Вы можете выбрать вариант, только если первые 3 пункта, указанные выше, соответствуют действительности, - это вытянуть всю таблицу. Даже если у них был измененный столбец даты / времени, вы не обнаружите удаления. Что оставляет нас на первом месте.

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

0 голосов
/ 28 января 2010

Я решил эту проблему с помощью утилиты tablediff, которая сравнивает данные в двух таблицах на предмет отсутствия сходимости и особенно полезна для устранения неполадок сходимости в топологии репликации.

См. Ссылку.

утилита tablediff

0 голосов
/ 28 января 2010

Если вы не можете изменить базу данных удаленного сервера, лучшим вариантом может быть создание какой-либо хеш-функции для значений данной строки, сравнение старой и новой таблиц и извлечение только тех, где функция (oldrow)! = функция (newrow).

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

Это означает, что вы не можете изменять значения в новой таблице, иначе они будут ежедневно перезаписываться из старой. Если это проблема, вам понадобится другая таблица, в которой будут кэшироваться значения старой таблицы за день до этого; тогда вы сможете определить, были ли старые, новые или оба были изменены за это время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...