Apa itu "tabel transisi" di Postgres?

12

Halaman yang menggambarkan apa yang baru di Postgres 10 menyebutkan "Tabel Transisi untuk Pemicu".

Tabel Transisi untuk Pemicu

Fitur ini membuat AFTER STATEMENT pemicu bermanfaat dan berkinerja dengan memaparkan, jika perlu, baris lama dan baru ke kueri. Sebelum fitur ini, AFTER STATEMENTpemicu tidak memiliki akses langsung ke ini, dan solusinya adalah Bizantium dan memiliki kinerja yang buruk. Banyak pemicu logika sekarang dapat ditulis sebagai AFTER STATEMENT, menghindari kebutuhan untuk melakukan switch konteks mahal di setiap baris yang diperlukan UNTUK SETIAP ROW memicu.

Apa itu tabel transisi?

Basil Bourque
sumber

Jawaban:

12

Anda tahu bagaimana ada OLDdan NEWmerekam variabel untukFOR EACH ROW pemicu?

Tabel transisi adalah FOR EACH STATEMENTpadanannya. Mereka adalah tabel dengan tupel lama dan baru, sehingga pemicu Anda dapat melihat apa yang berubah.

Craig Ringer
sumber
9

Saya sangat suka penjelasan Craig tentang fitur ini. SQL-2011 Spec mendefinisikannya dalam konteks pemicu sebagai "kumpulan baris yang dihapus, dimasukkan atau diganti dikenal sebagai tabel transisi." Sebuah penjelasan yang sama diberikan dalam dokumen,

Sementara tabel transisi untuk AFTERpemicu ditentukan menggunakan REFERENCINGklausa dalam cara standar, variabel baris yang digunakan dalam FOR EACH ROWpemicu mungkin tidak ditentukan dalam REFERENCINGklausa. Mereka tersedia dengan cara yang tergantung pada bahasa di mana fungsi pemicu ditulis. Beberapa bahasa berperilaku efektif seolah-olah ada REFERENCINGklausa yang mengandungOLD ROW AS OLD NEW ROW AS NEW.

Pada dasarnya mereka membuat perubahan seluruh pernyataan tersedia untuk Anda, yang sangat berguna. Sebagai referensi, DDL pada create trigger terlihat seperti ini dengan tabel transisi

REFERENCING OLD TABLE AS oldtable NEW TABLE AS newtable

Anda dapat melihat contoh di sini , dan ini adalah satu dari test suite ,

CREATE TABLE transition_table_base (id int PRIMARY KEY, val text);

CREATE FUNCTION transition_table_base_ins_func()
  RETURNS trigger
  LANGUAGE plpgsql
AS $$
DECLARE
  t text;
  l text;
BEGIN
  t = '';
  FOR l IN EXECUTE
           $q$
             EXPLAIN (TIMING off, COSTS off, VERBOSE on)
             SELECT * FROM newtable
           $q$ LOOP
    t = t || l || E'\n';
  END LOOP;

  RAISE INFO '%', t;
  RETURN new;
END;
$$;

CREATE TRIGGER transition_table_base_ins_trig
  AFTER INSERT ON transition_table_base
  REFERENCING OLD TABLE AS oldtable NEW TABLE AS newtable
  FOR EACH STATEMENT
  EXECUTE PROCEDURE transition_table_base_ins_func();

Beberapa catatan tambahan

  1. Mereka hanya tersedia di AFTER pemicu.
  2. Mereka mempertimbangkan hal-hal seperti ON CONFLICT.

Penting untuk menunjukkan bahwa itu tidak sepenuhnya pasti tersedia di PG 10 . Ada banyak masalah terbuka dengan tabel transisi . Sebagian besar memiliki tambalan. Ada beberapa pertikaian yang merupakan jenis rutinitas. Tampaknya pengangkatan yang berat itu diambil oleh orang lain. The benang menunjukkan bahwa kita akan segera tahu.

Penulis merespons - sepertinya berjalan baik lagi ,.

Evan Carroll
sumber