sql >> データベース >  >> RDS >> Oracle

Apex Oracle SQLの別のテーブルの行値を使用して、テーブルの行値の更新をトリガーする方法は?

    トリガーで: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の場合は、何をしようとしているのか完全には理解していないため、このロジックが本当に必要なものかどうかはわかりません。例として、状況に応じて必要なロジックを適用してください。

    また、このロジックをトリガーに入れるのは悪い選択だと思います。このようなビジネスロジックはトリガーに実装しないでください。プロシージャに入れて、必要に応じてプロシージャを呼び出すことをお勧めします。 ビジネスロジックをトリガーに入れると問題が発生する可能性があります

    幸運を祈ります。




    1. EXTRACT()の例– MySQL

    2. MariaDB Connector/CによるSQLyog用のKerberos

    3. SQL:使用可能なすべてのテーブルからすべてのデータを削除します

    4. phpMyAdminをインストールする方法