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

Hvordan opretter man trigger for alle tabeller i postgresql?

Der er ingen udløseroprettelse for hele databasen, men for alle sådanne bulk-admin-operationer kan du bruge PostgreSQL-systemtabeller til at generere forespørgsler til dig i stedet for at skrive dem i hånden. I dette tilfælde kan du køre:

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;

Dette vil give dig et sæt strenge, som er SQL-kommandoer som:

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

Du skal bare køre dem på én gang (enten med psql eller pgAdmin).

Nu lidt forklaring:

  • Jeg vælger navne på tabeller i min database ved hjælp af information_schema.tables systemtabel. Fordi der er data for bogstaveligt talt alle tabeller, skal du huske at ekskludere pg_catalog og information_schema skemaer og toast-tabeller fra din select .
  • Jeg bruger quote_ident(text) funktion, som vil sætte streng inde i dobbelte anførselstegn ("" ) hvis det er nødvendigt (dvs. navne med mellemrum eller store bogstaver kræver det).
  • Når jeg har liste over tabelnavne, sammenkæder jeg dem bare med nogle statiske strenge for at få mine SQL-kommandoer.
  • Jeg skriver den kommando ved hjælp af underforespørgsel, fordi jeg vil have, at du får en bedre ide om, hvad der foregår her. Du kan skrive en enkelt forespørgsel ved at sætte quote_ident(table_schema) || '.' || quote_ident(table_name) i stedet for tab_name .



  1. Sådan indstilles skemasortering i MySQL til japansk

  2. Hvordan kan jeg gemme multiple choice-værdier i en SQL-tabel? Hvordan skal bordet være?

  3. mysql tælle ord i sql syntaks

  4. Hvordan kontrollerer jeg, om en kolonne er tom eller null i MySQL?