触发使用PL / pgsql更新同一个表中的旧记录

时间:2012-02-14 20:47:15

标签: postgresql plpgsql

我正在尝试使用触发器功能来更新同一个表中的旧记录,并在新记录取代它们时将其标记为冗余。

我正在尝试使用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)有任何建议?

1 个答案:

答案 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

中找到更多信息和手册链接