トリガー操作のまとめ【PostgreSQL】

未分類

【頻出】トリガー操作のまとめ

トリガー操作のうち、特に頻出のものをまとめました。

 

1.トリガーファンクションの作成

CREATE FUNCTION public.trg_test()   --ファンクション名は適宜変更
RETURNS trigger LANGUAGE 'plpgsql' COST 100 VOLATILE NOT LEAKPROOF
AS $BODY$    
BEGIN
	--処理を記載
	return null;
END ;		
$BODY$;
ALTER FUNCTION public.trg_test() OWNER TO postgres;
--このファンクションをトリガーで起動するように設定する(2以降で)

 

2.テーブルにトリガーファンクションを紐づけ

--1.いつ、2.誰に、3.なにを定義する
CREATE TRIGGER trg_test_m_school            -- トリガー名の作成
AFTER UPDATE                                -- 1.いつ:UPDATEの後に ※α
ON public.m_school                          -- 2.誰に:m_tableにトリガーを紐づける
FOR EACH ROW EXECUTE PROCEDURE trg_test();  -- 3.何を:起動するファンクション

--※αの個所は「AFTER UPDATE」ではなくBEFORE、INSERTやDELETE時にもトリガーを設定可能
BEFORE UPDATE                     -- UPDATEの前に起動する
AFTER INSERT OR DELETE OR UPDATE  -- INSERT、DELETE、UPDATEの後に起動する

1.は『〇〇した時にする処理』(=処理する内容)を作る

2.は『〇〇した時』(処理するタイミング)を指定する

 

3.トリガーの紐づけを削除

--m_schoolに紐づけされているトリガーを削除する
DROP TRIGGER tg_test_m_school ON public.m_school;

 

4.トリガーの紐づけを削除

--トリガーで起動するファンクションを削除
DROP FUNCTION public.tg_test();  
/*トリガーでこのファンクションが参照されている時にはエラーとなるので、
あらかじめ3のように紐づけを削除しておく(=DROP TRIGGERする)*/

 

5.トリガーファンクションの条件文

--INSERT , UPDATE , DELETEで処理を分けたい時の書き方
BEGIN
  IF TG_OP = 'UPDATE' THEN
    --UPDATE時の処理を書く
  ELSEIF TG_OP = 'INSERT' THEN
    --INSERT時の処理を書く
  ELSEIF TG_OP = 'DELETE' THEN
    --DELETE時の処理を書く
  END IF;
  return null;
END ;

 

6.トリガーファンクション中の変数

old -- 更新される前の行が格納される変数(レコード型)
new -- 更新された後の行が格納される変数(レコード型)

--old.列名、new.列名で値を取得することも可能
IF TG_OP = 'UPDATE' THEN
   insert into test(hoge1)values(old.school_name);
   insert into test(hoge1)values(new.school_name);
ELSEIF TG_OP = 'INSERT' THEN
   insert into test(hoge1)values(new.school_name);
ELSEIF TG_OP = 'DELETE' THEN
   insert into test(hoge1)values(old.school_name);
END IF;