Oracle SQL 更新列的触发器

16

我正在尝试创建一个触发器,当特定标志设置为“Y”时,它会自动添加发布日期。

我对创建触发器没有太多经验,但目前这就是我所做的。

  create or replace
  TRIGGER ADD_CREATE_DT 
  after UPDATE of approved ON articles 
  for each row
  BEGIN
  :new.create_dt := sysdate where approved = 'Y';
  END;

在更新列时,我收到了这个错误:

触发器 'USER.ADD_CREATE_DT' 无效并且无法重新验证

有什么想法吗?

谢谢

3个回答

33

使用 WHEN 子句:

create or replace
  TRIGGER ADD_CREATE_DT 
  after UPDATE of approved ON articles 
  for each row
  when (new.approved = 'Y')
  BEGIN
  :new.create_dt := sysdate;
  END;

或者使用IF:

create or replace
  TRIGGER ADD_CREATE_DT 
  after UPDATE of approved ON articles 
  for each row
  BEGIN
  if :new.approved = 'Y' then
   :new.create_dt := sysdate;
  end if;
  END;

在这种情况下,WHEN更合适和有效。


谢谢 - 我无法让“WHEN”起作用,但“IF”完美运行。 - Jamie Taylor

3
create or replace
  TRIGGER ADD_CREATE_DT 
  after UPDATE of approved ON articles 
  for each row
  BEGIN
    IF :NEW.approved = 'Y' THEN
      :new.create_dt := sysdate;
    END IF;
  END;

2
我不知道你使用的 Oracle 版本是哪个? 在 Oracle 10g 中,我遇到了以下错误:
ORA-04084: cannot change NEW values for this trigger type
04084. 00000 -  "cannot change NEW values for this trigger type"
*Cause:    New trigger variables can only be changed in before row
           insert or update triggers.
*Action:   Change the trigger type or remove the variable reference.

它不允许在AFTER触发器上更改字段。


在这种情况下(被更新的列属于触发器所在的同一张表),使用“BEFORE”触发器似乎更为合适。 - David Faber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接