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

2.2.285 同一テーブルが複数回更新される場合の文単位のトリガの動作変更

非互換

FUJITSU Enterprise Postgres 10では、以下のように、1つのSQL文で同一テーブルが複数回更新される場合は、文単位のトリガを1回だけ起動するよう変更します。

FUJITSU Enterprise Postgres 9.6以前の場合

1つのSQL文で文単位のトリガが複数回起動されることがあります。

[例]

=# CREATE FUNCTION func1() RETURNS TRIGGER LANGUAGE plpgsql AS $$
$#   BEGIN
$#     RAISE NOTICE 'Trigger % called.', TG_NAME;
$#     RETURN NULL;
$#   END;
$# $$;
CREATE FUNCTION
=# CREATE TABLE tbl1(c1 int);
CREATE TABLE
=# CREATE TRIGGER trg1 AFTER INSERT ON tbl1 FOR EACH STATEMENT EXECUTE PROCEDURE func1();
CREATE TRIGGER
=# WITH wcte AS (INSERT INTO tbl1 VALUES(1)) INSERT INTO tbl1 VALUES(2);
NOTICE:  Trigger trg1 called.
NOTICE:  Trigger trg1 called.
INSERT 0 1
FUJITSU Enterprise Postgres 10以降の場合

1つのSQL文で文単位のトリガは1回しか起動されません。

[例]

=# CREATE FUNCTION func1() RETURNS TRIGGER LANGUAGE plpgsql AS $$
$#   BEGIN
$#     RAISE NOTICE 'Trigger % called.', TG_NAME;
$#     RETURN NULL;
$#   END;
$# $$;
CREATE FUNCTION
=# CREATE TABLE tbl1(c1 int);
CREATE TABLE
=# CREATE TRIGGER trg1 AFTER INSERT ON tbl1 FOR EACH STATEMENT EXECUTE PROCEDURE func1();
CREATE TRIGGER
=# WITH wcte AS (INSERT INTO tbl1 VALUES(1)) INSERT INTO tbl1 VALUES(2);
NOTICE:  Trigger trg1 called.
INSERT 0 1

対処方法

ありません。