有人可以帮我在PL / SQL Oracle中实现以下触发器吗?

问题描述 投票:0回答:1

所以,

我有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个回答
0
投票

您可以使用一个查询来查找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;
/

干杯!

© www.soinside.com 2019 - 2024. All rights reserved.