本文為您介紹PolarDB PostgreSQL版(兼容Oracle)分區(qū)表中的Before Row-level觸發(fā)器以及其兼容性設(shè)置。

當您跨分區(qū)更新數(shù)據(jù)時,PostgreSQL和Oracle會使用不同的觸發(fā)器行為:

  • PostgreSQL:會觸發(fā)多個分區(qū)表的觸發(fā)器。
  • Oracle:僅觸發(fā)一次觸發(fā)器。

PolarDB PostgreSQL版(兼容Oracle)默認兼容Oracle的觸發(fā)器行為。

說明
  • After Row-level觸發(fā)器暫不兼容Oracle的觸發(fā)器行為。
  • 語句級觸發(fā)器(Statement-level Trigger)與普通表用法相同。

參數(shù)設(shè)置

您可以通過polar_compatible_oracle_trigger來控制Before Row-level觸發(fā)器的兼容性。

  • polar_compatible_oracle_trigger = off

    表示PolarDB PostgreSQL版(兼容Oracle)使用PostgreSQL的觸發(fā)器行為,跨分區(qū)更新數(shù)據(jù)會觸發(fā)多個表的觸發(fā)器。

    設(shè)置polar_compatible_oracle_trigger參數(shù)語句如下:

    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的觸發(fā)器行為,跨分區(qū)更新數(shù)據(jù)僅觸發(fā)一次。

    設(shè)置polar_compatible_oracle_trigger參數(shù)語句如下:

    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