Oracle: триггер для обновления

У меня есть две таблицы следующим образом

Emp(eno, ename, sal)
salHistory( empNo, ename, oldSal, newSal, salDif)

Я хочу знать, как создать триггер (имя триггера — зарплата_изменения), который должен запускаться всякий раз, когда таблица «Emp» получает оператор UPDATE для изменения salary column (Sal) сотрудника. Задача этого триггера — записать empNo, ename, oldSal, newSal, salDif в вызов таблицы SalHistory.

(Здесь salDif означает разницу в зарплате)

Спасибо .....


person Harindu    schedule 02.02.2014    source источник


Ответы (1)


Прежде всего, я бы предложил как минимум два изменения в таблице salhistory:

  1. Определите saldif как вычисляемый столбец
  2. Добавление столбца для хранения даты и времени, когда произошло изменение, иначе вы не сможете отличить одно изменение от другого.

При этом схема таблицы для salhistory может выглядеть примерно так

CREATE TABLE salhistory
(
  empno NUMBER NOT NULL, 
  ename VARCHAR2(32) NOT NULL, 
  oldsal NUMBER(10,2) NOT NULL, 
  newsal NUMBER(10,2) NOT NULL, 
  saldif NUMBER(10,2) AS (newsal - oldsal),
  changed DATE NOT NULL,
  PRIMARY KEY (empno, changed)
);

Теперь триггер

CREATE OR REPLACE TRIGGER tg_salary_history
AFTER UPDATE ON emp
FOR EACH ROW
WHEN (NEW.sal <> OLD.sal) -- log a salary change only if the salary has been actually changed
BEGIN
  INSERT INTO salhistory (empno, ename, oldsal, newsal, changed) VALUES
  (:OLD.eno, :OLD.ename, :OLD.sal, :NEW.sal, SYSDATE());
END;
/

Вот демонстрация SQLFiddle.

person peterm    schedule 03.02.2014