非互換
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)
対処方法
ありません。