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 AFTER
pemicu ditentukan menggunakan REFERENCING
klausa dalam cara standar, variabel baris yang digunakan dalam FOR EACH ROW
pemicu mungkin tidak ditentukan dalam REFERENCING
klausa. Mereka tersedia dengan cara yang tergantung pada bahasa di mana fungsi pemicu ditulis. Beberapa bahasa berperilaku efektif seolah-olah ada REFERENCING
klausa 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 ,.