Craig'in bu özelliği açıklamasını gerçekten çok seviyorum. SQL-2011 Spec onları bir tetikleyici bağlamında "silinen, eklenen veya değiştirilen satır koleksiyonu bir geçiş tablosu olarak bilinir" olarak tanımlar . Bir benzer bir açıklama docs sağlanır,
AFTER
Tetikleyiciler için geçiş tabloları , REFERENCING
cümle kullanılarak standart şekilde FOR EACH ROW
belirtilirken, tetikleyicilerde kullanılan satır değişkenleri , REFERENCING
cümle içinde belirtilemeyebilir . Bunlar, tetikleme işlevinin yazıldığı dile bağlı olarak kullanılabilir. Bir var sanki Bazı diller etkin bir davranması REFERENCING
içeren fıkraOLD ROW AS OLD NEW ROW AS NEW.
Esasen, ifadenin tüm değişikliklerini sizin için kullanılabilir hale getirir, bu da çok kullanışlıdır. Referans olarak, create trigger üzerindeki DDL, geçiş tablolarıyla şu şekilde görünür
REFERENCING OLD TABLE AS oldtable NEW TABLE AS newtable
Burada bir örnek görebilirsiniz ve işte test paketinden bir örnek ,
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();
Bazı ek notlar
- Yalnızca
AFTER
tetikleyicilerde kullanılabilirler.
- Onlar gibi şeyleri hesaba katıyorlar
ON CONFLICT
.
PG 10'da mevcut olduğundan tam olarak emin olmadığınızı belirtmek önemlidir . Geçiş tablolarıyla ilgili birçok açık sorun var . Çoğunda yamalar var. Bir çeşit rutin olan kavga var. Görünüşe göre ağır kaldırma başka biri tarafından alındı. İleti dizisi yakında bileceğimizi gösteriyor.
Yazar cevap verdi - yine iyi gidiyor gibi görünüyor.