● 2_04_37-トリガーの設定
トリガーはテーブルに対して insert、delete、update のいずれかの処理が行われた時に連動して何らかの処理を行うものです。
トリガーの構文は以下になります。
CREATE TRIGGER トリガー名
{ BEFORE | AFTER }
{ イベント [OR ...] }
ON テーブル名
FOR EACH ROW
EXECUTE PROCEDURE 関数名(引数)
|
{ BEFORE | AFTER } トリガー処理が実施されるタイミングを指定します。
{ イベント [OR ...] }
トリガー処理が実施されるイベントを指定します。INSERT、DELETE、UPDATEのいずれかを指定します。
ON テーブル名
トリガー処理を仕掛けるテーブル名を指定します。
FOR EACH ROW
行毎にトリガー処理が実施されることを意味します。
EXECUTE PROCEDURE 関数名(引数)
トリガー処理を行う関数名を指定します。ここで指定される関数は、引数の無い、戻り値の型がOPAQUE型の関数でなくてはなりません。
トリガーの削除構文は以下です。
DROP TRIGGER トリガー名 ON テーブル名
|
チェックデジット値を自動で入力します。
データ入力用のテーブルを作成します。
|
create table check_t(
se serial, -- 連番取得
c2 varchar unique, -- チェックデジット値カラム
c3 varchar, -- 入力値
primary key ( se )
);
|
チェックデジット値作成関数
create function getNewCd(int4)
returns varchar as '
declare
arg alias for $1;
st varchar := '''';
len int4;
val int4;
sumval int4 :=0;
rtn varchar;
begin
if ((arg between 0 and 9999999) = false) then
RAISE EXCEPTION ''length error'';
end if;
select ltrim(to_char(arg, ''0000000'')) into st;
for i in 1..7 loop
select (substr(st, i, 1)::int4) into val;
sumval := sumval + (val * (8 - i));
end loop;
select st||ltrim(to_char((11 - (sumval % 11)), ''0'' )) into
rtn;
return rtn;
end;
' language 'PLpgSQL'; |
トリガーが呼び出す関数、この関数は上のチェックデジット値作成関数を呼び出しています。
|
create function setNewCdForTrg()
returns opaque as '
declare
begin
select getNewCd(NEW.se)into NEW.c2;
return NEW;
end;
' language 'PLpgSQL'; |
トリガーを作成
create trigger setNewCdTocheck_t
before insert
on check_t
for each row
execute procedure setNewCdForTrg(); |
下記のデータを順に入力して下さい。
insert into check_t (c3) values ('masahiko');
insert into check_t (c3) values ('satou');
insert into check_t (c3) values ('wada');
insert into check_t (c3) values ('tanaka');
insert into check_t (c3) values ('suzuki');
|
下記の値が入力されました。赤枠がチェックデジットで生成された文字列です。
一度全てのデータを削除してもう一度やり直して見てください。
赤枠のチェックデジットは違う値をとります。
このように本来はプログラム(制御側)がロジックで取得していた情報をデータベース側で生成することができます。
ただしソース・コードの管理が必要ですので仕様全体の構成を考えて採用して下さい。
正規マニュアルの説明は以下になります。
第
34章トリガ
戻る
|