CREATE TRIGGER Sprawdzenie_zarobków BEFORE INSERT OR UPDATE OF Zarobki, Stanowisko ON Pracownicy FOR EACH ROW DECLARE minimum NUMBER; maksimum NUMBER; BEGIN /* Znalezienie zakresu zarobków na danym stanowisko */ SELECT Min_zar, Mak_zar INTO minimum, maksimum FROM Widełki WHERE Stanowisko = :NEW.Stanowisko; /* Jeśli zarobki spoza zakresu, generuj błąd */ IF :NEW.Zarobki Maksimum THEN Raise_application_error(-20500,'Zarobki=' ||:NEW.Zarobki|| 'spoza zakresu'); END IF; END; /* Koniec wyzwalacza */ ----------------------------------- CREATE TRIGGER Budżet_działu AFTER DELETE OR INSERT OR UPDATE OF Zarobki, Num_działu ON Pracownicy FOR EACH ROW BEGIN /* Zakładamy, że Zarobki, Num_działu nie są NULL */ IF DELETING OR (UPDATING AND :OLD.Num_działu <> :NEW.Num_działu) THEN UPDATE Budżet SET Fund_płac = Fund_płac - :OLD.Zarobki WHERE Id_działu = :OLD.Num_działu; END IF; IF INSERTING OR (UPDATING AND :OLD.Num_działu <> :NEW.Num_działu) THEN UPDATE Budżet SET Fund_płac = Fund_płac + :NEW.Zarobki WHERE Id_działu = :NEW.Num_działu; END IF; IF UPDATING AND (:OLD.Num_działu = :NEW.Num_działu) AND (:OLD.Zarobki <> :NEW.Zarobki) THEN UPDATE Budżet SET Fund_płac=Fund_płac-:OLD.Zarobki+:NEW.Zarobki WHERE Id_działu = :OLD.Num_działu; END IF; END; --------------------------------------------- CREATE TRIGGER GenerujIdPracccc BEFORE INSERT ON emp FOR EACH ROW BEGIN SELECT NVL(MAX(empno)+1,1) INTO :NEW.empno FROM emp; END; -------------------------------------------- CREATE TRIGGER Ustaw_null_dept AFTER DELETE OR UPDATE OF Deptno ON Dept FOR EACH ROW BEGIN IF UPDATING AND :OLD.Deptno <> :NEW.Deptno OR DELETING THEN UPDATE Emp SET Emp.Deptno = NULL WHERE Emp.Deptno = :OLD.Deptno; END IF; END; ---------------------------------------- Wyzwalacz bazy danych może być włączany i wyłączany za pomocą instrukcji: ALTER TRIGGER wyzwalacz {ENABLE|DISABLE}; Wyzwalacz może zostać usunięty za pomocą instrukcji: DROP TRIGGER wyzwalacz; Informacje o wyzwalaczach znajdują się w perspektywie słownika danych User_triggers. Aby je obejrzeć piszemy (nazwę wyzwalacza dużymi literami): SELECT Trigger_type, Table_name, Triggering_event FROM User_triggers WHERE Trigger_name = ‘wyzwalacz’; lub SELECT Trigger_body FROM User_triggers WHERE Trigger_name = ‘wyzwalacz’;