我正在尝试使用触发器函数来更新同一个表中的旧记录,并在新记录取代它们时将它们标记为冗余。
我正在尝试使用TG_TABLE_NAME
作为更新导致此触发器触发的表的通用方法。我的代码如下所示:
BEGIN
UPDATE TG_TABLE_NAME
SET "Redundant"=true
WHERE "DocumentID"=NEW."DocumentID"
AND "RecordID" = NEW."RecordID"
AND "TransactionID" < NEW."TransactionID"
AND "Redundant" = false ;
RETURN NEW;
END
但是当触发器触发时,postgres 提示它找不到名为“tg_table_name”的表
我猜我正在做一些明显错误的事情,但我是 pl/PGSQL 的新手。有人对如何更新旧记录(具有匹配的 RecordID 和较小的 TransactionID)有任何建议吗?
最佳答案
您不能在纯 SQL 中使用变量作为标识符。您需要构建 SQL 语句并使用 EXECUTE。 <强> Dynamic SQL 。 可能看起来像这样:
CREATE FUNCTION foo() RETURNS trigger AS
$BODY$
BEGIN
EXECUTE '
UPDATE ' || quote_ident(TG_RELNAME) || '
SET "Redundant" = true
WHERE "DocumentID" = $1
AND "RecordID" = $2
AND "TransactionID" < $3
AND "Redundant" = FALSE'
USING
NEW."DocumentID"
,NEW."RecordID"
,NEW."TransactionID";
RETURN NEW;
END;
$BODY$ language plpgsql;
请注意我如何使用 USING 子句传递变量。简化语法。
您可以在 related answer 中找到更多信息和手册链接。 .
关于postgresql - 使用 PL/pgsql 触发器更新同一个表中的旧记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9283946/