Błąd: cannot ALTER TABLE "addresses" because it has pending trigger events (SQLSTATE 55006)

0

Cześć,

chciałbym pousuwać trochę starych danych z bazy na której pracuje. Żeby to zrobić, to wołam najpierw "disable trigger" na tabeli, żeby uniknąć problemów. Wszystko dzieje się w transakcji. Mój kod:

Mój kod:

BEGIN;
ALTER TABLE addresses DISABLE TRIGGER timetravel_before;
ALTER TABLE addresses DISABLE TRIGGER timetravel_after;
delete from addresses a where a.id in (115642, 115643, 115644);
ALTER TABLE addresses enable TRIGGER timetravel_after;
ALTER TABLE addresses enable TRIGGER timetravel_before;
COMMIT;

Jak próbuje uruchomić to dostaje błąd:

psql:1.sql:5: ERROR:  cannot ALTER TABLE "addresses" because it has pending trigger events
psql:1.sql:6: ERROR:  current transaction is aborted, commands ignored until end of transaction block

Naczytałem się interenetów i wciąż nie wiem jak to rozwiązać.
Przygotowuje skrypt, który będzie czyścił, na razie testuje to na lokalnej bazie na swojej maszynie do której nikt nie jest podłączony, więc żadne inne zapytania nie powinny blokować tego, co próbuje zrobić.

Ma ktoś może jakiś pomysł co z tym zrobić, co sprawdzić itd.?

1

Moźe spróbuj scommitować najpier transakcję disablująca trigery, a potem delete i enable?

0
lion137 napisał(a):

Moźe spróbuj scommitować najpier transakcję disablująca trigery, a potem delete i enable?

To by pomogło, ale w takim razie wszystko mógłbym zrobić jako osobne zapytania SQL.

Okazuje się, że użycie ALTER TABLE addresses enable TRIGGER all; i ALTER TABLE addresses disable TRIGGER all; rozwiązuje problem, ale nie wiem dlaczego. Czyli w całości to będzie:

BEGIN;
ALTER TABLE addresses DISABLE TRIGGER all;
delete from addresses a where a.id in (115642, 115643, 115644);
ALTER TABLE addresses enable TRIGGER all;
COMMIT;
1

Nie rób

DISABLE TRIGGER ALL

Zrób

DISABLE TRIGGER USER
0
Marcin.Miga napisał(a):

Nie rób

DISABLE TRIGGER ALL

Zrób

DISABLE TRIGGER USER

jak to zmienię w ten sposób, to dostaje ten sam błąd tj.:

ERROR: cannot ALTER TABLE "addresses" because it has pending trigger events

0

Wykonując zapytanie:

SELECT *
FROM pg_trigger
WHERE tgrelid = 'addresses'::regclass;

widzę, ze mam na tej tabeli 10 triggerów stworzonych przez constrainty. Pewnie przez jeden lub więcej z nich nie mogę usunąć danych:

screenshot-20240125150022.png

2

I właśnie tak ma być.
DELETE TRIGGER USER różni się od DELETE TRIGGER ALL, że ten pierwszy wyłącza tylko twoje triggery. Zostawia te od constraintów i sekwencerów.
Nie po to ustawiasz constrainta na spójność danych, by potem wywalać rekordy i rozwalac klucze obce.

1 użytkowników online, w tym zalogowanych: 0, gości: 1