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 ompg_catalog
uit te sluiten eninformation_schema
schema's en toasttabellen uit uwselect
. - 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 vantab_name
.