Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 05/04/2016 14:30:53
- mika
- Membre
Question trigger
Bobjour,
Etant nouveau dans le domaine, je me pose une question concernant les triggers : Est-il possible de mettre à jour une ligne sans modifier toutes les lignes de la même colonnes ?
Je m'explique. J'ai créer une table etude qui références toutes les études disponibles. A chaque fois qu'une nouvelle etude est crée (ce qui correspond à un nouvelle insert) je calcule le nombre d'enregistrement contenu dans la table qui est lié à la nouvelle étude. Mon soucis est que quand le trigger se lance, il compte bien les enregistrements et l'affecte bien à la ligne courante, mais il met à zero toutes les lignes précédentes.
(ps : ce n'est que du bidouillage, rien de très officiel)
table d'étude, ou le champs 'nbenregistrements' contient le nom de table associé à l'insert et dont il faut compter le nombre d'enregistrement.
CREATE TABLE etude
(
id serial NOT NULL,
personneressource character(50),
nometude character(50),
description character(50),
licence character(50),
droit character(50),
espece character(50),
datededebu character(20),
datedefin character(20),
emprise geometry,
creatfichdat character(70),
nomdfluxassoc character(255),
nbenregistrements character(20),
nombranimaux character(20),
CONSTRAINT etude_pkey PRIMARY KEY (id)
)
la fonction
CREATE OR REPLACE FUNCTION etude_count () RETURNS TRIGGER AS $etude_cn$
DECLARE
nomTable text;
BEGIN
--ici j'ai essayer de recupérer le nom de la table associé
execute 'select etude.nomdfluxassoc from etude where etude.id = '||NEW.id||'' INTO nomTable ;
--fonctionne mais met a zero mes autre champs
--ici je met a jour le champs de la table etude
execute 'update etude set nbenregistrements =(SELECT COUNT(*) FROM '||nomTable||' where id = '||NEW.id||')';
RETURN;
END;
$etude_cn$ language plpgsql;
le trigger
CREATE TRIGGER etude_ch
AFTER INSERT ON etude
FOR EACH ROW EXECUTE PROCEDURE
etude_count();
Ce qui m'étonne le plus c'est que j'ai repris la même structure pour un trigger qui met à jour la date de création du fichier, et ça fonctionne. Alors je ne sais vraiment pas.
En tout cas merci de votre patience !
Dernière modification par mika (05/04/2016 14:31:37)
Hors ligne
#2 05/04/2016 15:31:15
- gleu
- Administrateur
Re : Question trigger
Vous voulez mettre à jour les autres lignes ou la ligne en cours d'insertion ?
Guillaume.
Hors ligne
#3 05/04/2016 15:33:14
- mika
- Membre
Re : Question trigger
La ligne en cours d'insertion, mais j'ai réussi à résoudre mon soucis.
Merci d'avoir répondu .
je poste le code au cas ou
CREATE OR REPLACE FUNCTION etude_count () RETURNS TRIGGER AS $etude_cn$
DECLARE
nomTable text;
BEGIN
execute 'select nomdfluxassoc from etude where id = '||NEW.id||'' INTO nomTable ;
--fonctionne mais met a zero mes autre champs
execute ' update etude set nbenregistrements = ( SELECT COUNT(*) FROM '||nomTable||') where id = '||NEW.id||'';
RETURN null;
END;
$etude_cn$ language plpgsql;
Hors ligne
Pages : 1