Skip navigation

7. példa

DEMO adatbázis (EMP és DEPT táblák)

Ha saját gépen dolgozol, az alábbi feladathoz letöltheted a DEMO adatbázist, amely létrehozza az EMP és DEPT táblákat.

emp_chg_log

Hozzuk létre az EMPCHGLOG segédtáblát, ahol a tároljuk majd a változásokat!

CREATE TABLE empchglog ( chg_date DATE, chg_desc VARCHAR2(50));

Hozzuk létre a triggert!

CREATE OR REPLACE TRIGGER emp_chg_trig
AFTER INSERT OR UPDATE OR DELETE
ON emp
FOR EACH ROW
DECLARE
     v_empno emp.empno%TYPE;
     v_action VARCHAR2(7);
     v_chgdesc VARCHAR2(30);
BEGIN
    IF INSERTING THEN
        v_action := 'Added';
        v_empno := :NEW.empno;
        v_chgdesc := '';
     ELSIF UPDATING THEN
        v_action := 'Updated';
        v_empno := :NEW.empno;
        v_chgdesc := 'Updated ';
        IF NVL(:OLD.ename, '-null-') != NVL(:NEW.ename, '-null-') THEN
             v_chgdesc := v_chgdesc || 'name';
        END IF;
        IF NVL(:OLD.job, '-null-') != NVL(:NEW.job, '-null-') THEN
              v_chgdesc := v_chgdesc || 'job';
        END IF;
        IF NVL(:OLD.sal, -1) != NVL(:NEW.sal, -1) THEN
               v_chgdesc := v_chgdesc || 'salary';
        END IF;
        IF NVL(:OLD.comm, -1) != NVL(:NEW.comm, -1) THEN 
               v_chgdesc := v_chgdesc || 'commission';
        END IF;
        IF NVL(:OLD.deptno, -1) != NVL(:NEW.deptno, -1) THEN
              v_chgdesc := v_chgdesc || 'department';
        END IF;
   ELSIF DELETING THEN
        v_action := 'Deleted';
        v_empno := :OLD.empno;
        v_chgdesc := '';
   END IF;
   INSERT INTO empchglog VALUES (SYSDATE, v_action || ' employee # ' || v_empno || v_chgdesc);
END;

Megjegyzés:

Az NVL() függvény két paraméterrel rendelkezik. Megnézi, hogy az első paraméter értéke NULL-e, ha igen, akkor a második paraméter értékével tér vissza, ha nem, akkor az első paraméter értékével tér vissza. Ezzel tulajdonképpen a NULL értéknek lehet valamilyen más, vizsgálható értéket adni.

Hajtsunk végre pár műveletet!

INSERT INTO emp VALUES (9003,'PETERS','ANALYST',7782,SYSDATE,5000.00,NULL,40);INSERT INTO emp VALUES (9004,'AIKENS','ANALYST',7782,SYSDATE,4500.00,NULL,40);UPDATE emp SET comm = sal * 1.1 WHERE empno IN (9003, 9004);

Nézzük meg az EMPCHGLOG tábla tartalmát!

SELECT * FROM empchglog;

Mit csinál a trigger?