【问题标题】:Oracle trigger probably issue with :newOracle 触发器可能与 :new 有关
【发布时间】:2020-01-18 09:19:11
【问题描述】:
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 是红色的,但我可以创建触发器。

感谢您的帮助!

【问题讨论】:

  • 这是一个执行问题,如果我插入一些东西...
  • :new.stadtcity.name的数据类型一样吗?还有,:new.provinzcity.province的数据类型一样吗?
  • 是的,它们的数据类型是一样的

标签: oracle plsql database-trigger


【解决方案1】:

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

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

只是为了证明这一点,here is a demo on db<>fiddle


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

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

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

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

【讨论】:

    猜你喜欢
    • 2017-11-20
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 2013-07-26
    • 2012-03-16
    • 2020-11-10
    相关资源
    最近更新 更多