PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment créer un déclencheur pour toutes les tables dans postgresql ?

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'exclure pg_catalog et information_schema schémas et tables toast de votre select .
  • 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 de tab_name .