PostgreSQL触发更新辅助相关表

时间:2013-03-22 02:57:51

标签: function postgresql triggers plpgsql postgresql-8.4

我有两个表: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();

问题在于,当我将新记录插入table1table2时,

...RETURNING id INTO NEW.id_table3;

它似乎没有任何效果。 这是我的第一个函数/触发器,我找不到错误。 谢谢!

1 个答案:

答案 0 :(得分:4)

我非常确定只有设置NEW.foo = bar后才能更新已插入的行。

或者:

  • table1设置新的id_table3值进行更新(将以递归方式调用您的ON UPDATE触发器,所以要小心)或
  • 使用BEFORE触发器代替AFTER。

根据您在table1table3之间设置外键的方式,后者可能是也可能不是。