PostgreSQL サーバー バージョン 9 から8.4に移行した後、非常に奇妙なエラーが発生しました。
簡単な説明:挿入または更新の前に
各行の特定のテーブルにトリガーがあり、条件ステートメント (if-else) で TG_OP 値チェックとOLDオブジェクトを使用する場合、 INSERTを実行すると次のエラーが発生します。
ERROR: record "old" is not assigned yet
DETAIL: The tuple structure of a not-yet-assigned record is indeterminate.
詳細な説明:
次の DB 構造があります。
CREATE TABLE table1
(
id serial NOT NULL,
name character varying(256),
CONSTRAINT table1_pkey PRIMARY KEY (id)
)
WITH (OIDS=FALSE);
CREATE OR REPLACE FUNCTION exemplary_function()
RETURNS trigger AS
$BODY$ BEGIN
IF TG_OP = 'INSERT' OR OLD.name <> NEW.name THEN
NEW.name = 'someName';
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE COST 100;
CREATE TRIGGER trigger1
BEFORE INSERT OR UPDATE
ON table1
FOR EACH ROW EXECUTE PROCEDURE exemplary_function();
エラーをトリガーする次のSQLクエリ:
INSERT INTO table1 (name) VALUES ('other name')
パーサーが条件付きで停止していないように見えTG_OP = 'INSERT'
ますが (それは true であるため停止する必要があります)、別のパーサーをチェックするとエラーが発生します。興味深いことに、バージョン 8.4 でしか再現できませんでした。