Oracle:触发更新

时间:2014-02-02 07:56:23

标签: oracle triggers auditing

我有两张表如下

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

我想知道的是如何创建一个触发器(触发器的名称是salary_change),只要“Emp”表获得UPDATE声明来更改员工的salary column (Sal),就应该触发该触发器。此触发器的目标是将empNoenameoldSalnewSalsalDif写入表格调用SalHistory

(在这里salDi f表示工资差异)

谢谢......

1 个答案:

答案 0 :(得分:0)

首先,我建议对salhistory表至少进行两次更改:

  1. saldif定义为计算列
  2. 添加列以在发生更改时存储日期时间,否则您将无法告知另一个更改。
  3. 据说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 演示