使用Oracle SQL的编译错误创建的触发器

时间:2017-12-04 22:38:13

标签: oracle plsql

我尝试使用Oracle触发器语法创建代码,但是有一个警告:

  

使用编译错误创建的触发器

这是代码。当表itemtype中的价格设置为最低旧价格的四倍以上时,我想提出错误。我怎么能这样做?

我试图修复上一个问题!我成功地创建了触发器,但它只适用于insert," mutating table"当我想更新表itemType的价格时,仍然会出现错误。如何更改我的代码以使其在更新时也有效?

    CREATE or replace TRIGGER tr_price before insert or update on itemType for each row
    declare minimum float;
    begin
      select min(price)
      into minimum
      from itemType;
      if :new.price > 4*minimum
        then
        raise_application_error (-20000,'new price can not over 4 times min old price');
      END IF;
    end;
    /

1 个答案:

答案 0 :(得分:0)

正如评论中所阐明的那样(或者,如果您回答我的请求,正如在帖子中编辑的那样),您将遇到“变异表”错误。你想知道如何解决它。

唉,这不是一个编程错误。这是一个逻辑问题(Oracle选择不忽视,通过提升“变异表”错误)。

Oracle是一个多用户环境,SQL允许您在一个事务中插入/更改/删除许多行。这两件事都很好,但它们意味着你不能做你想要做的事情。

“旧”最低价格是多少?假设你已经有20行,最低价格是55美元。您再添加一行,价格为50美元。现在,您尝试添加价格为210美元的另一行。什么是“最低限度”? $ 220?为什么,因为插入价格为50美元的行,但尚未提交?或者是200美元?如果在同一个交易中,但是在您的代码中稍后,您以55美元的价格删除该行,而下一个最低价格为60美元 - 您不应该允许价格高达240美元吗?

然后复合这个问题:你插入几行,但你还没有提交。然后其他人在同一个表中插入(或更新或删除),并提交他们的事务。现在你要提交。不应该在交易结束时再次执行“检查”,而不是“每行”?

将DML语句的行为绑定到表中的数据的整个想法,因为它一次或多次存在(并且可能在您的事务中间发生变化,这可能是由您自己的其他活动或由您自己的其他活动引起的同时其他用户的活动),你必须清楚地理解,并与可能不了解或不了解SQL的“业务经理”或“业务用户”讨论,但谁必须了解这个问题,谁必须想出逻辑要求。只允许价格“不超过旧最小值的四倍”的插件在内部不一致,明智地,Oracle不允许你做一些没有意义的事情。

所以 - 简短的回答是“你无法修复解决方案,因为解决方案没有被破解,问题本身就被打破了。”您必须先解决问题。