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 :

[Héritage] Bug à la suite d'un ALTER ?


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 059
    Par défaut [Héritage] Bug à la suite d'un ALTER ?
    Bonjour,

    Je suis en Postgresql 8.3.3 sur Windows XP.
    J'ai 2 schéma, avec dans le second une table héritée du premier schéma.
    Voici les scripts de création :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create schema test1;
    create schema test2;
     
    create table test1.point (code char(16), test1 char(2), test2 char(3));
    create table test2.point (code2 char(16)) INHERITS (test1.point);
    Je dois réaliser un script qui supprime la colonne test2.
    Or, pour des raisons de maintenant, j'ai du faire "sauter" temporairement l'héritage de ma table point dans le schéma test2, comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    alter table test2.point no inherit test1.point;
    alter table test2.point inherit test1.point;
    Du coup, maintenant, alors que l'héritage a bien été rétabli, la suppression d'une colonne dans la table mère ne se propage plus dans la table fille .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alter table test1.point drop column test2 cascade;
    La colonne test2 n'est plus dans test1.point, mais elle est toujours dans test2.point.
    Pourtant, d'après la doc Postgresql, elle aurait aussi dû être supprimée... Et c'est bien ce qui se passe si je ne supprime pas temporairement l'héritage par la commande ALTER.

    Est-ce que c'est un bug ?

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  2. #2
    Inactif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 245
    Par défaut
    Bonjour
    Du coup, maintenant, alors que l'héritage a bien été rétabli, la suppression d'une colonne dans la table mère ne se propage plus dans la table fille

    Dans la documentation c'est très peu détaillé sur ce qui se passe réellement.
    Je pense qu'il est interressant de décrire l'interaction sur un exemple pour
    clarifier la chose avec ce sujet.
    Exemple:
    j'ai une table gr_ident qui comporte plusieurs milions d'enregistrements
    Je crée un table fille inherit sub_gr_ident pour restreinde la charge.
    La table fille sub_gr_ident reçoit 50 nouveaux enregistrements
    La table mère gr_ident a donc maintenent également les 50 enregistrements
    Je decide d'enlever la relation fille sub_gr_ident de la table gr_ident
    alter table sub_gr_ident NO INHERIT gr_ident;
    Là la table fille sub_gr_ident reste indentique les champs inherit deviennent
    des champs a part entière.

    La table gr_ident perd les 50 enregistrement saisies via son ex fille.
    J'execute une rétro instruction pour voir ce qui se passe.
    alter table sub_gr_ident INHERIT gr_ident;
    et là je retrouve les 50 enregitrements de ma table fille sub_gr_ident dans ma table mère gr_ident.
    Je nai pas testé votre manipe mais sauf erreur de ma part je pense qu' il faut supprimer le champs de la fille avant de reintergrer la mère ?? ce qui semble normal.
    Cordialement

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 059
    Par défaut
    Merci pour ces propositions et pour l'intérêt que vous portez à mon problème.

    Effectivement, j'ai oublié de préciser où se situaient les données.
    Dans mon cas, les données sont au niveau de la table fille.
    Toutefois, en exécutant le code que j'ai donné en exemple, sans mettre aucune donnée dans les tables, on reproduit le "bug". Ce n'est donc visiblement pas lié à la localisation des données .

    Voilà ce que dit la documentation sur ce sujet :
    L'héritage de table est typiquement établi lors de la création de la table enfant en utilisant la clause INHERITS de l'instruction CREATE TABLE. Alternativement, il est possible d'ajouter à une table déjà définie de façon compatible une nouvelle relation de parenté à l'aide de la clause INHERIT de ALTER TABLE. Pour cela, la nouvelle table enfant doit déjà inclure des colonnes de mêmes nom et type que les colonnes de la table parent. Elle doit aussi contenir des contraintes de vérification de mêmes nom et expression que celles de la table parent.
    De la même façon, un lien d'héritage peut être supprimé d'un enfant à l'aide de la variante NO INHERIT d'ALTER TABLE.
    Ce qui est le cas dans mon exemple...
    Et aussi, un peu plus loin :
    ALTER TABLE propage toute modification dans les définitions des colonnes et contraintes de vérification à travers la hiérarchie d'héritage.
    J'ai essayé avec le mot-clef CASCADE, mais ça ne marche pas mieux...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 059
    Par défaut
    Un petit complément d'information : une fois l'héritage remis (après le second ALTER), je contrôle via le catalogue si les colonnes de la table fille sont bien marquées comme "héritées" (donnée attinhcount dans pg_attribute). Elles sont bien à 1, ce qui indique qu'il y a, théoriquement, héritage.

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  5. #5
    Inactif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 245
    Par défaut
    ALTER TABLE propage toute modification dans les définitions des colonnes et contraintes de vérification à travers la hiérarchie d'héritage.
    A mon avis ils ont oubliés d'ajouter(sur les champs similaires préxistants ou complementaires)(une action partielle et non globale).
    Je vais faire des tests plus poussés pour mieux comprendre cette dynamique
    Par exemple changer le type de champ de la fille en conservant le meme libellé commun aux deux table entre l'action et la rétro action.
    Je pense que comme ça je vais réussir à le planter....
    je vais moduler plusieurs INHERIT & NO INHERIT a partir de plusieurs mères pour voir si on peut envisager controler une table au contenu dynamique sur critère contextuel.
    Cela semble trop simple pour être vraie ....
    Cordialement

  6. #6
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 059
    Par défaut
    De 2 choses l'une : soit c'est un oubli de la documentation, soit c'est un bug de programmation... Non ?

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

Discussions similaires

  1. [AJAX] Bug IE : ma div draggable ne suit pas mon scroll horizontal
    Par kazai dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 25/06/2008, 09h59
  2. Bug demarrage (écran bleu) suite au SP1
    Par Bouki dans le forum Windows Vista
    Réponses: 0
    Dernier message: 24/03/2008, 10h24
  3. Réponses: 7
    Dernier message: 17/08/2007, 09h41
  4. Erreur interne ora-01041 suite à un Alter System
    Par matana dans le forum Oracle
    Réponses: 19
    Dernier message: 10/11/2005, 15h34
  5. Suite : alter sequence
    Par marti dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/08/2005, 06h43

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