Eh bien, il n'y a pas de création de déclencheur à l'échelle de la base de données, mais pour toutes ces opérations d'administration en bloc, vous pouvez utiliser les tables système PostgreSQL pour générer des requêtes pour vous au lieu de les écrire à la main. Dans ce cas, vous pouvez exécuter :
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;
Cela vous donnera un ensemble de chaînes qui sont des commandes SQL comme :
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
Il vous suffit de les lancer en une seule fois (soit par psql
ou pgAdmin).
Maintenant quelques explications :
- Je sélectionne les noms des tables dans ma base de données en utilisant
information_schema.tables
tableau système. Parce qu'il y a des données de littéralement toutes les tables, n'oubliez pas d'exclurepg_catalog
etinformation_schema
schémas et tables toast de votreselect
. - J'utilise
quote_ident(text)
fonction qui mettra une chaîne entre guillemets doubles (""
) si nécessaire (c'est-à-dire que les noms avec des espaces ou des lettres majuscules l'exigent). - Lorsque j'ai une liste de noms de tables, je les concatène simplement avec des chaînes statiques pour obtenir mes commandes SQL.
- J'écris cette commande en utilisant une sous-requête parce que je veux que vous ayez une meilleure idée de ce qui se passe ici. Vous pouvez écrire une seule requête en mettant
quote_ident(table_schema) || '.' || quote_ident(table_name)
à la place detab_name
.