トリガーで:OLD値を使用していますが、これは問題があるようです。 INSERTでは、:OLD値はすべてNULLです。したがって、INSERTの場合、少なくとも:NEW値を使用することをお勧めします。
UPDATEでは、:OLD値に更新前の値が含まれます。在庫テーブルがどのように維持されているかはわかりませんが、ORDER_QUANTITYとSTOCK_IDの両方が変更される可能性があると仮定して、:OLD値を在庫に戻し、:NEW値を在庫から削除したいと思うようです。
DELETEを実行している場合、:OLD値には削除前の値が含まれますが、:NEW値はすべてNULLです(考えてみれば意味があります)。したがって、削除の場合は、:OLD値を使用する必要があるように思われます。ただし、POを削除する場合は、本当に 在庫を調整したいですか?注文が履行されたかキャンセルされたかなどを通知するために、注文に何らかのステータスが必要だと思います。注文が履行されなかった場合にのみ、在庫をバルク在庫テーブルに追加し直します。
いずれにせよ、トリガーを書き直す1つの方法は次のとおりです。
create or replace trigger UPDATE_ON_PURCHASE
BEFORE insert or update or delete on PURCHASE_ORDER
for each row
begin
IF INSERTING THEN
UPDATE bulk_stock
SET BULK_QUANTITY = BULK_QUANTITY - :NEW.ORDER_QUANTITY
WHERE STOCK_ID = :NEW.STOCK_ID;
ELSIF UPDATING THEN
UPDATE BULK_STOCK
SET BULK_QUANTITY = BULK_QUANTITY + :OLD.ORDER_QUANTITY
WHERE STOCK_ID = :OLD.STOCK_ID;
UPDATE BULK_STOCK
SET BULK_QUANTITY = BULK_QUANTITY - :NEW.ORDER_QUANTITY
WHERE STOCK_ID = :NEW.STOCK_ID;
ELSIF DELETING THEN
UPDATE BULK_STOCK
SET BULK_QUANTITY = BULK_QUANTITY + :OLD.ORDER_QUANTITY
WHERE STOCK_ID = :OLD.STOCK_ID;
END IF;
end;
特にDELETEの場合は、何をしようとしているのか完全には理解していないため、このロジックが本当に必要なものかどうかはわかりません。例として、状況に応じて必要なロジックを適用してください。
また、このロジックをトリガーに入れるのは悪い選択だと思います。このようなビジネスロジックはトリガーに実装しないでください。プロシージャに入れて、必要に応じてプロシージャを呼び出すことをお勧めします。 ビジネスロジックをトリガーに入れると問題が発生する可能性があります 。
幸運を祈ります。