我正在尝试使用触发器功能来更新同一个表中的旧记录,并在新记录取代它们时将其标记为冗余。
我正在尝试使用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)有任何建议?
答案 0 :(得分:2)
您不能在纯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。
中找到更多信息和手册链接