wyłącz ograniczenia przed użyciem pg_restore.exe

16

Kiedy próbuję wykonać pg_restore.exeplik zrzutu z bazy danych, generuje dziesiątki błędów, wszystko to samo:

ERROR: insert or update on table "someTable" violates foreign key constraint "aConstraintName"

Wynika to oczywiście z faktu, że opróżniłem bazę danych przed przywróceniem jej z pliku zrzutu (ten plik pochodzi z produkcyjnej bazy danych) ... to oczywiście żadne ograniczenie kluczy obcych nie może być w porządku, jeśli jedna tabela odniesienia jest pusta ...

Czy istnieje sposób, aby wyłączyć ograniczenia i wszystkie klucze obce dla wszystkich tabel, zanim zadzwonię pg_restore.exe, a następnie ponownie włącz ograniczenia i klucze obce.

W SO znalazłem coś interesującego: odroczenie sprawdzania ograniczeń w celu zatwierdzenia czasu . Ale nie sądzę, żebym mógł zadzwonić pg_restore.exeod wewnątrz psql.exepo odłożeniu ograniczeń.

Jest też ten post sprzed 10 lat, sugerujący usunięcie, a następnie ponowne dodanie ograniczeń. Lub zmienić wartość ponownego wyzwalania pg_class na 0 i byłoby to również możliwe w przypadku ograniczeń ... ale obawiam się, że to bardziej hakowanie niż dobra praktyka ...

Co radzisz, jaka jest najlepsza praktyka w tym przypadku? Czy użycie pg_dump.exe z -cleanflagą tworzy zrzut, który omija sprawdzanie ograniczeń podczas przywracania bazy danych?

Stephane Rolland
źródło
Wysłano tutaj, na wypadek, gdyby ktoś znalazł to później: stackoverflow.com/questions/12093654/...
Craig Ringer

Odpowiedzi:

28

Czy wypróbowałeś już taką --disable-triggersopcję pg_restore?

Zgodnie z dokumentacją: użyj tej opcji, jeśli masz sprawdzanie integralności referencyjnej lub inne wyzwalacze w tabelach, których nie chcesz wywoływać podczas ponownego ładowania danych.

Należy pamiętać, że dotyczy to tylko --data-onlyprzywracania i wymaga również przekazania --superuser=usernameopcji.

Matthew Wood
źródło
I działa jak urok ...
Stephane Rolland