IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 PostgreSQL Discussion :

Updatable views avec joins


Sujet :

PostgreSQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2011
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2011
    Messages : 7
    Points : 6
    Points
    6
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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é
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Futur Membre du Club
    Inscrit en
    Novembre 2011
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2011
    Messages : 7
    Points : 6
    Points
    6
    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
    Futur Membre du Club
    Inscrit en
    Novembre 2011
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2011
    Messages : 7
    Points : 6
    Points
    6
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

Discussions similaires

  1. update view SQL avec Gridview
    Par kssillati dans le forum ASP.NET
    Réponses: 3
    Dernier message: 21/01/2011, 08h20
  2. [SQL]UPDATE avec JOIN
    Par sempire dans le forum DB2
    Réponses: 3
    Dernier message: 03/11/2009, 13h21
  3. Problème avec UPDATE et INNER JOIN
    Par korbn dans le forum Requêtes
    Réponses: 2
    Dernier message: 25/05/2009, 20h52
  4. Update avec join
    Par olibara dans le forum Langage SQL
    Réponses: 4
    Dernier message: 26/11/2008, 16h01
  5. UPDATE avec JOIN ?
    Par zakuli dans le forum Débuter
    Réponses: 3
    Dernier message: 25/07/2007, 14h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo