非互換
FUJITSU Enterprise Postgres 10では、以下のように、1つのSQL文で同一テーブルが複数回更新される場合は、文単位のトリガを1回だけ起動するよう変更します。
共通テーブル式で同一テーブルを複数回更新する場合
外部キー制約の被参照列が更新され、それに伴い、外部キー制約を付加したテーブルが更新される場合
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
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
対処方法
ありません。