[pgsql-jp: 28711] トリガの作成時のエラーについて。長文です。

みのむし minoran @ lily.freemail.ne.jp
2003年 1月 20日 (月) 00:24:15 JST


はじめまして。みのむしといいます。

まだデータベースやpostgreSQLを使いはじめて
日が浅い新参者ですがよろしくお願いいたします。

質問ですがトリガの作成時にエラーが発生して困っています。
また基本的な事かもしれませんがトリガの使い方にも質問があります。

環境はVine linux 2.6r1
PostgreSQL 7.3.1です。

まずはテーブル構成ですが
create table oya(
	oya_cd serial PRIMARY KEY,
	f_name text,
	l_update int,
	reg_date int
);

create table kodomo(
	kodomo_cd serial PRIMARY KEY,
	oya_cd int not null REFERENCES oya(oya_cd) on DELETE cascade,
	l_name text,
	reg_date int
);

という二つのテーブルに以下データを登録しています。

insert into oya(f_name,l_update,reg_date) values('suzuki','1042983281','1042983281');
insert into oya(f_name,l_update,reg_date) values('yamada','1042983282','1042983282');
insert into oya(f_name,l_update,reg_date) values('tanaka','1042983283','1042983283');

ここでkodomoテーブルに新たなデータが追加された時に
kodomoテーブルのreg_dateをoyaテーブルのl_updateに上書き更新させたいのです。
具体的にいうと日付関連のカラムはUTCでoyaテーブルに最終更新日時を更新させ
たいのです。

ここでこのような関数(last_udate)を作ってみました。
create or replace function last_update(INTEGER) RETURNS OPAQUE AS '
DECLARE
	k_cd ALIAS FOR $1;
	o_cd INTEGER;
	utc  INTEGER;
BEGIN
	SELECT reg_date into utc,oya_cd   into o_cd FROM kodomo WHERE kodomo_cd= kcd;
	UPDATE oya SET l_update= utc WHERE oya_cd = o_cd;
	RETURN new;
END;
'language 'plpgsql';

#まずこの関数自体、これでいいのかかなり疑問です(^^;

これを
CREATE TRIGGER ol_update 
	AFTER INSERT ON oya 
	FOR EACH ROW 
	EXECUTE PROCEDURE last_update();
としたいのですが引数にはkodomo_cdを動的に渡したいのですがどう書いたらよ
いか分かりません。
また引数無しで作ろうと思っても
function last_update() does not exist
とlast_update()関数が無いと怒られます。

#シーラカンス本を片手にやっていますが
#引数が無しの関数の場合だったのでいまいちわかりません。。。

この場合はどのような関数の書き方やトリガの実行をすればよいのでしょう?
よろしくお願いいたします。

#phpで作っているアプリケーションなのですが
#php側でSQLを動的に作って実行させたほうがこの場合は楽なのでしょうか・・

###########################
                   みのむし
minoran @ lily.freemail.ne.jp
###########################



pgsql-jp メーリングリストの案内