【发布时间】:2014-11-15 20:32:18
【问题描述】:
我有一个在特定条件下触发的触发器,当我更新 EMPLOYEES table 中的一些数据时(特别是当 inserting、deleting 和 updating 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)
我的问题是:当updating rows 带有其他值(如email 带有comm_pct 和其他字段)时,我如何在AUDIT_E 中执行INSERT(因为我必须将旧值和新值注册到其中) ,除了只更新comm_pct 和salary)?因为我的触发器有以下结构:
IF 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
非常感谢你能帮助我,对不起我的英语。
编辑:当我在 inserting、deleting 行和 updating 仅 comm_pct 和 salary 时,我的触发器运行良好,将更改注册到 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 |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
但是,例如,当我更改 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 | NULL | NULL | NULL
我希望将这些更改保存到 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
【问题讨论】:
-
恐怕我不明白你问的问题。您发布的触发器大纲似乎无效——如果您真的有
ELSIF子句,那么您不会想要所有END IF的。如果您想拥有多个IF语句,您将保留END IF并将ELSIF替换为IF。但我不相信这是你要问的问题。 -
我更正了我发布的代码。我的想法是有一个历史表(在本例中为 AUDIT_E),它在员工表中注册所有使用 INSERT、UPDATE 和 DELETE 更改的值。但我的问题是我想注册我的更改,这些更改不仅会更改薪水或 comm_pct 的值,也不会在员工中添加或删除行
-
触发器在 EMPLOYEES 表上,不是吗?如果是,您拥有所有想要存储在 AUDIT_E 中的数据,不是吗?
-
触发器正在对员工执行。但我想将数据存储到 audit_e。当我插入一行、删除一行以及更新 comm_pct 和/或薪水时,我可以存储数据。但我希望我的触发器(在 audit_e 中)注册员工所做的其他更改(如更改 job_id、first_name 等)
标签: sql oracle plsql triggers oracle-sqldeveloper