Postgres 从当前插入创建触发器传递参数

Postgres Create Trigger Pass Parameter from Current Insert

我是 Postgres 的新手,现在我的任务是创建一个在插入后触发的触发器。基本上,我会让脚本执行插入,触发触发器,该触发器会根据插入语句中的参数从另一个 table 中获取一个字段,然后使用另一个 table 中的值更新新插入的记录].

  1. 插入记录到 Table 1.
INSERT INTO "TableA" VALUES ('ABC-101', 'John Doe', '')

PersonID  |  Name  |  Address
------------------------------
ABC-101    John Doe 
  1. 插入后,我会触发触发器,从 TableB 中的字段中获取值。
CREATE OR REPLACE FUNCTION fn_getaddress()
  RETURNS trigger AS
$BODY$
DECLARE
  PersonID     TEXT;
BEGIN
  PersonID  := TG_ARGV[0];

    UPDATE  "TableA" 
       SET  "Address"  = (SELECT  "Address" 
                            FROM  "TableB" 
                           WHERE  "PersonID" = PersonID);
    RETURN null;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

这是我的触发器:

CREATE TRIGGER tr_getaddress
AFTER INSERT
ON TableA
FOR EACH ROW
EXECUTE PROCEDURE fn_getaddress(personid);

所以基本上,我在 TableB 中有一个字段(比如地址),我需要获取该字段以完成 TableA 中的记录。我正在使用 ID 来引用从 TableB.

获取的地址

您不需要将值传递给触发器。触发器可以通过隐式记录 new.

完全访问插入行中的所有列

您也不需要 UPDATE 语句来更改插入的行。您只需将值分配给 new 记录中的字段:

CREATE OR REPLACE FUNCTION fn_getaddress()
  RETURNS trigger AS
$BODY$
DECLARE 
   l_address text;
BEGIN

   SELECT  "Address" 
     into l_address
   FROM  "TableB" 
   WHERE  "PersonID" = new."PersonID"

   new."Address" := l_address;
   RETURN new; --<<< important
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

但是您不能在 after 触发器中更改插入的行,您需要一个 before 触发器:

CREATE TRIGGER tr_getaddress
  BEFORE INSERT --<<< important
  ON "TableA"
  FOR EACH ROW
  EXECUTE PROCEDURE fn_getaddress(); --<< no parameter necessary

但是像那样复制数据通常是一个非常糟糕的主意。如果您需要两个表的信息,为什么不直接连接两个表呢?


与您的问题无关,但您确实应该避免使用那些可怕的引用标识符。麻烦多了才值得