Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Invité de passage
    Inscrit en
    novembre 2011
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : novembre 2011
    Messages : 7
    Points : 4
    Points
    4

    Par défaut Updatable views avec joins

    Bonjour,

    Je suis débutant et je travaille avec PostgreSQL 9.0. J'ai quelques petits problèmes que je n'arrive pas à résoudre. Le premier concerne les updatable views. J'ai une vue avec plusieurs INNER JOIN et FULL OUTER JOIN. Voici à quoi la vue ressemble, avec des JOIN en moins dans un souci de clarté pour l'exemple:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE VIEW sh_men.test_vue_mentions
      AS
      SELECT M.mention_id,
             M.photo_code,
             O.nom,
             P.code
      FROM sh_men.mentions M
      INNER JOIN sh_men.precisions P ON M.precision_id = P.precision_id
      FULL OUTER JOIN sh_men.organisations O ON M.org_id = O.org_id
    Le but de cette vue est de présenter des informations parlantes pour l'utilisateur plutôt que des ids (ex: O.nom soit le nom de l'organisation plutôt que M.org_id).

    J'aimerais en faire une UPDATABLE VIEW. Ce que je n'arrive pas à saisir c'est comment m'y prendre pour toutes les colonnes issues des JOIN. Par exemple, à date j'ai fait une RULE sur le UPDATE comme suit:
    Code :
    1
    2
    3
    4
    5
    6
    7
     
    CREATE OR REPLACE RULE test_vue_mentions_update_rule AS
        ON UPDATE TO sh_men.test_vue_mentions
        DO INSTEAD
        UPDATE sh_men.mentions
        SET mention_id = NEW.mention_id, photo_code = NEW.photo_code
        WHERE mention_id = OLD.mention_id
    Par contre, comment faire pour que dans la table mentions le id de l'organisation (M.org_id) soit changé en fonction du nom de l'organisation (O.nom) saisi?

    Je vous remercie beaucoup pour votre aide,

    Mathieu

  2. #2
    Expert Confirmé Sénior
    Homme Profil pro
    Inscrit en
    mai 2002
    Messages
    2 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : mai 2002
    Messages : 2 865
    Points : 4 649
    Points
    4 649

    Par défaut

    c'est implicite.

    Votre rule devrait fonctionner en l'état non ?

    quand vous ferre votre upate il faudra bien spécifier :

    Code :
    1
    2
    3
    4
     
     
    UPDATE ma_vue SET ...
    WHERE id = ..
    Vu que l'id de votre vue est celui de la table mention.


    edit :
    Pour étayer voici un exemple d'une de mes vues :

    la vue
    Code :
    1
    2
    3
    4
    5
     
    CREATE OR REPLACE VIEW v_societe_vsoc AS 
     SELECT cli.cli_id, soc.soc_rais_soc, soc.soc_ine
       FROM t_societe_soc soc
       JOIN t_client_cli cli ON cli.cli_id = soc.cli_id;
    rule delete
    Code :
    1
    2
    3
    4
    5
    6
    7
     
    CREATE OR REPLACE RULE "_DELETE" AS
        ON DELETE TO v_societe_vsoc DO INSTEAD ( DELETE FROM t_societe_soc
      WHERE t_societe_soc.cli_id = old.cli_id;
     DELETE FROM t_client_cli
      WHERE t_client_cli.cli_id = old.cli_id;
    );

    rule update :
    Code :
    1
    2
    3
    4
     
    CREATE OR REPLACE RULE "_UPDATE" AS
        ON UPDATE TO v_societe_vsoc DO INSTEAD  UPDATE t_societe_soc SET soc_rais_soc = new.soc_rais_soc, soc_ine = new.soc_ine
      WHERE t_societe_soc.cli_id = old.cli_id;


    insert (trigger + fonction) :
    Code :
    1
    2
    3
    4
    5
    6
     
    CREATE TRIGGER "_INSERT"
      INSTEAD OF INSERT
      ON v_societe_vsoc
      FOR EACH ROW
      EXECUTE PROCEDURE "_INSERT_V_SOCIETE_VSOC"();
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE OR REPLACE FUNCTION "_INSERT_V_SOCIETE_VSOC"()
      RETURNS TRIGGER AS
    $BODY$
    declare id integer;
     
    begin
    INSERT INTO T_CLIENT_CLI (cli_nom) VALUES (NULL) returning cli_id INTO id;
     
    INSERT INTO T_SOCIETE_SOC VALUES (id, new.soc_rais_soc, new.soc_ine);
    RETURN NULL;
    end;$BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100;

  3. #3
    Invité de passage
    Inscrit en
    novembre 2011
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : novembre 2011
    Messages : 7
    Points : 4
    Points
    4

    Par défaut

    Bonjour,

    Merci pour la réponse! C'est la partie dans la fonction (ligne 8) qui me manquait. Je teste le tout et je redonne des nouvelles pour indiquer si mon problème est résolu.

    à bientôt,

    Mathieu

  4. #4
    Invité de passage
    Inscrit en
    novembre 2011
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : novembre 2011
    Messages : 7
    Points : 4
    Points
    4

    Par défaut

    Bonjour,

    Désolé du délais pour le suivi je n'ai eu le temps de retravailler sur cet aspect que cet après-midi. Voici en fait comment j'ai procédé pour le UPDATE, par exemple:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE OR REPLACE RULE test_vue_mentions_update_rule AS
        ON UPDATE TO sh_men.test_vue_mentions
        DO INSTEAD
        UPDATE sh_men.mentions
        SET mention_id = NEW.mention_id,
            photo_code = NEW.photo_code,
            org_id = (SELECT org_id
                      FROM sh_men.organisations
                      WHERE NEW.nom = nom),
            precision_id = (SELECT precision_id
                            FROM sh_men.precisions
                            WHERE NEW.code = code)
        WHERE mention_id = OLD.mention_id;
    Mathieu

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •