Ukośniki w skrypcie należy ignorować.
W DBeaverze żeby stworzyć trigger należy uruchomić go jako pojedynczą instrukcję. W szczególności tworzenie kilku triggerów na raz za pomocą Execute as script może nie zadziałać.
Aby dowiedzieć się, o co dokładnie chodzi w przypadku błędu:
ORA-04098 trigger/procedure/function is invalid
można spojrzeć na systemową tabelę błędów:
SELECT * FROM user_errors
albo dla konkretnego triggera o nazwie Foo
:
SELECT * FROM user_errors WHERE type = 'TRIGGER' AND name = 'FOO'
W kolumnie TEXT
będzie tekstowy opis błędu.
Uwaga: name
zawsze będzie all-capsem, Oracle w ten sposób normalizuje wszystkie nazwy (nie tylko triggerów).
FOR EACH ROW
i ORA-04091
Pisząc triggery FOR EACH ROW
łatwo trafić na błąd:
ORA-04091: table FOO is mutating, trigger/function may not see it
Jest tak ponieważ Oracle jest głupi i nie potrafi zagwarantować, że nasz AFTER
trigger odpali się po tym, jak wszystkie zmiany z danej instrukcji zostaną odzwierciedlone w tabeli. Innymi słowy, gdy trigger przetwarza dany wiersz nie mamy gwarancji, że nie będziemy widzieć częściowej aktualizacji tabeli, a nie całej.
Rozwiązaniem tego problemu jest użycie jakiejś sensownej bazy danych (np. Postgresa), gdzie takich problemów nie ma, albo przepisanie triggera na taki bez FOR EACH ROW
.