PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come creare trigger per tutte le tabelle in postgresql?

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 escludere pg_catalog e information_schema schemi e tabelle di toast dal tuo select .
  • 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 di tab_name .