首页 > 解决方案 > Oracle 触发器可能与 :new 有关

问题描述

create trigger Trigger_1
    Before INSERT
    on Adresse
    for each row
    declare
        pruefen int;
begin
    select COUNT(*) 
    into pruefen 
    from CITY 
    where city.NAME = :new.stadt 
    and CITY.PROVINCE = :new.provinz;
    if(pruefen = 0) then
        RAISE_APPLICATION_ERROR(-20000, 'Fehler');
    end if;
end;

错误:

[2020-01-18 10:14:12] [72000][20000] ORA-20000:
费勒 [2020-01-18 10:14:12] ORA-06512:在“ZOGL1011.TRIGGER_1”中,第 6 行
[2020 -01-18 10:14:12] ORA-04088:执行触发器“ZOGL1011.TRIGGER_1”时出错
[2020-01-18 10:14:12] 位置:12

我不明白这个问题......:new.stadt并且:new.provinz是红色的,但我可以创建触发器。

感谢您的帮助!

标签: oracleplsqldatabase-trigger

解决方案


[2020-01-18 10:14:12] [72000] [20000] ORA-20000:费勒

这是当 CITY 中没有与您尝试插入 ADRESSE 的记录匹配的数据时触发器引发的错误。换句话说,它是您的触发器按设计工作。因此,如果此结果让您感到惊讶,您需要检查您用于 CITY 和 ADRESSE 的数据。

为了证明这一点,这里有一个关于 db<>fiddle 的演示


顺便说一句,这似乎是通过外键正确执行的那种事情。使用触发器来强制关系是错误的,因为:

  1. 它的性能更差并且无法扩展。
  2. 在多用户环境中它可能会失败。
  3. 在引用的表(在您的情况下为 CITY)上执行 DML 时,它不会继续强制执行该关系。
  4. In 混淆数据模型。
  5. 使用非标准方法会使其他必须使用或维护您的代码的开发人员感到困惑。

也许您的数据模型很差,不允许您在这里使用外键?也许 CITY 缺少 的唯一键(state, province)

虽然这可能只是任务。在家庭作业练习中使用触发器的命运是永远不应该在现实生活中使用的。


推荐阅读