1

私は 2 つのテーブルを持っています:table1table2は、同じ関数で挿入と更新をトリガーします。に値を挿入するtable1table2、 に値を挿入するtable3と、値がtable1.lastname || table1.firstnameに割り当てられcolumn3ます。idに挿入するために取得した を に挿入する必要table3がありますtable1.id_table3

CREATE OR REPLACE FUNCTION myschema.myfunction() RETURNS trigger AS
$BODY$
DECLARE
    new_id_table_4  integer;
BEGIN
    IF TG_OP = 'INSERT' THEN
        IF TG_TABLE_NAME = 'table1' THEN
            new_id_table_4 := 1;
        ELSIF TG_TABLE_NAME = 'table2' THEN
            new_id_table_4 := 2;
        END IF;
        INSERT INTO myschema.table3
            (id, id_table4, name)
            VALUES (DEFAULT, new_id_table_4, NEW.columnA||', '||NEW.columnB, TRUE, TRUE)
            RETURNING id
            INTO NEW.id_table3;
    ELSIF TG_OP = 'UPDATE' THEN
        IF OLD.columnA <> NEW.columnA OR OLD.columnB <> NEW.columnB THEN
            UPDATE myschema.table3 SET
                name = NEW.columnA||', '||NEW.columnB
                WHERE id = NEW.id_cuenta;
        END IF;
    END IF;
    RETURN NEW;
END
$BODY$
LANGUAGE plpgsql VOLATILE COST 100;
ALTER FUNCTION myschema.myfunction() OWNER TO myuser;

CREATE TRIGGER add_table3record_table1
  AFTER INSERT OR UPDATE
  ON myschema.table1
  FOR EACH ROW
  EXECUTE PROCEDURE myschema.myfunction();

CREATE TRIGGER add_table3record_table2
  AFTER INSERT OR UPDATE
  ON myschema.table2
  FOR EACH ROW
  EXECUTE PROCEDURE myschema.myfunction();

table1問題は、新しいレコードをorに挿入するとtable2

...RETURNING id INTO NEW.id_table3;

効果はないようです。これは私の初めての関数/トリガーであり、エラーが見つかりません。ありがとうございました!

4

1 に答える 1

4

設定するだけですでに挿入されている行を更新できないと確信していますNEW.foo = bar

また:

  • table1新しい値の設定で更新を実行しid_table3ます (ON UPDATE トリガーを再帰的に呼び出すため、注意してください)。
  • AFTER の代わりに BEFORE トリガーを使用します。

table1外部キーがとの間でどのように設定されているかによってtable3、後者がオプションになる場合とそうでない場合があります。

于 2013-03-22T03:04:21.063 に答える