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

SQL Oracle Discussion :

Clé étrangère sur une vue


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 85
    Par défaut Clé étrangère sur une vue
    Bonjour et merci de votre temps,

    Est-il possible de créer une clé étrangère sur une vue qui possède une clé primaire ? Quelque chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    alter table personne
    add constraint FK_PER_ADR
    foreign key (personne_id)
    references vue_addresse (personne_id);

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Non, puisqu'une vue n'a pas de clef.
    Par contre vous pouvez le faire sur la table derrière la vue.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 85
    Par défaut
    Malheureusement, ce n'est pas possible puisque la vue est constituée d'une table qui vient d'une base distante !

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Et bien copiez votre table distante dans une table locale !

  5. #5
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    En fait, pourquoi voulez-vous faire cela ?
    On ne peut pas référencer une vue, mais il y a probablement un moyen de faire ce que vous souhaitez d'une autre manière.
    Cordialement,
    Franck.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 85
    Par défaut
    Waldar,

    Oui, j'ai pensé à cette solution mais j'ai plutôt opté pour un trigger.

    Frank,

    Le trigger me paraissait être l'autre solution.

  7. #7
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lcaya Voir le message
    Le trigger me paraissait être l'autre solution.
    Attention, remplacer l'intégrité référentielle par du code pose souvent des problèmes de concurrence d'accès. Ton trigger va vérifier que l'enregistrement parent exist(ait) au moment du démarrage de la requête. Mais il faut aussi empêcher qu'une autre session ne le supprime avant la fin de ta transaction. Faire un select for update risque de bloquer beaucoup les accès concurrents (et si la vue est ('complexe' ce n'est paut âtre pas possible). Faire un select normal risque d'avoir un incohérence de données.

    Pour moi, l'alternative est soit:
    - mettre la contraint d'intégrité sur les tables qui sont derrière la vue (sil la vue n'est pas trop 'complexe')
    - ou faire une vue matérialisée et là tu peux mettre des contraintes sur la table qui l'implémente

    Cordialement,
    Franck.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 85
    Par défaut
    Frank,

    Merci pour ta judicieuse remarque, mais puisqu'il n'est pas permis d'effacer des éléments de la table parente je ne vois pas très bien le problème.

    Et puisque les tables parentes de la vue sont distantes alors c'est soit le trigger ou la vue matérialisée.

    Mais peut-on vraiment faire une clé étrangère sur une vue matérialisée ? J'y avais pensé mais lorsque j'avais essayé avec SQL Developper je ne voyais pas la vue (table) dans la liste des tables pour faire la référence même si la vue apparaît comme table !

  9. #9
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Oui, si la table parente ne subit pas de delete ou d'update de la clé, alors un trigger peut gérer ça.
    Mais peut-on vraiment faire une clé étrangère sur une vue matérialisée ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    alter materialized view m add primary key(n);
    alter table t add foreign key (n) references m;
    Mais bien sur, là c'est une recopie de la table en local. Ce n'est peut être pas ce que tu veux.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. modéliser une table mapping ayant des clés étrangères sur des vues
    Par touftouf57 dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 19/06/2010, 02h04
  2. [2008] Clé étrangère sur une vue ?
    Par TeK55 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 22/07/2009, 14h17
  3. Clé étrangère sur une Vue
    Par escafr dans le forum SQL
    Réponses: 6
    Dernier message: 12/06/2008, 08h16
  4. Temps d'execution d'un select sur une vue
    Par rosewood dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 21/02/2005, 16h06
  5. delete sur une vue: rule
    Par Bouboubou dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 18/05/2004, 18h58

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