Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
Tout d'abord avant de poser le problème : longue vie a PostgreSQL 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 ...
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 ) 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 ROWEXECUTE 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
Bonne journée et bonne continuation.
Loïc.
Dernière modification par loic88 (03/03/2009 12:19:25)
Hors ligne
Je pose une question stupide pour commencer C'est normal que le trigger soit créé « ON matiere » au lieu de « ON att_affaires » ?
Guillaume.
Hors ligne
Bonjour,
Oui simple erreur d'écriture je modifie.
Hors ligne
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
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
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
Merci je vais tester
Hors ligne
Pages : 1