使用触发器进行审计操作

时间:2014-11-15 20:32:18

标签: sql oracle plsql triggers oracle-sqldeveloper

我有一个在某些条件下触发的触发器,当我更新EMPLOYEES table中的某些数据时(特别是在insertingdeletingupdating comm_pct时和salary)所做的更改已注册到下表中:

CREATE TABLE "HR"."AUDIT_E" ("USR" VARCHAR2(30 BYTE) DEFAULT USER,
    "DATE" DATE DEFAULT SYSDATE,
    "DML_TYPE"  VARCHAR2), -- UPDATE, INSERT, DELETE
    "OLD_EMPLOYEE_ID" NUMBER, 
"OLD_FIRST_NAME" VARCHAR2,  
...,--more fields
"OLD_JOB_ID" VARCHAR2, 
"OLD_SALARY" NUMBER, 
"OLD_COMMISSION_PCT" NUMBER,  
"NEW_FIRST_NAME" VARCHAR2, 
..., -- more fields!
"NEW_JOB_ID" VARCHAR2, 
"NEW_SALARY" NUMBER, 
"NEW_COMMISSION_PCT" NUMBER)

我的问题是:当INSERT与其他值AUDIT_E时,如何在updating rowsemail(因为我必须在其中注册旧值和新值)comm_pct } comm_pct和其他字段,除了仅更新salaryIF DELETING THEN --some actions -- Insert into AUDIT_E(...) values... ELSIF INSERTING THEN --some actions -- Insert into AUDIT_E(...) values... ELSIF UPDATING ('a field') THEN --I have two of these --some actions -- Insert into AUDIT_E(...) values...comm_pct/salary )之外?因为我的触发器具有以下结构:

audit_e

非常感谢你能帮助我,对不起我的英语。

编辑:当我insertingdeleting行和updatingcomm_pctsalary时,我的触发器会对AUDIT_E: ID |Oper|Old_Name|Old_job_id|Old_comm_pct|Old_Salary|New_name|New_job_id|New_comm_pct|New_salary ------------------------------------------------------------------------------------------------ 1 |Ins | NULL | NULL | NULL | NULL |Kappa | SA_REP | 0.2 | 4980 2 |Upd | Kappa | SA_REP | 0.2 | 4980 | NULL | NULL | 0.3 | NULL 3 |Upd | Kappa | SA_REP | 0.3 | 4980 | NULL | NULL | NULL | 5000 4 |Del | Kappa | SA_REP | 0.3 | 4980 | NULL | NULL | NULL | NULL 进行精确的域名更改:

AUDIT_E:
ID |Oper|Old_Name|Old_job_id|Old_comm_pct|Old_Salary|New_name|New_job_id|New_comm_pct|New_salary
------------------------------------------------------------------------------------------------
1  |Upd |Kappa   | SA_REP   | 0.2        | 4980     | NULL   | NULL     | NULL        | NULL 

但是当我更改job_id时(例如添加额外的elsif更新),更改会被保存到audit_e中:

 AUDIT_E:
ID |Oper|Old_Name|Old_job_id|Old_comm_pct|Old_Salary|New_name|New_job_id|New_comm_pct|New_salary
------------------------------------------------------------------------------------------------
1  |Upd |Kappa   | SA_REP   | 0.2        | 4980     | NULL   | IT_PROG  | NULL       | NULL 

我希望将这些更改保存到audit_e表中,如下所示:

{{1}}

1 个答案:

答案 0 :(得分:0)

我仍然不确定我是否理解这个问题。我猜你只想要像

这样的东西
CREATE OR REPLACE TRIGGER trigger_name
  AFTER INSERT OR UPDATE OR DELETE
  ON employees
  FOR EACH ROW
BEGIN
  INSERT INTO audit_e( dml_type, 
                       old_employee_id, new_employee_id,
                       old_first_name, new_first_name,
                       ...
                     )
    VALUES( CASE WHEN deleting 
                 THEN 'D'
                 WHEN inserting 
                 THEN 'I'
                 WHEN updating
                 THEN 'U'
                 ELSE 'X'
             END,
            :old.employee_id, :new.employee_id,
            :old.first_name, :new.first_name,
            ...
           );
END;

那就是说,我不清楚为什么每次都要在审计表中存储旧数据和新数据。 old_*值始终与前一行的new_值相同。将new_值存储在审计表中通常是有意义的。