2015-04-16 20 views
8

Bir tetikleyicim var, ancak postalarımın tüm tablolarıyla ilişkilendirmem gerekiyor. Aşağıdaki gibi bir komut var mı?Postgresql'deki tüm tablo için tetikleyici nasıl oluşturulur?

CREATE TRIGGER delete_data_alldb 
BEFORE DELETE 
ON ALL DATABASE 
FOR EACH ROW 
EXECUTE PROCEDURE delete_data(); 
+0

Hayır, veritabanı genelindeki tetikleyicilere destek yok. Neden bu parçacıksal şeyi yapmak istesin? –

+0

Akıllı telefon ile senkronize etmek için veritabanı eylemlerini kaydetmem gerekiyor. Sonra bu tetik tablosunu masaya koşacağım. Yardım için teşekkürler. –

+0

@EduardoRafaelCorreadeSouza Bu soruyu sorduğunuzdan birkaç gün geçtiğini biliyorum ve muhtemelen bunu elle yaptınız. Ama cevabımı kontrol et. Gelecekte size benzer bir işte yardımcı olabilecek yararlı bir şeyler öğrenirseniz, cevabımı kabul etmeyi düşünmeniz iyi olur. –

cevap

8

Eh hiçbir veritabanı çapında tetik oluşturma orada ama tüm bu toplu yönetici-operasyonları için elle onları yazmak yerine size sorguları oluşturmak için PostgreSQL sistem tabloları kullanabilirsiniz. Bu durumda kaçabilirsin:

Bu gibi SQL komutlarıdır dizeleri set alacak
SELECT 
    'CREATE TRIGGER ' 
    || tab_name 
    || ' BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();' AS trigger_creation_query 
FROM (
    SELECT 
     quote_ident(table_schema) || '.' || quote_ident(table_name) as tab_name 
    FROM 
     information_schema.tables 
    WHERE 
     table_schema NOT IN ('pg_catalog', 'information_schema') 
     AND table_schema NOT LIKE 'pg_toast%' 
) tablist; 

: Sadece (ya psql veya pgAdmin tarafından) hepsini aynı anda çalıştırmak için gereken

CREATE TRIGGER schema1.table1 BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data(); 
CREATE TRIGGER schema1.table2 BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data(); 
CREATE TRIGGER schema1.table3 BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data(); 
CREATE TRIGGER schema2.table1 BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data(); 
CREATE TRIGGER schema2."TABLE2" BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data(); 
... 
etc 

. Şimdi bir açıklaması

:

  • Ben information_schema.tables sistem tablosunu kullanarak veritabanındaki tabloların adlarını seçin. Tam anlamıyla tüm tabloların olduğu için, pg_catalog ve information_schema şemalarını ve tost tablolarını hariç tutmayı unutmayın.
  • quote_ident(text) işlevini kullanıyorum, bu işlev gerektiğinde ("") çift tırnak işaretleri içerisine dize koyacaktır (boşluk veya büyük harf gerektiren isimler).
  • Tablo adları listesine sahip olduğumda, SQL komutlarımı almak için bunları bazı statik dizelerle birleştiriyorum.
  • Bu soruyu alt sorgu kullanarak yazarım çünkü burada neler olup bittiğine dair daha iyi bir fikre sahip olmanızı istiyorum. tab_name yerine quote_ident(table_schema) || '.' || quote_ident(table_name) koyarak tek bir sorgu yazabilirsiniz.
+1

FROM alt sorgusu aldım bir takma ad olmalı, bu yüzden eklendi) iç_select; 'sonuna kadar ve işe yaradı. –

+0

@IanVaughan teşekkürler% 100 haklısın! Cevabımı düzelttim. –

İlgili konular