#1 Fri 24 February 2023 14:07
- Sig_Passy
- Participant occasionnel
- Date d'inscription: 17 Mar 2022
- Messages: 38
Trigger sur plusieurs tables
Bonjour,
Je suis entrain de mettre en place un trigger de "suivi" sur ma base de données.
J'utilise Postgresql 10.2.
Jusque là tout va bien. Le soucis vient sur le fait que ma base compte pas mal de tables et que je souhaiterais "déployer" le trigger en une fois sur toutes mes tables (hors tables système) et non table par table.
Code:
-- création du Trigger MATABLE1 CREATE TRIGGER trigger_suivi_MATABLE1 AFTER INSERT OR UPDATE OR DELETE ON MATABLE1 FOR EACH ROW EXECUTE PROCEDURE public.fonction_suivi(); -- création du Trigger MATABLE2 CREATE TRIGGER trigger_suivi_MATABLE2 AFTER INSERT OR UPDATE OR DELETE ON MATABLE2 FOR EACH ROW EXECUTE PROCEDURE public.fonction_suivi();
Etc pour chaque table de la base
C'est là que les choses se complique...
J'imagine qu'il faut faire une sorte de "boucle" mais j'avoue atteindre mes limites ici...Pourriez vous m'aider ?
Merci à vous.
Dernière modification par Sig_Passy (Fri 24 February 2023 14:12)
Hors ligne
#2 Fri 24 February 2023 15:15
- tweaxy
- Participant actif
- Lieu: Abbeville
- Date d'inscription: 27 Dec 2018
- Messages: 76
Re: Trigger sur plusieurs tables
Bonjour,
Si je comprends bien, vous voulez créer un trigger sur chacune des tables de votre base de données (sauf tables systèmes) pour exécuter votre procédure fonction_suivi().
Vous pouvez utiliser la syntaxe suivante pour créer une fonction :
create or replace function create_trigger() returns integer as $$
declare
v_count integer;
v_table record;
begin
v_count := 0;
FOR v_table IN
SELECT n.nspname AS schemaname,
c.relname AS tablename
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON (n.oid = c.relnamespace)
WHERE c.relkind IN ('r') AND n.nspname NOT IN ('pg_catalog', 'information_schema')
LOOP
EXECUTE 'CREATE TRIGGER trigger_suivi_'||quote_ident(v_table.tablename)||' AFTER INSERT OR UPDATE OR DELETE ON '||quote_ident(v_table.tablename)||' FOR EACH ROW EXECUTE PROCEDURE public.fonction_suivi()';
v_count := v_count + 1;
END LOOP;
RETURN v_count;
end
$$ language 'plpgsql';
là, nous prenons toutes les tables via la conditionn c.relkind IN ('r') avec r qui correspond aux tables présentes dans votre base de données.
Nous avons exclus les tables du schéma pg_catalog et information_schema. Si vous voulez exclure d'autres schémas, il faut adapter le bout de code.
L'instruction LOOP va boucler votre requête de création de trigger pour chaque table qui ressort dans la sélection préalable.
Ensuite, il n'y a plus qu'à appeler cette fonction pour l’exécuter :
select create_trigger();
Je n'ai pas testé le code, mais la syntaxe semble être bonne.
Cordialement,
Léandre BERON
Hors ligne
#3 Fri 24 February 2023 15:29
- Sig_Passy
- Participant occasionnel
- Date d'inscription: 17 Mar 2022
- Messages: 38
Re: Trigger sur plusieurs tables
Ah oui clairement pas de mon niveau !
Je vais aller tester cela de suite.
Merci à vous.
Hors ligne
#4 Fri 24 February 2023 16:24
Re: Trigger sur plusieurs tables
Pourquoi réinventer la roue ? Il me semble que l'extension e-maj répond parfaitement à votre besoin : https://github.com/dalibo/emaj et https://emaj.readthedocs.io/fr/latest/
Jean-Marie
Azimut
Hors ligne
#5 Fri 24 February 2023 16:30
- Sig_Passy
- Participant occasionnel
- Date d'inscription: 17 Mar 2022
- Messages: 38
Re: Trigger sur plusieurs tables
Merci je ne connaissais pas cette extension ;-)
Hors ligne