Получение разницы в базе данных MySQL - PullRequest
3 голосов
/ 02 июля 2010

У меня есть база данных mysql. То, что я хотел бы сделать, это выполнить произвольное действие, а затем выяснить, что изменилось. Примерно так:

//assume connection to db already established

before();//saves db state
perform_action();//does stuff to db
diff();//prints what happened

Я бы хотел, чтобы он вывел что-то вроде:

Row added in table_0 ]details]
Row added in table_1 [details]
Row modified in table_5 [details]
Row deleted in table_2 [details]

Есть идеи?


Для дальнейшего уточнения: вы знаете, как в stackoverflow, если вы проверяете изменения сообщения, вы можете видеть красные линии / зеленые выделения, указывающие, что было изменено? Я хочу что-то подобное, но для баз данных MySQL.

Ответы [ 4 ]

4 голосов
/ 02 июля 2010

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

http://dev.mysql.com/doc/refman/5.0/en/triggers.html

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

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

1 голос
/ 02 июля 2010

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

Чтобы сделать это так, как вы описали, вы можете записать содержимое базы данных в файл до и после вашего действия и выполнить diff для двух файлов. В php вы можете проверить xdiff: http://us.php.net/manual/en/book.xdiff.php

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

0 голосов
/ 02 июля 2010

Единственное, о чем я могу думать, это сделать несколько комбинаций нескольких хакерских вещей:

  1. Сохранить [временную?] Таблицу идентификаторов строк, чтобы проверить наличие новых строк,Если вам необходимо узнать, что было в удаленных или измененных строках, вам нужно скопировать всю БД, что было бы довольно грязно.

  2. У каждой строки есть дата, которая получаетизменено при обновлении;захватить строки, для которых обновленная метка даты новее, чем при начале анализа.

  3. Наличие слоя между вашим приложением и базой данных (если у вас есть что-то вроде классического $db->query(), этосделать это легко), журналы запросов отправлены, которые затем можно посмотреть.

Я полагаю, реальный вопрос заключается в том, хотите ли вы знать, какие запросы выполняются к БД, или еслиВы хотите знать, что на самом деле делают те запросы, которые вы выполняете.

0 голосов
/ 02 июля 2010

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

...