Neexistuje žádné vytváření spouštěčů pro celou databázi, ale pro všechny takové operace hromadného správce můžete použít systémové tabulky PostgreSQL k generování dotazů místo toho, abyste je psali ručně. V tomto případě můžete spustit:
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;
Tím získáte sadu řetězců, které jsou příkazy SQL jako:
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
Stačí je spustit najednou (buď pomocí psql
nebo pgAdmin).
Nyní nějaké vysvětlení:
- Názvy tabulek ve své databázi vybírám pomocí
information_schema.tables
systémová tabulka. Protože existují data doslova všech tabulek, nezapomeňte vyloučitpg_catalog
ainformation_schema
schémata a toastové tabulky zselect
. - Používám
quote_ident(text)
funkce, která vloží řetězec do dvojitých uvozovek (""
) v případě potřeby (tj. názvy s mezerami nebo velkými písmeny to vyžadují). - Když mám seznam názvů tabulek, stačí je zřetězit s nějakými statickými řetězci, abych získal své příkazy SQL.
- Tento příkaz píšu pomocí sub-query, protože chci, abyste získali lepší představu o tom, co se zde děje. Můžete napsat jeden dotaz vložením
quote_ident(table_schema) || '.' || quote_ident(table_name)
místotab_name
.