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 ekskluderepg_catalog
oginformation_schema
skemaer og toast-tabeller fra dinselect
. - 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 fortab_name
.