【问题标题】:Postgres Create Trigger Pass Parameter from Current InsertPostgres 从当前插入创建触发器传递参数
【发布时间】:2016-04-27 20:23:36
【问题描述】:

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

  1. 将记录插入表 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 中获取的地址。

【问题讨论】:

    标签: postgresql function triggers plpgsql


    【解决方案1】:

    您不需要将值传递给触发器。触发器可以通过隐式记录 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
    

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


    与您的问题无关,但您应该真的避免使用那些可怕的引用标识符。他们比他们值得的麻烦更多

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多