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.
Hayır, veritabanı genelindeki tetikleyicilere destek yok. Neden bu parçacıksal şeyi yapmak istesin? –
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. –
@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. –