2012-02-14 1 views
1

私はトリガー関数を使って同じテーブルの古いレコードを更新しようとしています。PL/pgsqlを使用して同じテーブルの古いレコードを更新するためのトリガー

私は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が初めてです。誰も古いレコードを(レコードIDと小さいTransactionIDを一致させて)更新する方法についてアドバイスを持っていますか?

答えて

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のマニュアルを参照してください。

+0

ありがとう、これは間違いなく正しい方法でした。私はそれを動作させるためにいくつかの調整が必要でした。私の最終的なコードだった: 'BEGIN EXECUTE ' UPDATE「' || TG_RELNAME || '" SET "冗長" =真 "文書ID" = $ 1 AND "レコードID" = $ 2 AND "TRANSACTIONID" <$ 3 AND "冗長" =偽 ' USING NEW "DocumentID"、 NEW。 "RecordID"、 NEW。 "TransactionID"; NEW; END' 私のテーブル名の大文字小文字を保持するために二重引用符を追加しなければならず(おそらく私の場合に固有の)、USING文の前に最初のセミコロンを削除しました。 お世話になりました! – Drewmate

+0

@Drewmate:代わりに['quote_ident(TG_RELNAME)'](http://www.postgresql.org/docs/current/interactive/functions-string.html#FUNCTIONS-STRING-OTHER)を使用してください。大文字と小文字が混在しているとは思わなかった。小文字の識別子はあなたの人生をPostgreSQLで簡単にします。セミコロンを修正した私のアップデートを見逃しているに違いない。 –

+0

識別子に関する良いアドバイス。私はすべてを小文字に切り替えると思います。 – Drewmate

関連する問題