【PL/SQL】トリガー

書いておいて忘れてた記事があったぞーw
PL/SQL の トリガーについてだそうです(他人事)

テーブル構成

今回はこのテーブル。よくある商品マスタ。

トリガー登録

CREATE OR REPLACE TRIGGER M_PRODUCT_TRIGGER
  BEFORE INSERT OR UPDATE OR DELETE
  ON M_PRODUCT
  FOR EACH ROW
  
BEGIN

  DBMS_OUTPUT.PUT_LINE('PRODUCT_ID:' || :NEW.PRODUCT_ID);

  IF (INSERTING) THEN
    DBMS_OUTPUT.PUT_LINE('登録');
    -- 登録ユーザーと時間を設定
    :NEW.PRODUCT_INSERT_USER := :NEW.PRODUCT_LAST_EDIT_USER;
    :NEW.PRODUCT_INSERT_DATE := SYSDATE;
    -- 更新ユーザーと時間を設定
    :NEW.PRODUCT_UPDATE_USER := :NEW.PRODUCT_LAST_EDIT_USER;
    :NEW.PRODUCT_UPDATE_DATE := SYSDATE;
  END IF;
  
  IF (UPDATING) THEN
    DBMS_OUTPUT.PUT_LINE('更新');
    -- 更新ユーザーと時間を設定
    :NEW.PRODUCT_UPDATE_USER := :NEW.PRODUCT_LAST_EDIT_USER;
    :NEW.PRODUCT_UPDATE_DATE := SYSDATE;
  END IF;
  
  IF(:NEW.PRODUCT_DELETE_FLG = 1) THEN
    DBMS_OUTPUT.PUT_LINE('論理削除');
    -- 削除ユーザーと時間を設定
    :NEW.PRODUCT_DELETE_USER := :NEW.PRODUCT_LAST_EDIT_USER;
    :NEW.PRODUCT_DELETE_DATE := SYSDATE;
  END IF;
  
  IF (DELETING) THEN
    DBMS_OUTPUT.PUT_LINE('削除');
    -- なんか処理があったらよかった!
  END IF;

END M_PRODUCT_TRIGGER;
/

INSERT

-- 新規登録
INSERT INTO M_PRODUCT(
  PRODUCT_ID,
  PRODUCT_NAME,
  PRODUCT_PRICE,
  PRODUCT_LAST_EDIT_USER,
  PRODUCT_DELETE_FLG)
VALUES(
  1,
  'TEST001',
  100,
  'oqiita',
  0)
;

登録後のテーブル

UPDATE

更新前のテーブル

-- 更新処理
UPDATE M_PRODUCT SET
  PRODUCT_PRICE = PRODUCT_PRICE * 1.5,
  PRODUCT_LAST_EDIT_USER = 'oqiita2'
WHERE
  PRODUCT_PRICE >= 200
;

更新後のテーブル

論理削除

-- 論理削除
UPDATE M_PRODUCT SET
  PRODUCT_DELETE_FLG = 1,
  PRODUCT_LAST_EDIT_USER = 'oqiita3'
WHERE
  PRODUCT_ID = 3
;

論理削除後のテーブル

DELETE

-- 物理削除
DELETE FROM M_PRODUCT WHERE PRODUCT_ID = 4;

とくに処理が思い浮かばなかったので、ログがでるだけです!

まとめ

あれば便利なトリガー。MYSQLになるとまた作り方が違うからやっかい。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください