Postgres 从当前插入创建触发器传递参数
Postgres Create Trigger Pass Parameter from Current Insert
我是 Postgres 的新手,现在我的任务是创建一个在插入后触发的触发器。基本上,我会让脚本执行插入,触发触发器,该触发器会根据插入语句中的参数从另一个 table 中获取一个字段,然后使用另一个 table 中的值更新新插入的记录].
- 插入记录到 Table 1.
INSERT INTO "TableA" VALUES ('ABC-101', 'John Doe', '')
PersonID | Name | Address
------------------------------
ABC-101 John Doe
- 插入后,我会触发触发器,从 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
但是像那样复制数据通常是一个非常糟糕的主意。如果您需要两个表的信息,为什么不直接连接两个表呢?
与您的问题无关,但您确实应该避免使用那些可怕的引用标识符。麻烦多了才值得
我是 Postgres 的新手,现在我的任务是创建一个在插入后触发的触发器。基本上,我会让脚本执行插入,触发触发器,该触发器会根据插入语句中的参数从另一个 table 中获取一个字段,然后使用另一个 table 中的值更新新插入的记录].
- 插入记录到 Table 1.
INSERT INTO "TableA" VALUES ('ABC-101', 'John Doe', '')
PersonID | Name | Address
------------------------------
ABC-101 John Doe
- 插入后,我会触发触发器,从 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
但是像那样复制数据通常是一个非常糟糕的主意。如果您需要两个表的信息,为什么不直接连接两个表呢?
与您的问题无关,但您确实应该避免使用那些可怕的引用标识符。麻烦多了才值得