1

我有两个表:table1and table2,它在同一函数中的插入和更新上触发。当您在 中插入一个值table1table2在 中插入一个值时table3,将值table1.lastname || table1.firstname分配给column3id为 insert in 获得的必须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 触发器,所以要小心),或者
  • 使用 BEFORE 触发器而不是 AFTER。

table1根据在和之间设置外键的方式table3,后者可能是也可能不是一个选项。

于 2013-03-22T03:04:21.063 回答