【问题标题】:Nullify an inserting value in a row trigger在行触发器中取消插入值
【发布时间】:2019-03-01 12:44:25
【问题描述】:

我的数据库触发器有问题,我应该在其中取消插入/更新的值 (RESULTATOBT),尽管我需要 OLD/NEW 变量,所以我不能应用 this solution (updating the table in the table trigger)

错误是一个变异表;由于在 for each row 触发器中修改了一个表。

这是我的代码的相关摘录:

CREATE OR REPLACE TRIGGER VERIF_RESULTATS
  AFTER INSERT OR UPDATE OF RESULTATOBT
  ON PARTICIPATION
  FOR EACH ROW
  FOLLOWS VERIF_PARTICIPATION
  WHEN ( NEW.RESULTATOBT IS NOT NULL )
BEGIN 
  UPDATE PARTICIPATION p
  SET RESULTATOBT = NULL
  WHERE p.CDPERS = :NEW.CDPERS
    AND p.CDCOMPET = :NEW.CDCOMPET;
END;
/

提前感谢您的帮助。

注意:我是一个相对较新的成员,所以如果我的问题不符合正确的格式,我可能需要额外的建议/修改。

【问题讨论】:

  • 你没说有什么问题。
  • 我猜你可能遇到了变异表错误?将您遇到的错误包括在问题中确实很有帮助,可能与生成错误的插入/更新语句一起。 VERIF_PARTICIPATION 在插入/更新之前或之后做什么?如果在插入/更新之前,您可能只能通过赋值而不是另一个更新语句将值设为空。触发器可能不是您正在做的任何事情的最佳方法 - 将业务逻辑隐藏在触发器中既痛苦又令人困惑。
  • @Littlefoot 哎呀,对不起。
  • @AlexPoole 是的,我愿意。谢谢你的建议。

标签: oracle plsql database-trigger


【解决方案1】:

使用before 触发器并简单地分配NULL:

CREATE OR REPLACE TRIGGER VERIF_RESULTATS
  BEFORE INSERT OR UPDATE OF RESULTATOBT
  ON PARTICIPATION
  FOR EACH ROW
  WHEN ( NEW.RESULTATOBT IS NOT NULL )
BEGIN 
  :new.RESULTATOBT := NULL;
END;
/

【讨论】:

  • 啊,:= 运算符... :-/ 谢谢。对了,我看到你用了new关键字没有“:”,是不是没必要?
  • @PrometheosII:我只是忘记了:(在 Postgres 和 Oracle 之间切换太频繁了)
猜你喜欢
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
  • 2014-11-05
  • 2011-04-11
  • 2013-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多