Триггер для обновления старых записей в той же таблице с использованием PL / pgsql - PullRequest
2 голосов
/ 15 февраля 2012

Я пытаюсь использовать функцию триггера для обновления старых записей в той же таблице и пометить их как избыточные, если новая запись заменяет их.

Я пытаюсь использовать 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 Ответ

2 голосов
/ 15 февраля 2012

Нельзя использовать переменные для идентификаторов в простом SQL. Вам нужно построить операторы SQL и использовать EXECUTE. Динамический 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. Упрощает синтаксис.
Вы можете найти больше информации и ссылки на руководство в этом соответствующем ответе .

...