【问题标题】:Trigger condition in all rows所有行中的触发条件
【发布时间】:2012-02-27 21:49:24
【问题描述】:

我正在尝试实施交通罚款控制系统。当在表 OBSERVACION 中引入雷达观测时,触发器应检查是否存在对同一辆车进行观测的行,然后计算罚款成本。

我想要一个触发器来检查表的每一行中的条件语句。我的意思是,我希望触发条件检查表中的所有值,并找出其中一个值是否等于引入的新值。像这样的:

WHEN(NEW.fecha_foto = fecha_foto)AND...

其中 fecha_foto 是表中的任何值。

有可能吗?

谢谢。

【问题讨论】:

  • 这是不可能的,也不是真正可取的。为什么要这样做?
  • 我有一张包含交通罚款行的表格,我想检查新行与之前现有行之间的时间。
  • 你想实现什么业务逻辑?
  • 我正在尝试实施交通罚款控制系统。当在表 OBSERVACION 中引入雷达观测时,触发器应检查是否存在对同一辆车进行观测的行,然后计算罚款成本。
  • 我发布了一个解决方案,但正如其他人指出的那样,它导致了 Oracle 的“变异触发器”问题。这就是为什么我真的不喜欢在 Oracle 中将触发器用于除审计表之外的任何东西。在尝试将记录插入数据库之前,最好使用存储过程或外部客户端程序来计算。

标签: oracle triggers


【解决方案1】:

针对拥有该触发器的同一个表发出 DML(包括 SELECT)的触发器引发了 ORA-4091 的幽灵,即变异表异常。 Oracle 抛出此错误是因为它希望事务的结果是确定性的,并且在自己的表上发出 DML 的触发器会在程序中引入不确定性。

变异表是糟糕设计的可靠指标,特别是糟糕的数据模型,这里似乎就是这种情况。

如果罚款的值取决于单个观察的结果,那么可以将 FINE 作为 OBSERVACION 表上的一列。但是,您的业务规则表明该值可能取决于多个观察值,如果它们落在某个时期内。在这种情况下,罚款应该在自己的表格中。您需要在 OBSERVACION 和 MULTA 之间使用外键来指示特定罚款涵盖哪些观察结果。

【讨论】:

  • 我终于解决了它,在一个临时表中引入你想要比较的数据。
  • 坦率地说,这听起来更像是一个杂牌,而不是一个合适的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
  • 2011-09-04
  • 2016-05-24
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多