ページの先頭行へ戻る
Enterprise Postgres 17 リリース情報

2.2.26 PL/Pythonのトリガ関数を使用した際のTD辞書の内容変更

非互換

Fujitsu Enterprise Postgres 16 SP1では、PL/Pythonで作成された関数を使用したトリガが再帰的に動作する場合、TD辞書の内容を変更します。

Fujitsu Enterprise Postgres 16以前では、TD辞書が再帰的に動作したトリガ関数の内容に上書きされていました。

Fujitsu Enterprise Postgres 16以前の場合
postgres=# CREATE EXTENSION plpython3u;
CREATE EXTENSION
postgres=# CREATE TABLE recursive_trigger_test (a int, b int);
CREATE TABLE
postgres=# CREATE FUNCTION recursive_trigger_func() RETURNS trigger
postgres-# LANGUAGE plpython3u
postgres-# AS $$
postgres$# if TD[""event""] == ""UPDATE"":
postgres$#     plpy.execute(""INSERT INTO recursive_trigger_test VALUES (1, 2)"")
postgres$#     plpy.notice(""TD[event] => "" + str(TD[""event""]) + "", expecting UPDATE"");
postgres$# else:
postgres$#     plpy.notice(""TD[event] => "" + str(TD[""event""]) + "", expecting INSERT"");
postgres$# return None
postgres$# $$;
CREATE FUNCTION
postgres=# CREATE TRIGGER recursive_trigger_trig
postgres-#   AFTER INSERT OR UPDATE ON recursive_trigger_test
postgres-#   FOR EACH ROW EXECUTE PROCEDURE recursive_trigger_func();
CREATE TRIGGER
postgres=# INSERT INTO recursive_trigger_test VALUES (0, 0);
NOTICE:  TD[event] => INSERT, expecting INSERT
INSERT 0 1
postgres=# UPDATE recursive_trigger_test SET a = 11 WHERE b = 0;
NOTICE:  TD[event] => INSERT, expecting INSERT
NOTICE:  TD[event] => INSERT, expecting UPDATE
UPDATE 1
postgres=# SELECT * FROM recursive_trigger_test;
 a  | b
----+---
 11 | 0
  1 | 2
(2 rows)
Fujitsu Enterprise Postgres 16 SP1の場合
postgres=# UPDATE recursive_trigger_test SET a = 11 WHERE b = 0;
NOTICE:  TD[event] => INSERT, expecting INSERT
NOTICE:  TD[event] => UPDATE, expecting UPDATE
UPDATE 1
postgres=# SELECT * FROM recursive_trigger_test;
 a  | b
----+---
 11 | 0
  1 | 2
(2 rows)

対処方法

ありません。