Oracle 触发器可能有 :new 问题

Oracle trigger probably issue with :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: Fehler
[2020-01-18 10:14:12] ORA-06512: in "ZOGL1011.TRIGGER_1", Row 6
[2020-01-18 10:14:12] ORA-04088: error during execution of Trigger "ZOGL1011.TRIGGER_1"
[2020-01-18 10:14:12] Position: 12

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

感谢您的帮助!

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

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

证明一下,here is a demo on db<>fiddle


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

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

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

的唯一键

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