Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

#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

jmarsac
Participant assidu
Lieu: NICE
Date d'inscription: 26 Oct 2005
Messages: 572
Site web

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

 

Pied de page des forums

Powered by FluxBB