本文为您介绍PolarDB PostgreSQL版(兼容Oracle)分区表中的Before Row-level触发器以及其兼容性设置。

当您跨分区更新数据时,PostgreSQL和Oracle会使用不同的触发器行为:

  • PostgreSQL:会触发多个分区表的触发器。
  • Oracle:仅触发一次触发器。

PolarDB PostgreSQL版(兼容Oracle)默认兼容Oracle的触发器行为。

说明
  • After Row-level触发器暂不兼容Oracle的触发器行为。
  • 语句级触发器(Statement-level Trigger)与普通表用法相同。

参数设置

您可以通过polar_compatible_oracle_trigger来控制Before Row-level触发器的兼容性。

  • polar_compatible_oracle_trigger = off

    表示PolarDB PostgreSQL版(兼容Oracle)使用PostgreSQL的触发器行为,跨分区更新数据会触发多个表的触发器。

    设置polar_compatible_oracle_trigger参数语句如下:

    SET polar_compatible_oracle_trigger = off;

    使用示例如下:

    create trigger t before insert or update or delete on parted
      for each row execute function trigger_function();
    insert into parted values (1, 1, 'uno uno v1');
    NOTICE:  parted_1: BEFORE ROW INSERT
    update parted set a = 2;
    NOTICE:  parted_1: BEFORE ROW UPDATE
    NOTICE:  parted_1: BEFORE ROW DELETE
    NOTICE:  parted_2: BEFORE ROW INSERT
    delete from parted;
    NOTICE:  parted_2: BEFORE ROW DELETE
  • polar_compatible_oracle_trigger = on

    表示PolarDB PostgreSQL版(兼容Oracle)使用Oracle的触发器行为,跨分区更新数据仅触发一次。

    设置polar_compatible_oracle_trigger参数语句如下:

    SET polar_compatible_oracle_trigger = on;

    使用示例如下:

    insert into parted values (1, 1, 'uno uno v1');
    NOTICE:  parted_1: BEFORE ROW INSERT
    update parted set a = 2;
    NOTICE:  parted_1: BEFORE ROW UPDATE
    delete from parted;
    NOTICE:  parted_2: BEFORE ROW DELETE