Frage

Ich habe eine wirklich große Datenbank (läuft auf PostgreSQL) eine Menge von Tabellen mit hoch entwickelten Beziehungen zwischen ihnen (Fremdschlüssel, auf Lösch Kaskade usw.) enthält. Ich brauche einige Daten aus einer Reihe von Tabellen entfernen, aber ich bin nicht sicher, welche Menge an Daten wirklich aus der Datenbank Umzüge aufgrund Kaskade gelöscht werden.

Wie kann ich prüfen, ob ich nicht Daten löschen, die nicht gelöscht werden sollen?

Ich habe eine Testdatenbank - nur eine Kopie der realen wo ich tun kann, was ich will:)

Die einzige Idee, die ich habe, ist dump database vor und nach und überprüfen. Aber es sieht nicht bequem. Eine weitere Idee - ein Teil der Datenbank-Dump, dass, wie ich glaube, nicht durch meine DELETE-Anweisungen und lesen Sie in diesem Teil beeinflusst werden vor und nach der Datenlöschung. Aber ich keine einfache Möglichkeiten sehen, es zu tun (es gibt Hunderte von Tabellen und Entfernung sollte mit ~ 10 von ihnen arbeiten). Gibt es eine Möglichkeit, es zu tun?

Jede andere Ideen, wie das Problem zu lösen?

War es hilfreich?

Lösung

Sie können die information_schema abfragen, sich ein Bild zu zeichnen, wie die Einschränkungen in der Datenbank definiert sind. Dann werden Sie wissen, was passieren wird, wenn Sie löschen. Dies wird nützlich sein, nicht nur für diesen Fall, sondern immer.

So etwas wie (für Einschränkungen)

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

Andere Tipps

psql verwenden, um eine Transaktion zu starten, Ihre Löschungen durchführen, dann führen, was Überprüfung Abfragen, die Sie sich vorstellen können. Sie können dann entweder ein Rollback oder begehen.

Wenn die Sorge ist, Schlüssel baumelt links (d.h .: auf einen gelöschten Datensatz zeigt), dann das Löschen auf der Testdatenbank ausführen, dann Abfragen verwenden, um alle Schlüssel zu finden, die jetzt auf ungültige Ziele zeigen. (Während Sie dies tun, können Sie auch den Teil sicherstellen, dass nicht betroffen sein sollten nicht ändern)

Eine bessere Lösung wäre Zeitzuordnung aus den Lösch Kaskaden zu verbringen, so dass Sie wissen, was zu erwarten -. Zu wissen, wie Ihre Datenbank funktioniert ziemlich wertvoll ist, so dass der Aufwand verbrachte auf diesem jenseits dieser besonderen Streichung von Nutzen sein wird

Und egal, wie sicher Sie sind wieder die DB bis vor große Veränderungen zu tun!

Vielen Dank für die Antworten!

Vinko, Ihre Antwort ist sehr nützlich für mich, und ich werde studieren Dipper.

eigentlich für meinen Fall, es war genug, um Tabellen zu vergleichen zählt vor und nach Aufzeichnungen Löschen und überprüfen, welche Tabellen wurden davon betroffen.

es wurde durch einfache Befehle getan beschrieben unter

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top