非互換
Fujitsu Enterprise Postgres 16 SP1では、PL/Pythonで作成された関数を使用したトリガが再帰的に動作する場合、TD辞書の内容を変更します。
Fujitsu Enterprise Postgres 16以前では、TD辞書が再帰的に動作したトリガ関数の内容に上書きされていました。
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)
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)
対処方法
ありません。