Temel olarak, UPDATE / INSERT / DELETE işlemi için bilgilendirilmek istediğimiz her tablo için bir TRIGGER oluşturmak istiyoruz. Bu tetikleyici tetiklendiğinde, daha sonra harici bir hizmetten yoklayacağımız bir günlük tablosuna yeni bir satır (etkinliği kodlayan) ekleyecek bir işlev yürütür.
Bu bir tetikleyici için oldukça standart bir kullanımdır.
Postgres TRIGGER (ler) ile çalışmaya başlamadan önce bunların nasıl ölçeklendiğini bilmek istiyoruz: Tek bir Postgres kurulumunda kaç tetikleyici oluşturabiliriz?
Onları oluşturmaya devam ederseniz, sonunda disk alanınız tükenir.
Tetikleyiciler için belirli bir sınır yoktur.
PostgreSQL sınırları yaklaşık sayfada belgelenmiştir .
Sorgu performansını etkiler mi?
Tetikleyici tipine, tetikleme diline ve tetiğin ne yaptığına bağlıdır.
BEFORE ... FOR EACH STATEMENT
Hiçbir şey yapmayan basit bir PL / PgSQL tetikleyicisi sıfıra yakın ek yüke sahiptir.
FOR EACH ROW
tetikleyiciler, tetikleyicilerden daha yüksek ek yüke sahiptir FOR EACH STATEMENT
. Etkilenen satır sayılarıyla açık bir şekilde ölçeklendirme.
AFTER
tetikleyiciler tetikleyicilerden daha pahalıdır, BEFORE
çünkü ifade işini bitirene kadar sıraya alınmalı ve sonra yürütülmelidir. Kuyruk büyürse (en azından 9.4 ve aşağısında, gelecekte değişebilir) diske dökülmezler, bu nedenle büyük AFTER
tetik kuyrukları kullanılabilir belleğin aşırı çalışmasına neden olarak ifadenin iptal edilmesine neden olabilir.
Ekleme NEW
/ güncelleme işleminden önce satırı değiştiren bir tetikleyici, DML yapan bir tetikleyiciden daha ucuzdur.
İstediğiniz belirli kullanım durumu, FOR EACH STATEMENT
tetikleyicilerin sanal OLD
ve NEW
tabloları görebileceği PostgreSQL 9.5'e (şanslıysanız) dönüştürebilecek devam eden bir geliştirmeyle daha iyi performans gösterecektir . Mevcut PostgreSQL sürümlerinde bu mümkün değildir, FOR EACH ROW
bunun yerine tetikleyicileri kullanmalısınız.
Bunu daha önce deneyen var mı?
Elbette. Denetim, akıl sağlığı kontrolü vb. İle tetikleyiciler için oldukça standart bir kullanımdır.
Sen içine bakmak isteyeceksiniz LISTEN
ve NOTIFY
görev tabloya değişiklikler olduğunda sizin işçi uyanmak için iyi bir yol.
Harici sistemlerle doğrudan tetikleyicilerden konuşmaktan kaçınarak en önemli şeyi zaten yapıyorsunuz. Bu, performans ve güvenilirlik açısından sorunlu olma eğilimindedir. İnsanlar genellikle doğrudan bir tetikleyiciden posta göndermek gibi şeyler yapmaya çalışırlar ve bu kötü bir haberdir.