Как проверить, что я удалил только необходимые данные? - PullRequest
1 голос
/ 25 сентября 2008

У меня действительно большая база данных (работает на PostgreSQL), содержащая множество таблиц со сложными отношениями между ними (внешние ключи, каскад удаления и т. Д.). Мне нужно удалить некоторые данные из нескольких таблиц, но я не уверен, какой объем данных будет действительно удален из базы данных из-за каскадного удаления.

Как я могу убедиться, что я не буду удалять данные, которые не должны быть удалены?

У меня есть тестовая база данных - просто копия реальной, где я могу делать то, что хочу:)

Единственная идея, которую я имею, - это создать базу данных до и после и проверить ее. Но это не выглядит комфортно. Другая идея - выгрузить часть базы данных, которая, как я думаю, не должна быть затронута моими инструкциями DELETE, и проверять эту часть до и после удаления данных. Но я не вижу простых способов сделать это (есть сотни таблиц, и удаление должно работать с ~ 10 из них). Есть ли способ сделать это?

Есть еще идеи, как решить проблему?

Ответы [ 4 ]

1 голос
/ 25 сентября 2008

Используя psql, запустите транзакцию, выполните удаление, а затем выполните все проверочные запросы, которые вы можете себе представить. Затем вы можете откатиться или зафиксировать.

1 голос
/ 25 сентября 2008

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

Что-то вроде (для ограничений)

select table_catalog,table_schema,table_name,column_name,rc.* from
information_schema.constraint_column_usage ccu, 
information_schema.referential_constraints rc 
where ccu.constraint_name = rc.constraint_name
0 голосов
/ 25 сентября 2008

Спасибо за ответы!

Винко, твой ответ очень полезен для меня, и я буду изучать его, Медведица.

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

это было сделано с помощью простых команд, описанных ниже

psql -U U_NAME -h`hostname` -c '\d' | awk '{print $3}' > tables.list

for i in `cat tables.list `; do echo -n "$i: " >> tables.counts; psql -U U_NAME -h`hostname` -t -c "select count(*) from $i" >> tables.counts; done

for i in `cat tables.list `; do echo -n "$i: " >> tables.counts2; psql -U U_NAME -h`hostname` -t -c "select count(*) from $i" >> tables.counts2; done

diff tables.counts tables.counts2
0 голосов
/ 25 сентября 2008

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

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

И независимо от того, насколько вы уверены, что восстановили базу данных, прежде чем делать большие изменения!

...