Précédent   Forum du club des développeurs et IT Pro > Bases de données > PostgreSQL > Débuter
Débuter Forum d'entraide : Débuter en base de données avec PostgreSQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 11/11/2011, 20h02   #1
Momo8282
Invité de passage
 
Inscription : novembre 2011
Messages : 3
Détails du profil
Informations forums :
Inscription : novembre 2011
Messages : 3
Points : 0
Points : 0
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
Momo8282 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2011, 14h13   #2
punkoff
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 2 158
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 2 158
Points : 3 491
Points : 3 491
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;
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 15h13   #3
Momo8282
Invité de passage
 
Inscription : novembre 2011
Messages : 3
Détails du profil
Informations forums :
Inscription : novembre 2011
Messages : 3
Points : 0
Points : 0
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
Momo8282 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 21h53   #4
Momo8282
Invité de passage
 
Inscription : novembre 2011
Messages : 3
Détails du profil
Informations forums :
Inscription : novembre 2011
Messages : 3
Points : 0
Points : 0
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
Momo8282 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 01h20.


 
 
 
 
Partenaires

Hébergement Web