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

2.2.110 継承テーブルに対する更新処理時の処理対象テーブルの変更

非互換

継承テーブルに対しUPDATE、DELETE、MERGEコマンドを実行した際に、更新処理の対象から親テーブルが除外される場合でも、メインの処理対象テーブルが親テーブルに変更されます。

Fujitsu Enterprise Postgres 15以前では子テーブルがメインの処理対象とされ、意図しないトリガーなどが起動する場合がありました。

Fujitsu Enterprise Postgres 15以前の場合
postgres=# CREATE TABLE some_tab (f1 int, f2 int, f3 int, check (f1 < 10) NO INHERIT);
CREATE TABLE
postgres=# CREATE TABLE some_tab_child () INHERITS(some_tab);
CREATE TABLE
postgres=# INSERT INTO some_tab_child select i, i+1, 0 from generate_series(1,1000) i;
INSERT 0 1000
postgres=# CREATE INDEX ON some_tab_child(f1, f2);
CREATE INDEX
postgres=# CREATE FUNCTION some_tab_stmt_trig_func() returns trigger as
postgres-# $$begin RAISE NOTICE 'updating some_tab'; return NULL; end;$$
postgres-# language plpgsql;
CREATE FUNCTION
postgres=# CREATE TRIGGER some_tab_stmt_trig
postgres-#   BEFORE UPDATE ON some_tab EXECUTE FUNCTION some_tab_stmt_trig_func();
CREATE TRIGGER
postgres=# UPDATE some_tab set f3 = 11 WHERE f1 = 12 and f2 = 13;
UPDATE 1
Fujitsu Enterprise Postgres 16の場合
postgres=# CREATE TABLE some_tab (f1 int, f2 int, f3 int, check (f1 < 10) NO INHERIT);
CREATE TABLE
postgres=# CREATE TABLE some_tab_child () INHERITS(some_tab);
CREATE TABLE
postgres=# INSERT INTO some_tab_child select i, i+1, 0 from generate_series(1,1000) i;
INSERT 0 1000
postgres=# CREATE INDEX ON some_tab_child(f1, f2);
CREATE INDEX
postgres=# CREATE FUNCTION some_tab_stmt_trig_func() returns trigger as
postgres-# $$begin RAISE NOTICE 'updating some_tab'; return NULL; end;$$
postgres-# language plpgsql;
CREATE FUNCTION
postgres=# CREATE TRIGGER some_tab_stmt_trig
postgres-#   BEFORE UPDATE ON some_tab EXECUTE FUNCTION some_tab_stmt_trig_func();
CREATE TRIGGER
postgres=# UPDATE some_tab set f3 = 11 WHERE f1 = 12 and f2 = 13;
NOTICE:  updating some_tab
UPDATE 1

対処方法

ありません。