【问题标题】:Oracle SQL trigger on update of column更新列时的 Oracle SQL 触发器
【发布时间】:2020-10-10 22:03:12
【问题描述】:

我正在尝试为我的表创建一个触发器,该触发器会根据某个标志设置为“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' 无效,重新验证失败

有什么想法吗?

谢谢

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    使用 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' 工作完美
    【解决方案2】:
    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;
    

    【讨论】:

      【解决方案3】:

      不知道你用的是什么版本的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 触发器在这种情况下似乎更合适(正在更新的列属于触发器所在的同一个表)。
      猜你喜欢
      • 2016-06-11
      • 2012-04-20
      • 2013-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-05
      • 1970-01-01
      相关资源
      最近更新 更多