【问题标题】:Is possible use a not updated column in trigger body?是否可以在触发器正文中使用未更新的列?
【发布时间】:2017-02-03 15:45:49
【问题描述】:

我正在编写用于在新表中插入更新行的 DML 触发器。仅当更新单个列时才会触发触发器,但是...是否可以在 UPDATE OF one_single_column 子句之外的其他列中使用触发器主体?

审计表:

CREATE TABLE employees_salary_history(
  user_name             VARCHAR2(45) NOT NULL,
  time_stamp            date DEFAULT (sysdate),
  employee_id           NUMBER(6),
  old_salary            NUMBER(8, 2),
  new_salary            NUMBER(8, 2),
  percente_raise_salary NUMBER(8, 2));

DML 触发器:

CREATE OR REPLACE TRIGGER update_salary_trg
AFTER
UPDATE 
OF salary
ON employees23
FOR EACH ROW
DECLARE
  v_user VARCHAR2(25);
BEGIN
  SELECT user
  INTO   v_user
  FROM   dual;

  INSERT INTO employees_salary_history
  VALUES(
      v_user, 
      sysdate, 
      employee_id, -- I would like add employee_id about employee that was updated, 
      :OLD.salary,
      :NEW.salary, 
      TRUNC((:NEW.salary - :OLD.salary) / :OLD.salary * 100, 3)
  );
END update_salary_trg;

当我省略“employee_id”列时,触发器可以正常工作,但我想添加employee_id 作为更新工资的参考。当我添加employee_id 列时,我收到以下错误:

Errors: check compiler log
Errores para TRIGGER HR.UPDATE_SALARY_TRG:

LINE/COL ERROR
-------- ----------------------------------
8/3      PL/SQL: SQL Statement ignored
8/15     PL/SQL: ORA-00913: too many values

【问题讨论】:

  • 感谢您的回复。这是同一件事。 “忽略 SQL 语句”“值太多”

标签: oracle plsql triggers database-trigger


【解决方案1】:

这是因为触发器无法引用employee_id 字段。在你的情况下 New 和 OLD 将是相同的。所以只需将employee_id 替换为:OLD.employee_id 或:NEW。 employee_id 如下所示。希望对您有所帮助。

CREATE OR REPLACE TRIGGER update_salary_trg
AFTER
UPDATE 
OF salary
ON employees23
FOR EACH ROW
DECLARE
  v_user VARCHAR2(25);
BEGIN
  SELECT user
  INTO   v_user
  FROM   dual;

  INSERT INTO employees_salary_history --employees_salary_history
  VALUES(
      v_user, 
      sysdate, 
      :NEW.employee_id, -- I would like add employee_id about employee that was updated, 
      :OLD.salary,
      :NEW.salary, 
      TRUNC((:NEW.salary - :OLD.salary) / :OLD.salary * 100, 3)
  );
END update_salary_trg;

【讨论】:

  • 感谢您的帮助!
【解决方案2】:

是的,可以在触发器中使用employees23-table 的任何列。

如果列未更改,则 :old:new 伪记录的值相同。

所以在你的情况下,只需使用:new.employee_id

接下来我向您推荐 RTFM:PL/SQL Triggers。它还详细说明了伪记录何时可用以及它们所持有的值。

【讨论】:

  • 感谢您的帮助!
猜你喜欢
  • 2010-12-18
  • 1970-01-01
  • 2013-09-09
  • 2011-02-02
  • 2012-04-08
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多