Bene, non esiste una creazione di trigger a livello di database, ma per tutte queste operazioni di amministrazione di massa potresti utilizzare le tabelle di sistema PostgreSQL per generare query per te invece di scriverle a mano. In questo caso potresti eseguire:
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;
Questo ti darà un set di stringhe che sono comandi SQL come:
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
Devi solo eseguirli contemporaneamente (o tramite psql
o pgAdmin).
Ora qualche spiegazione:
- Seleziono i nomi delle tabelle nel mio database utilizzando
information_schema.tables
tabella di sistema. Poiché ci sono dati di letteralmente tutte le tabelle, ricorda di escluderepg_catalog
einformation_schema
schemi e tabelle di toast dal tuoselect
. - Uso
quote_ident(text)
funzione che inserirà la stringa all'interno dei segni di virgolette (""
) se necessario (es. i nomi con spazi o lettere maiuscole lo richiedono). - Quando ho un elenco di nomi di tabelle, li concateno semplicemente con alcune stringhe statiche per ottenere i miei comandi SQL.
- Scrivo quel comando usando sub-query perché voglio che tu abbia un'idea migliore di cosa sta succedendo qui. Puoi scrivere una singola query inserendo
quote_ident(table_schema) || '.' || quote_ident(table_name)
al posto ditab_name
.