PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#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 ?

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 smile.

je poste le code au cas ou smile

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

Pied de page des forums