2012-03-22 7 views
1

У меня есть проблема, что я пока не смог найти решение. У меня есть база данных (на самом деле тысячи из них на сайтах клиентов), что я хочу периодически извлекать данные. Я хотел бы сделать полный вывод данных один раз (выберите * из таблицы), после чего только получить строки, которые изменились.Поиск измененных записей в таблице базы данных

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

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

+0

Пойдите в строки auto-increment id каждой таблицы в каждой базе данных (на самом деле). –

+0

Да, я предполагаю, что если это MySQL, скорее всего, будут автоинкрементные столбцы id почти для всех таблиц. Если это так, я думаю, вы могли бы написать сценарий или вручную пометить, с каким идентификатором вы остановились. – Gohn67

+0

делает ваш вкус sql-запроса командной строки? – cctan

ответ

0

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

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

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

Вы можете попробовать что-то вроде триггера «вместо удаления», если ваша RDBMS поддерживает его и NULL поле last_update. На последующих дампах данных grap все recoirds, где это поле NULL, а затем удаляют их. Но были бы проблемы с этим (например, как остановить приложение, видящее их между логическим и физическим удалением)

Самый эффективный метод доказательства, который я вижу, это aset таблиц истории (аудита), и для них записывается ech change , Затем вы выбираете дамп данных.

Кстати, вы только заботитесь о том, чтобы знать, что произошло? Как насчет того, произошло ли 2 (или более) обновления. Стол истории - единственный способ, которым я могу видеть, как вы захватываете этот сценарий.

+0

Спасибо. Я не буду добавлять триггеры в эту базу данных, и запись в базу данных вообще будет отрывочной. Мне все равно, изменилась ли строка с момента последнего запроса. Неважно, сколько раз оно менялось или какие были промежуточные изменения. –

+0

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

+0

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

0

Это должно изолировать строки, которые были изменены с момента последней резервной копии. Предполагая, что DestinationTable является копией SourceTable даже в ключевых полях; если нет, вы можете перечислить важные поля.

SELECT * FROM SourceTable 
EXCEPT 
SELECT * FROM DestinationTable 
Смежные вопросы