- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:プロシージャとトリガー)
プロシージャとトリガーの使い方-データベース管理
このQ&Aのポイント
- データベースのテーブルAのaカラムが更新された場合、テーブルBの複数の列のbカラムをFalseからTrueに変更するトリガーとプロシージャの作成方法について教えてください。
- プロシージャの作成方法は、FUNCTIONキーワードを使用してUPDATE文を実行し、複数の列を指定します。
- トリガーの作成方法は、CREATE TRIGGER文を使用し、テーブルAの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;
お礼
ありがとうございます。大変参考になりました。 複数行はやめて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からなそうで、とりあえず、バージョンアップしてみます。