Как проверить, что я удалил только необходимые данные?

StackOverflow https://stackoverflow.com/questions/132070

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

Винко, твой ответ для меня очень полезен и я изучу его, Диппер.

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

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

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top