首页 > 解决方案 > 触发器不禁用

问题描述

create or replace NONEDITIONABLE TRIGGER azuriranje
AFTER UPDATE OF napomena
ON otpremnica
FOR EACH ROW
DECLARE
BEGIN
EXECUTE IMMEDIATE 'ALTER TRIGGER zabranjeno DISABLE';
UPDATE stavkaotpremnice
SET napomena =:NEW.napomena
WHERE brojotpremnice =:NEW.brojotpremnice;
EXECUTE IMMEDIATE 'ALTER TRIGGER zabranjeno ENABLE';
END;

有谁知道为什么触发器“zabranjeno”在更新之前没有被禁用?

标签: sqloracle

解决方案


这至少是您发布的第三个问题,与同一问题有关。我回答了其中一个(这个),所以 - 再次问同样的问题有什么意义?

无论如何:阅读您发布的内容(作为问题或评论),我会说您完全错了。原因如下:

  • 你有两张桌子:otpremnicastavkaotpremnice
  • 您不想允许用户更新napomenastavkaotpremnice,因此zabranjeno在该表上创建了触发器
  • 同时,azuriranje在表 otpremnica 上的触发器应该
    • 禁用触发器zabranjeno
    • stavkaotpremnice.napomena = otpremnica.napomena为此设置,brojotpremnice对于所有行stavkaotpremnice
    • 启用触发器zabranjeno

最后一个项目符号(“同时......”)说明了为什么这是错误的。您的数据模型违反了第三范式;napomena在 master ( otpremnica) 和 detail ( stavkaotpremnice) 表中保持相同的值是没有意义的。

如果您想显示(显示)napomena中的所有行stavkaotpremnice,则加入这些表,例如

select o.brojotpremnice,
       s.brojstavke,
       s.nazivstavke,
       o.napomena              --> here's your NAPOMENA
from otpremnica o join stavkaotpremnice s on s.brojotpremnice = o.brojotpremnice
where ...

最后,如果您不允许用户输入他们认为合适的任何注释,那么加入该napomena列有什么意义?stavkaotpremnice


因此,长话短说,解决你的噩梦,修改数据模型:

  • napomena_stavkaotpremnice
  • 删除zabranjenoazuriranje触发器
  • 在需要时 napomena从表中获取otpremnica
    • 或者,使用我在上面发布的查询创建一个视图

推荐阅读