基本的に私はtable_aとtable_bを持っています。 table_bはtable_aのフィーチャで作成され、一般的にはsection_idの列とステータスを共有します。それはユニークですが、複数のsection_idsをtable_b持つことができますが、彼らはすべての共有と同じ状態別のテーブルが挿入または更新されたときに、テーブル内のカラムを更新するPostgresqlトリガ
ユーザーの挿入および更新table_bと私は状況をキャプチャするバックtable_aの変化よう
table_aのSECTION_IDが主キーです
CREATE TRIGGER table_b_aiu
AFTER INSERT OR UPDATE
ON table_b
FOR EACH ROW
WHEN (((new.status = 100) OR (new.status = 200)))
EXECUTE PROCEDURE table_b_aiu();
CREATE OR REPLACE FUNCTION table_b_aiu()
RETURNS trigger AS
$BODY$
BEGIN
UPDATE table_a a
SET status = 100
FROM table_b b
WHERE (b.status = 100 or b.status = 200)
AND a.section_id = b.section_id;
RETURN new;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
この問題は、新しく更新または挿入された行だけを更新するのではなく、意図していない全データセットを更新することです。新しい行だけを更新するには?私はtrigerに引数を入れて試してみたが、それはsection_id
が、それは十分なはずtable_a
の主キーであるまで
CREATE OR REPLACE FUNCTION table_b_aiu()
RETURNS trigger AS
$BODY$
BEGIN
UPDATE table_a
SET status = 100
WHERE section_id = NEW.section_id
RETURN new;
END;
$BODY$
(ただしテストしていません)この機能を試してみてくださいnew.section_id
は 'section_id'ユニークです。行の識別子?thの定義を持つと便利です問題のテーブルも同様です。 – cole
@ C.Arendt section_idはtable_aの主キーですが、table_bのキーはありません – Luffydude
トリガの引数はどういう意味ですか?次のようにします: 'EXECUTE PROCEDURE table_b_aiu(new.section_id);'? 引数として渡さずにその行にアクセスできます。 'a.section_id = new.section_id'を実行して、' table_b'から不要な部分を削除するだけです。 –