Kiedy próbuję wykonać pg_restore.exe
plik 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.exe
od wewnątrz psql.exe
po 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 -clean
flagą tworzy zrzut, który omija sprawdzanie ograniczeń podczas przywracania bazy danych?
źródło
Odpowiedzi:
Czy wypróbowałeś już taką
--disable-triggers
opcję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-only
przywracania i wymaga również przekazania--superuser=username
opcji.źródło