sql >> Database >  >> RDS >> PostgreSQL

Hoe maak je een trigger voor alle tabellen in postgresql?

Welnu, er is geen databasebrede triggercreatie, maar voor al dergelijke bulk-admin-bewerkingen zou u PostgreSQL-systeemtabellen kunnen gebruiken om query's voor u te genereren in plaats van ze met de hand te schrijven. In dit geval zou u het volgende kunnen uitvoeren:

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;

Hiermee krijgt u een reeks tekenreeksen die SQL-opdrachten zijn zoals:

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

Je hoeft ze alleen maar tegelijk uit te voeren (ofwel door psql of pgAdmin).

Nu wat uitleg:

  • Ik selecteer namen van tabellen in mijn database met behulp van information_schema.tables systeem tafel. Omdat er gegevens zijn van letterlijk alle tabellen, moet u niet vergeten om pg_catalog uit te sluiten en information_schema schema's en toasttabellen uit uw select .
  • Ik gebruik quote_ident(text) functie die string tussen dubbele aanhalingstekens plaatst ("" ) indien nodig (bijv. namen met spaties of hoofdletters vereisen dat).
  • Als ik een lijst met tabelnamen heb, voeg ik ze gewoon samen met enkele statische tekenreeksen om mijn SQL-opdrachten te krijgen.
  • Ik schrijf die opdracht met behulp van een subquery omdat ik wil dat je een beter idee krijgt van wat hier aan de hand is. U kunt een enkele query schrijven door quote_ident(table_schema) || '.' || quote_ident(table_name) in plaats van tab_name .



  1. Postgresql:syntaxisfout op of in de buurt van -

  2. Hoe veelvoorkomende problemen met MySQL-database op te lossen?

  3. Hoe voeg ik toe aan elke rij in MySQL?

  4. Wijzig de codering van een lijst met objecten