Postgres tablosundaki her kayıt için bir tetikleyici çalıştırmanın iyi bir yolu var mı?


22

Bazı tabloların tasarımını kontrol edemediğim bir sisteme sahibim (Slony-I ile çoğaltılmıştır) ve bu nedenle, kopyalanan tablolardan bazı bilgileri çıkardığım 'gölge tabloları' olarak adlandırdığımız bir dizi var. ve göz ardı etmek istediğim kayıtları çıkarırken ihtiyacım olan işlenmiş biçimde saklayın.

Şu anda, yeni bir çoğaltma ayarladıktan sonra, bir güncelleme çalıştırıyorum UPDATE tablename SET field=fieldve tetiği çalıştırmaya zorlamak için kendisine (örn. ) Bir değer veriyorum, ancak tabloların bazıları milyonlarca kayıt ve büyüyor ve 30 dakika sürebilir. . (ve sonra da vakum var).

Bunu tetiklemenin daha iyi bir yolu var mı, yoksa giriş yapılan NEWiçeriğe veya arama bağlamına bağlı olarak çalışacak şekilde bir işlev yazmanın bir yolu var mı? Birinin güncellendiğini ve diğerini pek çok kez gördüğüm için iki farklı işlevi sürdürmek konusunda isteksizim.


Nasıl tetikleneceğini biliyordum ... İyi bir yol olup olmadığını sordum .
Joe,

Yanıtlar:


19

Aşağıdaki şablon kullanılarak yapılabilir:

CREATE TABLE tablename ( ... );

/* for direct invocation */
CREATE FUNCTION propagate_data(newrow tablename) RETURNS void
LANGUAGE plpgsql
AS $$
BEGIN
    INSERT INTO other_table VALUES (newrow.a, newrow.b, ...);
END:
$$;

/* trigger function wrapper */
CREATE FUNCTION propagate_data_trg() RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
    PERFORM propagate_data(NEW);
END;
$$;

CREATE TRIGGER propagate_data AFTER INSERT ON tablename FOR EACH ROW
    EXECUTE PROCEDURE propagate_data_trg();

Doh ... Geriye doğru düşünüyordum (tetikleme işlevini tersine değil bir prosedürle çağrılabilir hale getirmeye çalışıyor).
Joe

1
Aslında bunu yaptığımda, 'satırın' ayrılmış bir kelime olduğunu fark ettim, bu yüzden örneği düzelttim, böylece diğerlerinin de hata ayıklama yapmasına gerek kalmayacaktı.
Joe,

1
Gerçekten yıllar önce izlemeliydim. Sistemimde her şeyin çalışmasını sağlamadan önce bir süre qute aldım ... ve bu yöntem işe yaradı, ama performans tanrı berbattı. (tamamlamak için 30 dakikadan bir güne kadar uzadı).
Joe
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.