Postgres'de “geçiş tablosu” nedir?


12

Postgres 10'daki yenilikleri açıklayan sayfa “Tetikleyiciler için Geçiş Tabloları” ndan bahsediyor.

Tetikleyiciler için Geçiş Tabloları

Bu özellik, AFTER STATEMENTuygun olduğunda eski ve yeni satırları sorgulara maruz bırakarak tetikleyicileri hem kullanışlı hem de performans haline getirir . Bu özellikten önce, AFTER STATEMENTtetikleyicilerin bunlara doğrudan erişimi yoktu ve geçici çözümlerin bizans ve performansı düşüktü. Artık çok sayıda tetik mantığı yazılabilir, çünkü AFTER STATEMENTher satırda FOR FOR ROW tetikleyicilerinin gerektirdiği pahalı bağlam anahtarları yapmaktan kaçınılır.

Geçiş tablosu nedir?

Yanıtlar:


12

Orada nasıl olduğunu OLDve NEWrekor-değişkenleri FOR EACH ROWtetikleyici?

Geçiş tabloları FOR EACH STATEMENTeşdeğerdir. Bunlar eski ve yeni tuplesli masalardır, böylece tetikleriniz nelerin değiştiğini görebilir.


9

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,

AFTERTetikleyiciler için geçiş tabloları , REFERENCINGcümle kullanılarak standart şekilde FOR EACH ROWbelirtilirken, tetikleyicilerde kullanılan satır değişkenleri , REFERENCINGcümle içinde belirtilemeyebilir . Bunlar, tetikleme işlevinin yazıldığı dile bağlı olarak kullanılabilir. Bir var sanki Bazı diller etkin bir davranması REFERENCINGiç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

  1. Yalnızca AFTERtetikleyicilerde kullanılabilirler.
  2. 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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.