Triggerek tárolása

Az Oracle a triggert lefordítva, p-kódban tárolja az adatszótárban. A triggerekkel kapcsolatos információk az adatszótárnézetekben érhetők el. A USER_TRIGGERS nézet tartalmazza a törzs és a WHEN feltétel kódját, a táblát és a trigger típusát. Az ALL_TRIGGERS az aktuális felhasználó triggereiről, a DBA_TRIGGERS minden triggerről tartatalmaz információkat.

A trigger és más objektumok közötti függőségekre is igazak a 10. fejezetben leírtak. Egy érvénytelen trigger explicit módon fordítható újra, vagy pedig a következő aktivizálása során automatikusan újrafordítódik.

1. példa

/* Emlékezzünk vissza a tr_ugyfel_kolcsonzes_del
trigger legutóbbi definíciójára;
CREATE OR REPLACE TRIGGER tr_ugyfel_kolcsonzes_del
  INSTEAD OF DELETE ON NESTED TABLE konyvek OF ugyfel_kolcsonzes
  FOR EACH ROW
  CALL konyvtar_csomag.visszahoz(:PARENT.id, :OLD.konyv_id)
/
*/

/* Fordítsuk újra a csomagot, amiben az eljárás, a trigger törzse van. */
ALTER PACKAGE konyvtar_csomag COMPILE;

/* A következő DELETE hatására újra lefordul a trigger. */
DELETE FROM TABLE(SELECT konyvek FROM ugyfel_kolcsonzes WHERE id = 15)
  WHERE konyv_id = 15;

Mint az adatbázis-objektumokra általában, a triggerre is alkalmazható az ALTER és DROP utasítás. Az ALTER alakja:

ALTER TRIGGER [séma.]triggernév

{ENABLE | DISABLE | RENAME TO új_név|

COMPILE [DEBUG] [REUSE SETTINGS]];

A séma megadja azt a sémát, ahol a trigger van (ha nincs megadva, akkor feltételezi a saját sémát). A triggernév a trigger nevét határozza meg.

Az ENABLE engedélyezi, a DISABLE letiltja a triggert. A RENAME átnevezi azt új_név-re.

A COMPILE újrafordítja a triggert, függetlenül attól, hogy érvénytelen-e vagy sem.

A DEBUG arra utasítja a PL/SQL fordítót, hogy kódgenerálás közben használja a PL/SQL nyomkövetőjét.

Az Oracle először újrafordít minden olyan objektumot, amelytől a trigger függ, ha azok érvénytelenek. Ezután fordítja újra a triggert. Az újrafordítás közben töröl minden fordítási kapcsolót, ezeket újraszármaztatja a munkamenetből, majd tárolja őket a fordítás végén. Ezt elkerülendő adjuk meg a REUSE SETTINGS utasításrészt.

Egy trigger törlése az adatszótárból a következő utasításal történik:

DROP TRIGGER triggernév;

2. példa

/* Letiltjuk azt a triggert, amelyik lehetővé teszi
az ugyfel_kolcsonzes nézet konyvek oszlopának módosítását. */
ALTER TRIGGER tr_ugyfel_kolcsonzes_del DISABLE;

DELETE FROM TABLE(SELECT konyvek FROM ugyfel_kolcsonzes WHERE id = 15)
WHERE konyv_id = 45;

/*
Hiba a(z) 1. sorban:
DELETE FROM TABLE(SELECT konyvek FROM ugyfel_kolcsonzes
*
ORA-25015: ezen a beágyazott táblanézet oszlopon nem hajtható végre DML
*/

-- Újra engedélyezzük a triggert.
ALTER TRIGGER tr_ugyfel_kolcsonzes_del ENABLE;

-- Explicit módon újrafordítjuk a régi beállításokkal
ALTER TRIGGER tr_ugyfel_kolcsonzes_del COMPILE REUSE SETTINGS;

-- Át is nevezhetjük:
ALTER TRIGGER tr_ugyfel_kolcsonzes_del RENAME TO tr_ugyf_kolcs_del;