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
- Mereka hanya tersedia di
AFTER pemicu.
- 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 ,.