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

#2 Re : Général » Trigger sur postgresql sur delete, update, insert » 26/03/2009 10:44:16

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.

#3 Re : Général » Insert into avec contrainte » 04/03/2009 09:44:28

Bon c'est résolu je passe par un update wink


Bonne journée !

#4 Général » Insert into avec contrainte » 03/03/2009 18:42:30

loic88
Réponses : 2

Bonjour,

Second problème

Je souhaite faire un insert into avec une jointure qui fonctionne seulement le problème est qu'il y à une contrainte sur la clé primaire et que par conséquent cela m'insulte !

Voici la requete :


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

J'ai lu sur des forum que l'on pouvait peut être utiliser cette commande :


ON DUPLICATE KEY UPDATE idaff=idaff


Cependant je n'arrive pas à lui faire manger le vilain !

#6 Général » Trigger sur postgresql sur delete, update, insert » 03/03/2009 11:04:17

loic88
Réponses : 6

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.

Pied de page des forums

Propulsé par FluxBB