去除变异触发器

时间:2013-11-22 12:48:58

标签: sql database oracle triggers mutating-table

我正在尝试创建一个触发器,用于计算服务的日期和分支的ID。触发器的目标是计算分支ID的数量以及服务日期。如果计数大于3,那么触发器应该生效。然而,我遇到的问题是oracle已经确定它是一个变异触发器,并且不允许使用错误消息插入数据:

ORA-04091: table user1.SERVICEIH is mutating, trigger/function may not see it
ORA-06512: at "user1.SERVICE_CHECKIH", line 5
ORA-04088: error during execution of trigger 'user1.SERVICE_CHECKIH'

1 个答案:

答案 0 :(得分:0)

您误用了触发器。我的意思是使用错误的触发器。

  1. 您在表A中插入/更新一行
  2. 表A上的触发器(对于每一行)在表A上执行查询
  3. Oracle抛出ORA-04091,这是一种预期的正常行为,Oracle希望保护您自己,因为它保证每个语句都是原子的(即要么失败要么完全成功),并且每个语句都看到一致的视图数据

    您希望查询(2)不会在(1)上看到插入的行。这将是矛盾的

    解决方案: - 使用之前而不是之后

    CREATE OR REPLACE TRIGGER SERVICE_CHECKih
    BEFORE INSERT OR UPDATE ON SERVICEih