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 :

Update sur vue


Sujet :

PostgreSQL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Update sur vue
    Bonjour,

    Soient les tables (pour l'exemple) :
    a1(id, nom, age)
    a2(id, ville, pays)
    la vue mavue définie par :
    mavue = SELECT nom, age, ville, pays FROM a1, a2 WHERE a1.id = a2.id

    j'aimerais faire cet update sur la vue
    UPDATE mavue SET nom = 'bob', ville = 'paris' WHERE ville = 'rungis'

    j'ai donc crée une règle On Update :
    UPDATE a1 SET nom = new.nom, age = new.age FROM a2
    WHERE a1.id = a2.id AND a1.nom = old.nom AND a1.age = old.age
    AND a2.ville = old.ville AND a2.pays = old.pays

    Donc j'arrive à mettre à jour nom et age mais je ne sais pas comment mettre à jour les champs ville et pays
    Quelle est la bonne technique pour faire cela ?

    Merci

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 40
    Points : 36
    Points
    36
    Par défaut
    Bonjour.

    Elle est où la règle que tu as créé?

    Une règle de mise à jour s'écrit comme suit:

    CREATE RULE nom AS
    ON événement (dans ton cas UPDATE)
    TO table (nom de la table ou de la vue) WHERE condition
    DO (commande à exécuter)

    Je vois que tu veux créer une vue et lors de la mise à jour tu manipules deux tables. Est-ce que tu peux expliquer davantage ce que tu cherches à faire, pour que je puisse comprendre.

    Bon courage.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Vue et update
    Bonjour et merci de vous intéresser à mon problème.

    j'ai, pour simplifier, juste indiqué la requête qu'effectuait la règle

    la requête pour créer la règle est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE OR REPLACE RULE mavue_regle AS
        ON UPDATE TO mavue DO INSTEAD  UPDATE a1 SET nom = new.nom, age = new.age
       FROM a2
      WHERE a1.id = a2.id AND a2.ville::text = old.ville::text AND a2.pays::text = old.pays::text AND a1.nom::text = old.nom::text AND a1.age = old.age;
    L'idée c'est que j'ai une vue sur une jointure de plusieurs tables (ici a1 et a2)
    et que je voudrais pouvoir réaliser des update directement sur la vue (update qui en réalité mettront à jour a1 et a2)
    Je suis capable de créer la vue sur une jointure
    Je suis capable de gérer les update pour une table composant la vue

    mais j'aimerais pouvoir gérer les update pour toutes les tables composant la vue

    Merci

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 40
    Points : 36
    Points
    36
    Par défaut
    Bonjour.

    Tu dois savoir que les vues sont utilisées pour cacher certaines colonnes, simplifier l'utilisation de table comportant plusieurs colonnes ou bien simplifier et accélerer l'écriture des requêtes. D'autre part, la norme SQL propose des restrictions importantes pour la modification ou l'insertion dans les vues. C'est-à-dire, peu d'opérations sont autorisées dés qu'une vue porte sur plusieurs tables.

    Dans ton cas (si je comprends bien), tu as créé une vue en utilisant deux tables et tu cherches à mettre à jour les deux à travers la manipulation de la vue.

    Je ne pense pas que c'est possible. Et même si c'est possible, je ne pense pas que ça serait bien conçu.

    Bon courage.

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut update sur vue
    En fait si je ne modifie pas les données de ma clause where, cela fonctionne.

    pour faire bête et simple disons que ma vue se définit comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE OR REPLACE VIEW mavue AS 
     SELECT a1.nom, a1.age, a1.oid AS oid1, a2.oid AS oid2, a2.ville, a2.pays
       FROM a1, a2
      WHERE a1.id = a2.id;
    si j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE OR REPLACE RULE r1 AS
        ON UPDATE TO mavue DO  UPDATE a1 SET nom = new.nom, age = new.age
      WHERE a1.oid = old.oid1;
     
    et 
     
    CREATE OR REPLACE RULE r2 AS
        ON UPDATE TO mavue DO INSTEAD  UPDATE a2 SET ville = new.ville, pays = new.pays
      WHERE a2.oid = old.oid2;
    Quand je fais :
    update mavue set ville = 'bordeaux', nom = 'toto' where nom = 'mat'

    la table a1 se met bien à jour comme on l'attend.
    la table a2 ne se met pas à jour.

    Tout se passe comme s'il effectuait cela :
    -Sélection des lignes de la jointure concernées par l'update.
    -Déclenchement de la règle 1 => maj de la table a1 tous les 'mat' s'appellent maintenant 'toto'
    -Déclenchement de la règle 2 => (moi je m'attendrais à maj de la table a2, mais c'est pas ça) sélection des lignes de la jointure concernées par l'update (plus aucune puisque les 'mat' s'appellent 'toto') et maj de ces lignes.

    En fait il faudrait que je puisse soit :
    - définir plusieurs tables à updater dans ma requete update (certains SGBD le font, pas postgres, dommage)
    - utiliser une procédure stockée dans la règle. Je vais essayer cela.
    - ...

    Merci

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 1
    Points : 3
    Points
    3
    Par défaut
    Pour que la mise jour s'effectue correctement il faut que les règles définies ci-dessus s'effectue dans l'ordre suivant r2 puis r1 et non l'inverse

    En effet dans la séquence
    update mavue set ville = 'bordeaux', nom = 'toto' where nom = 'mat'
    r1: UPDATE a1 SET nom = new.nom, age = new.age WHERE a1.oid = old.oid1;
    update mavue set ville = 'bordeaux', nom = 'toto' where nom = 'mat'
    r2: UPDATE a2 SET ville = new.ville, pays = new.pays WHERE a2.oid = old.oid2;

    r2 ne peut pas être déclenchée car r1 à mis à jour nom et la condition where nom = 'mat' ne renvoie plus aucune ligne.

    Pour que cette mise à jour s'effectue correctement il faut renommer r1 en r3

    Cependant la limite de l'utilisation des vues reste posée dans le cas suivant:
    update mavue set ville = 'bordeaux', nom = 'toto' where nom = 'mat' and ville ='arcachon'

Discussions similaires

  1. [Forms 6i] : update sur vue
    Par gaultier dans le forum Forms
    Réponses: 16
    Dernier message: 28/05/2010, 12h01
  2. update sur une vue
    Par lastrecrue dans le forum Débuter
    Réponses: 1
    Dernier message: 24/04/2009, 21h54
  3. [SQL SERVER 2k5]Trigger update instead of sur vue
    Par qlaimand dans le forum Développement
    Réponses: 0
    Dernier message: 18/06/2008, 17h06
  4. [Access 2007] update sur des tables / vues SQL server
    Par Flamby38 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 28/09/2007, 13h56
  5. Mapping sur Vue / Update non voulue.
    Par Ho(c)ine. dans le forum Hibernate
    Réponses: 3
    Dernier message: 23/08/2007, 09h44

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