【问题标题】:Can someone help me implement the following trigger in PL/SQL Oracle?有人可以帮我在 PL/SQL Oracle 中实现以下触发器吗?
【发布时间】:2019-12-01 16:48:54
【问题描述】:

所以,

我有 4 张桌子:

Suppliers( id_sup, name, city)

Products (id_prod, name, city)

Companies (id_co, name, city)

Deliveries (id_sup, id_prod, id_co)

我需要一个触发器,以便如果我想更新供应商的城市,如果该供应商的交货地点与其交付的产品和交付的公司位于与其相同的城市,则不允许我这样做。

这是我迄今为止尝试过的,但它不起作用:

CREATE OR REPLACE TRIGGER secure_suppliers

BEFORE UPDATE ON Suppliers

BEGIN

IF UPDATING ('city') THEN

IF (suppliers.id_sup IN (SELECT id_sup FROM Deliveries) AND suppliers.city = (Select p.city From Products p INNER JOIN Deliveries d ON (p.id_prod = d.id_prod)) AND suppliers.city = (Select c.city From Companies c INNER JOIN Deliveries d ON (c.id_co = d.id_co))) THEN

RAISE_APPLICATION_ERROR(-20500, 'Can't update city!');

End if;

End;

【问题讨论】:

    标签: sql oracle plsql plsqldeveloper


    【解决方案1】:

    您可以使用一个查询来查找productsuppliercompany 是否在一个具有supplier 新值的城市中,然后继续在trigger 中进行错误处理,如下所示:

    CREATE OR REPLACE TRIGGER secure_suppliers
        For each row -- row level trigger
        BEFORE UPDATE OF city ON Suppliers -- trigger will execute on update of column city only
    
    DECLARE
    cnt NUMBER := 0;
    
    BEGIN    
    select count(1)
    Into cnt
    From deliveries d
    Join companies c on d.id_co = c.id_co
    Join products p on d.id_prod = p.id_prod
    Where p.city = c.city
    And p.city = :new.city;
    
    If cnt > 0 then
    RAISE_APPLICATION_ERROR(-20500, 'Can''t update city!'); 
    End if;
    
    End;
    /
    

    干杯!!

    【讨论】:

    • 哇,它工作正常(好吧,我用 :old.city 替换了 :new.city 因为它应该将它与旧值进行比较,但仍然非常感谢!你能解释一下吗?有点(如果你有时间的话)你想得到这个解决方案的具体过程是什么?你怎么知道做 count/ into cnt/ cnt>0 的事情,它到底做了什么?
    • 我不知道。我真的不知道。但是在我需要找到某些东西的存在的触发器中,我总是使用 count 因为它是聚合函数,所以如果没有找到数据,那么它返回 0 而不是引发异常。我们可以在 IF 条件下使用它。是的,我们也可以在触发器中借助异常来创建相同的逻辑,但纯逻辑不应与异常一起处理。
    • 如果此回答解决了您的问题,请接受它,以便将您的问题标记为已解决。
    • 相同的基本逻辑适用于 your other question 相同的任务,但只有 3 个相同的表和相同的要求。请不要在没有至少解释为什么先前的答案不合适的情况下提出几乎相同的问题。
    猜你喜欢
    • 2015-06-01
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 2017-02-03
    • 2017-07-07
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    相关资源
    最近更新 更多