Tja, det finns ingen databasomfattande triggerskapande men för alla sådana bulk-admin-operationer kan du använda PostgreSQL-systemtabeller för att generera frågor åt dig istället för att skriva dem för hand. I det här fallet kan du köra:
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;
Detta kommer att få dig uppsättning strängar som är SQL-kommandon 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 behöver bara köra dem på en gång (antingen med psql
eller pgAdmin).
Nu lite förklaring:
- Jag väljer namn på tabeller i min databas med
information_schema.tables
systemtabell. Eftersom det finns data för bokstavligen alla tabeller, kom ihåg att uteslutapg_catalog
ochinformation_schema
scheman och toast-tabeller från dinselect
. - Jag använder
quote_ident(text)
funktion som sätter en sträng i dubbla citattecken (""
) om det behövs (dvs namn med mellanslag eller versaler kräver det). - När jag har lista över tabellnamn sammanfogar jag dem bara med några statiska strängar för att få mina SQL-kommandon.
- Jag skriver det kommandot med hjälp av sub-query eftersom jag vill att du ska få bättre uppfattning om vad som händer här. Du kan skriva en enda fråga genom att sätta
quote_ident(table_schema) || '.' || quote_ident(table_name)
i stället förtab_name
.