[pgsql-jp: 28717] Re: トリガの作成時のエラーについて。【解決】

みのむし minoran @ lily.freemail.ne.jp
2003年 1月 20日 (月) 23:53:26 JST


みのむしです。

きしだ様ご返答ありがとうございます。

まず最初にpostさせて頂いた内容に誤りがありました。

CREATE TRIGGER ol_update 
	AFTER INSERT ON oya 
	FOR EACH ROW 
	EXECUTE PROCEDURE last_update();

と書きましたがAFTERのあとの動作対象テーブルは
kodomoテーブルにINSERTされたときですので
AFTER INSERT ON kodomo
でした。申し訳ありません。

On Mon, 20 Jan 2003 01:54:07 +0900
naoki kishida <kishida @ fk.urban.ne.jp> wrote:

>   UPDATE oya SET l_update=utc WHERE oya_cd=new.kodomo_cd;
> 
> ですね。
> そしたらファンクションに引数を渡す必要がなくなります。

教えて頂いた通りにしてみたのですが上手くはいきませんでした。
自分なりに教えて頂いた内容を元にしてみた所、上手く
いってしまいました(^^;

CREATE OR REPLACE FUNCTION last_update() RETURNS OPAQUE AS '
	DECLARE
		utc  INTEGER;
	BEGIN
		SELECT reg_date INTO utc FROM kodomo WHERE kodomo_cd= new.kodomo_cd;
		UPDATE oya SET l_update=utc WHERE oya_cd=new.oya_cd;
		RETURN new;
	END;
'language 'plpgsql';

CREATE TRIGGER ol_update 
	AFTER INSERT ON kodomo 
	FOR EACH ROW 
	EXECUTE PROCEDURE last_update();

自分がやりたかった事はこういう事だったのですがこの
CREATE FUNCTIONの内容の中身はまだ理解出来ていません。
かなり納得はいきませんがとりあえずは使う事にはします。

#う〜ん、上手くいってしまったら勉強にならない・・・(笑

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

<<中略>>

> でも、本質的な利点はそこではなく。
> ファンクションなどを使わずにデータベースを使ったアプリケーションを作る場
> 合、とくにWebの場合
>   データベース設計 -> 画面遷移実装 -> データ処理
> の順に作業を進めることが多いと思います。
> ここで問題になるのは、データベース設計のときにデータ処理のことまで考えて
> いるのに、実装するのにタイムラグがあって忘れてるということです。

おっしゃる通りです。
過去にこの過ちを犯した為に今度の開発はDB設計で出来る処理は
DB側でさせてしまおうと思い立ったわけです。

前回の開発ではDBはただのデータ格納庫という認識しかありませんでした。
しかしPostgreSQLを知る度にアプリケーション側で処理していた事の
ほとんどはDBで出来るという事を学び、PostgreSQLの楽しさにハマって
しまいました(^^;


結局、悩んでいた事は解決したのですがこれでは意味がない・・・。
PL/pgSQLをもうちょっとお勉強してみる事にします。

それとトリガ自体、今まで難しそうで使った事がなかったのですが
いざ使ってみるとトリガ自体は簡単でその先にあるFUNCTIONが
難しいという事を学びました(^^;

きしだ様ありがとうございました。

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



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