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 07/12/2016 18:44:41

arasleva
Membre

mise à jour du champ clé étrangère

Bonjour,


j'aimerais savoir comment paramétrer mes tables ou ma vue pour que le champ "foreign key" se remplisse automatiquement.... j'ai bien mis dans la structure de mes tables les contraintes de clés primaires et clé étrangère, j'ai aussi une vue qui reprend l'ensemble des champs de mes 2 tables. Quand je saisie des données dans cette vue, les champ_a et champ_b se remplissent bien mais pas le champ "clé étrangère" a_id........


voici la structure de mes tables :


tablea
   id_a (pk - serial)
   champa


et


tableb
   id_b (pk - serial)
   a_id (fk - integer)
   champb


et voici celle de ma vue :


CREATE OR REPLACE VIEW v_test AS
SELECT


    id_a,
    champa,
    champb,


FROM tablea
   JOIN tableb ON tablea.id_a = tableb.a_id


CREATE TRIGGER tablea_trg
  INSTEAD OF INSERT OR UPDATE OR DELETE
  ON v_form
  FOR EACH ROW
  EXECUTE PROCEDURE tablea_fct_trg();


CREATE TRIGGER tableb_trg
  INSTEAD OF INSERT OR UPDATE OR DELETE
  ON v_form
  FOR EACH ROW
  EXECUTE PROCEDURE tableb_fct_trg();


pouvez-vous m'aider?

Dernière modification par arasleva (08/12/2016 11:45:20)

Hors ligne

#2 07/12/2016 19:00:23

rjuju
Administrateur

Re : mise à jour du champ clé étrangère

Bonjour,

Il faudrait la définition des fonctions table_a_fct_trg() et table_b_fct_trg().  Sinon, je pense qu'un seul trigger pour mettre à jour les deux tables serait une meilleure idée.

Hors ligne

#3 08/12/2016 11:47:53

arasleva
Membre

Re : mise à jour du champ clé étrangère

Bonjour,


ha en effet si je peux regrouper mes triggers en un seul se serait mieux!! je ne savias pas que cela était possible.


Voici la structure de mes triggers


trigger tablea :


CREATE OR REPLACE FUNCTION exo.tablea_fct_trg()
  RETURNS trigger AS
$BODY$
   BEGIN
      IF TG_OP = 'INSERT' THEN
       

        INSERT INTO exo.tablea (id_a, champa, geom) VALUES (DEFAULT, NEW.champa, NEW.geom);
        RETURN NEW;
      ELSIF TG_OP = 'UPDATE' THEN
       

        UPDATE exo.tablea SET (id_a, champa, geom) = (DEFAULT, NEW.champa, NEW.geom)
        WHERE id_a = NEW.id_a;
        RETURN NEW;
      ELSIF TG_OP = 'DELETE' THEN
       

        DELETE FROM exo.tablea
        WHERE id_a = OLD.id_a;
        RETURN NULL;
      END IF;
      RETURN NEW;
    END;


Trigger tableb :


CREATE OR REPLACE FUNCTION exo.tableb_fct_trg()
  RETURNS trigger AS
$BODY$
   BEGIN
      IF TG_OP = 'INSERT' THEN
       
        INSERT INTO exo.tableb (champb, geom) VALUES (NEW.champb, NEW.geom);
        RETURN NEW;
      ELSIF TG_OP = 'UPDATE' THEN
       

        UPDATE exo.tableb SET (champb, geom) = (NEW.champb, NEW.geom)
        WHERE id_b = NEW.id_b;
        RETURN NEW;
      ELSIF TG_OP = 'DELETE' THEN
       

        DELETE FROM exo.tableb
        WHERE id_b = OLD.id_b;
        RETURN NULL;
      END IF;
      RETURN NEW;
    END;

Dernière modification par arasleva (08/12/2016 11:49:13)

Hors ligne

Pied de page des forums