トリガー操作のまとめ【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;