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 03/03/2009 11:04:17

loic88
Membre

Trigger sur postgresql sur delete, update, insert

Bonjour,

Tout d'abord avant de poser le problème : longue vie a PostgreSQL big_smile et merci aux gens le faisant vivre.

Je suis confronté aux trigger et après avoir passé une journée à fouiller l'ensemble ? du web je viens à la source pour que l'on puisse m'aider afin d'éviter le suicide big_smile ...

Je suis apprenti Sigiste et l'on me demande ceci : Attention accrochez vous c'est parti !


Petite présentation : Je possède 3 tables : att_affaires; pt_communes; itg_pt_affaire_22


->La table att_affaires listes des travaux

CREATE TABLE att_affaires
(
  idaff integer NOT NULL,
  insee integer,
  numaff character(6),
  typeaff character(1),
  annee character(4),
  intitule character(250),
  maitre_oeuvre character(250),
  mission character(250),
  mtestiminitial numeric(20,2),
  mtfininit numeric(20,2),
  mtfindef numeric(20,2),
  CONSTRAINT pk_att_affaires_idaff PRIMARY KEY (idaff)
)
WITH (OIDS=FALSE);


->La table pt_communes liste toutes les communes d'un département.


REATE TABLE pt_commune
(
  code_insee character varying(255),
  etq_geoconcept character varying(255),
  etq_intrageo character varying(255),
  identifiant integer NOT NULL,
  insee_num integer,
  nom character varying(255),
  geometrie geometry,
  siren_epci integer,
  idpays integer,
  siren integer,
  idcanton integer,
  CONSTRAINT pk_pt_commune PRIMARY KEY (identifiant),
  CONSTRAINT enforce_dims_geometrie CHECK (ndims(geometrie) = 2),
  CONSTRAINT enforce_srid_geometrie CHECK (srid(geometrie) = 27572)
)
WITH (OIDS=FALSE);


->La table itg_affaire_22 permet de rassembler l'affaire liée à la commune


CREATE TABLE itg_affaires_pt_22
(
  nom character varying(255),
  geometrie geometry,
  idaff integer NOT NULL,
  insee character varying,
  numaff character(6),
  typeaff character(1),
  annee character(4),
  intitule character(250),
  maitre_oeuvre character(250),
  mission character(250),
  mtestiminitial numeric(20,2),
  mtfininit numeric(20,2),
  mtfindef numeric(20,2)
)
WITH (OIDS=FALSE);



Le tout permet par la suite de représenter géographiquement les affaires sur les communes (on peut imaginer par la suite compter le nombre d'affaires...)




Ce que je dois faire (avec votre aide ) :=)



Lorsque qu'il y dans la table pt_affaires à soit :

->Une modification sur une ou plusieurs lignes
->Un delete sur une ou plusieurs lignes
->Un insert into sur une ou plusieurs lignes

Je dois mettre à jour automatiquement par un trigger (déclencheur) sur la table att_affaires (si vous suivez big_smile ) la table itg_affaires_22


ALors j'ai bien essayé ceci : pour l'insert into :

CREATE OR REPLACE FUNCTION trig_insert()

RETURNS "trigger" AS

$BODY$DECLARE


BEGIN

INSERT INTO itg_affaires_pt_22 ( nom, geometrie, idaff, insee, numaff, typeaff, annee, intitule, maitre_oeuvre, mission,mtestiminitial, mtfininit, mtfindef )
    SELECT nom, geometrie, idaff, insee, numaff, typeaff, annee, intitule, maitre_oeuvre, mission,mtestiminitial, mtfininit, mtfindef
    FROM pt_commune, att_affaires
    where pt_commune.code_insee = att_affaires.insee and id1 = new.id1 AND id2 = new.id2;

END;

$BODY$

LANGUAGE 'plpgsql' VOLATILE;

Avec ceci :

CREATE TRIGGER test_insert

BEFORE INSERT

ON att_affaires
FOR EACH ROW

EXECUTE PROCEDURE trig_insert();

Cependant rien ne se passe. Si quelqu'un peut me venir en aide me donner les bons tuyaux je lui serait très reconnaissant wink


Bonne journée et bonne continuation.

Loïc.

Dernière modification par loic88 (03/03/2009 12:19:25)

Hors ligne

#2 03/03/2009 11:36:47

gleu
Administrateur

Re : Trigger sur postgresql sur delete, update, insert

Je pose une question stupide pour commencer smile C'est normal que le trigger soit créé « ON matiere » au lieu de « ON att_affaires » ?


Guillaume.

Hors ligne

#3 03/03/2009 12:18:58

loic88
Membre

Re : Trigger sur postgresql sur delete, update, insert

Bonjour,


Oui simple erreur d'écriture je modifie.

Hors ligne

#4 03/03/2009 15:03:25

gleu
Administrateur

Re : Trigger sur postgresql sur delete, update, insert

Il manque au moins un RETURN dans la fonction. Soit un RETURN NULL pour annuler l'insertion, soit un RETURN NEW pour la continuer.


Guillaume.

Hors ligne

#5 26/03/2009 10:44:16

loic88
Membre

Re : Trigger sur postgresql sur delete, update, insert

Bonjour


Merci pour vos réponse, le trigger fonctionne avec un return merci du coup de main !


Cependant je suis confronté à un autre problème.


Mon trigger est sur une action delete et va faire un delete de tout une autre table.

Cependant en terme de rapidité (vu qu'il y à de nombreuse ligne) à chaque fois qu'il y à un delete sur la table1 il refait un delete sur la table2.


J'aimerais donc pouvoir appliquer une condition qui dit que si ma table 2 est vide alors tu ne fais pas le delete *


DECLARE

num integer;

BEGIN

IF itg_affaires_pt.numaff IS NOT NULL THEN

delete from itg_affaires_pt;

return OLD;

ELSE

EXIT;

END IF;

END;


J'ai essayé plusieurs choses sans succès pouvez vous me venir en aide ?


Cordialement
Loïc.

Hors ligne

#6 26/03/2009 17:19:33

gleu
Administrateur

Re : Trigger sur postgresql sur delete, update, insert

Le plus simple dans ce cas est de faire un

SELECT * FROM latable LIMIT 1

puis de tester si cela a renvoyé une ligne

IF FOUND

Guillaume.

Hors ligne

#7 26/03/2009 17:25:26

loic88
Membre

Re : Trigger sur postgresql sur delete, update, insert

Merci je vais tester wink

Hors ligne

Pied de page des forums