読者です 読者をやめる 読者になる 読者になる

pgAdminにてトリガ関数を実装する

f:id:fkmpy129:20170126215514g:plain

はじめに

テーブルに対して、データ更新時または追加時に、自動で作成日時と更新日時を挿入させたい。そのため、トリガ関数を実装しその方法と手順をメモする。

 

1.対象となるテーブルを作成

まず対象となるテーブルの作成を行う

以下のSQL文を実行

CREATE TABLE client.test_trigger
(
delete_date character varying, -- 削除日時
update_date timestamp without time zone, -- 更新日時
create_date timestamp without time zone, -- 作成日時
key_code integer NOT NULL -- キー
)
WITH (
OIDS=FALSE
);
ALTER TABLE client.test_trigger
OWNER TO postgres;
COMMENT ON COLUMN client.test_trigger.delete_date IS '削除日時';
COMMENT ON COLUMN client.test_trigger.update_date IS '更新日時';
COMMENT ON COLUMN client.test_trigger.create_date IS '作成日時';
COMMENT ON COLUMN client.test_trigger.key_code IS 'キー';

 

2.トリガ関数作成

トリガを作成するため以下のSQL文を実行

CREATE OR REPLACE FUNCTION trigger_func()
RETURNS trigger AS
$BODY$
declare
BEGIN
IF TG_OP = 'INSERT' THEN
NEW.update_date := current_timestamp;
NEW.create_date := current_timestamp;
ELSE
IF TG_OP = 'UPDATE' THEN
NEW.update_date := current_timestamp;
END IF ;
END IF ;
RETURN NEW;
END ;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION trigger_func()
OWNER TO postgres;

 

3.先程作成したテーブルに対してトリガを実装

先程作成したテーブルに対してトリガを実装するため以下のSQL文を実行

CREATE TRIGGER insert_trigger_bef
BEFORE INSERT
ON test_trigger
FOR EACH ROW
EXECUTE PROCEDURE trigger_func();

 

CREATE TRIGGER update_trigger_bef
BEFORE UPDATE
ON test_trigger
FOR EACH ROW
EXECUTE PROCEDURE trigger_func();

 

BEFORE テーブルに対してのデータ操作が行われる前にトリガーを実行する。
AFTER テーブルに対してのデータ操作が行われた後にトリガーを実行する。
INSTEAD OF テーブルに対してのデータ操作が行われた際に、データ操作は実行されず、トリガーのみを実行する。

4.動作検証

動作検証を行うため、 以下のINSERT文を実行

insert into public.test_trigger (delete_date, key_code) values (0,1)

 

f:id:fkmpy129:20170126215031j:plain

無事に更新されました。