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

Administration Firebird Discussion :

Désactivation/Réactivation PrimaryKey & ForeignKey


Sujet :

Administration Firebird

  1. #1
    Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    juillet 2010
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : juillet 2010
    Messages : 86
    Points : 56
    Points
    56
    Par défaut Désactivation/Réactivation PrimaryKey & ForeignKey
    Bonjour
    Je possède une base de données FireBird 2.5 ( ~90 Go - 766 tables - 1329 procédures - 573 triggers - 80 vues) sur Windows Server.

    Suite à une demande de modification du service comptable je dois modifié la valeur d'un champ (COD_SITE) d'une table SITE et passer de NT à NA
    Or ce champ est utilisé a de multiples endroits dans la base de données comme clé étrangères d'autres tables

    Voici donc mon plan de bataille :
    • Désactiver tous les triggers
    • Déasctiver toutes les FOREIGN_KEY
    • Désasctiver toutes les PRIMARY KEY
    • Effectuer le changement dnas toutes les tables répertoriées
    • Réactiver toutes les PRIMARY KEY
    • Réactiver toutes les FOREIGN KEY


    Sur le papier aucun souci cela devrait fonctionner sauf qu'en pratique cela ne fonctionne pas
    Aucun moyen de désactiver les FOREIG_KEY et les PRIMARY_KEY

    D'ou mon message : si quelqu'un a une idée ou une piste

    j'ai bien trouvé la solution de supprimer toute sles PRIMARY_KEY et FOREIG_KEY mais solution non envisageable car trop compliqué et risque d'en oublier.

    Par avance meric pour votre aide

  2. #2
    Membre averti Avatar de licardentaistor
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    juillet 2021
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : juillet 2021
    Messages : 258
    Points : 359
    Points
    359
    Par défaut
    Si vos contraintes de clé étrangère ont été définies pour effectuer des mises à jour en cascade (ON UPDATE CASCADE), alors modifier la clé primaire dans la table parente devrait automatiquement mettre à jour toutes les clés étrangères dans les tables enfants.

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    14 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 14 627
    Points : 39 796
    Points
    39 796
    Billets dans le blog
    59
    Par défaut
    Citation Envoyé par mballasse Voir le message
    Sur le papier aucun souci cela devrait fonctionner sauf qu'en pratique cela ne fonctionne pas
    Aucun moyen de désactiver les FOREIGN_KEY et les PRIMARY_KEY
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER INDEX <indexname> {ACTIVE | INACTIVE}
    Maintenant tous les index ce n'est pas forcément nécessaire, seul ceux en rapport avec l'ID de la table SITE seraient nécessaires, une interrogation sur la table système RDB$INDICE permettrait de cibler les index concernés.

    pour info, pour obtenir les tables avec cette contrainte de FK
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    SELECT
        detail_index_segments.rdb$field_name field_name,
        detail_relation_constraints.rdb$INDEX_NAME index_name,
        master_relation_constraints.rdb$relation_name reference_table,
        master_index_segments.rdb$field_name fk_field
     
    FROM
        rdb$relation_constraints detail_relation_constraints
        JOIN rdb$index_segments detail_index_segments ON detail_relation_constraints.rdb$index_name = detail_index_segments.rdb$index_name 
        JOIN rdb$ref_constraints ON detail_relation_constraints.rdb$constraint_name = rdb$ref_constraints.rdb$constraint_name -- Master indx
        JOIN rdb$relation_constraints master_relation_constraints ON rdb$ref_constraints.rdb$const_name_uq = master_relation_constraints.rdb$constraint_name
        JOIN rdb$index_segments master_index_segments ON master_relation_constraints.rdb$index_name = master_index_segments.rdb$index_name 
     
    WHERE
        detail_relation_constraints.rdb$constraint_type = 'FOREIGN KEY'
    AND master_index_segments.rdb$field_name='COD_SITE' 
    AND master_relation_constraints.rdb$relation_name='SITE'
    bon, je n'en suis pas très fier, je n'ai pas utilisé d'alias de table très lisible

    Cela étant, il faut aussi (surtout et peut-être seulement ?) désactiver les triggers (table système RDB$TRIGGERS )
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) ,D11 (Alexandria)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    14 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 14 627
    Points : 39 796
    Points
    39 796
    Billets dans le blog
    59
    Par défaut
    À la réflexion, la nuit portant conseil, je tâcherai de créer un script (via l'étude des tables systèmes ?)

    1. Supprimer les contraintes de clés devrait suffire ALTER TABLE xxxx DROP CONSTRAINT xxxx
    2. un COMMIT pour être sûr.
    3. Ensuite modifier la valeur dans la table SITE (UPDATE SITE SET COD_SITE='NA' WHERE CODE_SITE='NT';)
    4. Enfin recréer les mêmes contraintes. (FlameRobin peut aider pour récupérer les DDL correspondant) , j'en profiterai pour renommer les contraintes en noms explicites (i.e FK_<nom table>_SITE) et ajouter les ON UPDATE CASCADE si possible



    Bien sûr, tout ceci dans une base de données sauvegardée (GBAK) au préalable
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) ,D11 (Alexandria)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  5. #5
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    mars 2003
    Messages
    3 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : mars 2003
    Messages : 3 860
    Points : 5 960
    Points
    5 960
    Par défaut
    Citation Envoyé par licardentaistor Voir le message
    Si vos contraintes ...
    Avec des "si"

    C'est pas souvent que ce cas de figure est imaginé à la conception
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  6. #6
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    mars 2003
    Messages
    3 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : mars 2003
    Messages : 3 860
    Points : 5 960
    Points
    5 960
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Enfin recréer les mêmes contraintes. (FlameRobin peut aider )
    Oui, il peut aider, attention cependant :
    • il ne les identifie pas toutes (mais je ne me souviens plus sur lesquelles[edit] il chute, qui sont p-ê sans rapport avec les FK)
    • il ne les restitue pas nécessairement dans le bon ordre


    [edit] p'têt bien sur les générateurs (sans garantie)
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    9 703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 9 703
    Points : 37 153
    Points
    37 153
    Billets dans le blog
    4
    Par défaut
    bonjour

    Citation Envoyé par mballasse Voir le message
    Suite à une demande de modification du service comptable je dois modifié la valeur d'un champ (COD_SITE) d'une table SITE et passer de NT à NA
    Or ce champ est utilisé a de multiples endroits dans la base de données comme clé étrangères d'autres tables
    Ce n'est pas pour rien que l'une des règles de d'or, lors du choix de l'identifiant d'un type d'entité (MCD) qui devient clef primaire dans la table correspondante (MLD et MPD) et se propage sous forme de clefs étrangères dans d'autres tables, c'est de prendre une colonne dont le contenu est stable.

    Une colonne de contenu stable n'est pas soumises à ce genre de contingences.
    C'est la raison pour laquelle il est fortement recommandé d'utiliser un colonne technique dont la valeur est attribuée par le SGBD.
    Ça n'empêche nullement de définir une contrainte UNIQUE sur la colonne COD_SITE, mais cette colonne ne devait pas être PRIMARY KEY, car son contenu est sémantique, donc instable !

    De plus les identifiants de type integer (cas des colonnes attribuées par le SGBD) sont plus concis, plus performants et insensibles à la collation, contrairement à un type char ou varchar, 3 bonnes raisons supplémentaires pour opter pour ce type d'identifiant

    Enfin, dans les tables d'un SGBD relationnel, il n'y a pas de "champs", il y a des "colonnes".

Discussions similaires

  1. Réponses: 5
    Dernier message: 04/08/2009, 23h18
  2. Réponses: 0
    Dernier message: 23/04/2009, 17h13
  3. Désactiver, réactiver Index
    Par Glutinus dans le forum Oracle
    Réponses: 7
    Dernier message: 26/12/2007, 23h28
  4. Désactiver/Réactiver les workflows
    Par stephane eyskens dans le forum SharePoint
    Réponses: 4
    Dernier message: 20/04/2007, 15h00
  5. [SQL/Contrainte] Comment désactiver-réactiver proprement ?
    Par SanTa62 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/01/2006, 09h57

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