この人頭いいなと思ったエピソード

Aというテーブルのaカラムが更新されれば、Bテーブルの列の中でAテーブルの列id含む列(複数)のbカラムをFalseからTrueに変更されるような、トリガー と プロシージャを作りたいのです。


考えていたのは、プロシージャは、
CREATE FUNCTION update_edit_b() RETURNS OPAQUE AS '
BEGIN
(複数列指定?)
NEW.b := 't';
RETURN NEW;
END;
' LANGUAGE 'plpgsql';

プロシージャで、Bテーブルの複数列を指定するにはどうしたら良いでしょうか?

トリガーは

CREATE TRIGGER trgger_a
AFTER UPDATE OF a
ON Table_a
FOR EACH STATEMENT
EXECUTE PROCEDURE update_edit_b ;

こんな感じでしょうか?

A 回答 (1件)

・NEW の値を使う場合には、FOR EACH ROW トリガを使う必要がある。


・テーブルAに仕掛けたトリガの NEW は、テーブルAの行を表している。
といったあたりがポイントと思われます。

↓こんな感じでどうでしょうか?

CREATE FUNCTION update_edit_b()
RETURNS TRIGGER AS $$ -- (OPAQUE はかなり古い書き方?)
BEGIN
UPDATE Table_b SET Column_b = true WHERE Table_b.A_id = NEW.id
AND NOT Column_b; -- (複数回更新する際に、無駄なUPDATEを避ける)
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trgger_a
AFTER -- (BEFOREのほうが若干効率が良いので、置き換えも検討すべし)
UPDATE OF a ON Table_a
FOR EACH ROW -- (STATEMENTではなくROWを指定)
EXECUTE PROCEDURE update_edit_b;

参考URL:http://www.postgresql.jp/document/current/html/s …
    • good
    • 0
この回答へのお礼

ありがとうございます。大変参考になりました。

複数行はやめて1行としましたので、プロシージャは、こうしました。

CREATE FUNCTION update_edit() RETURNS OPAQUE AS '
BEGIN
UPDATE Table_a SET a = true WHERE Teble_a.b_id= Table_b.id;
RETURN NEW;
END;
' LANGUAGE 'plpgsql';

トリガーについては、使っているPostgresQL のバージョン(8.4.9)ではカラムの変更は
サポートされず、バージョン9からなそうで、とりあえず、バージョンアップしてみます。

お礼日時:2011/11/19 02:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す