Lab 6

backback

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ć.

Debugowanie

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.

backback