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 Firebird Discussion :

Extraire table et colonne de référence d'une FK


Sujet :

SQL Firebird

  1. #1
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 276
    Points : 83
    Points
    83
    Par défaut Extraire table et colonne de référence d'une FK
    Salut tout le monde,
    j'ai un programme depuis laquelle je dois insérer des nouvelles informations. C'est pour ça je dois supprimer les clés étrangères puis les créer de nouveau.
    C'est pour ça j'ai mis en place une fonction pour stocker les commandes de créations des clé étrangères dans une table pour les utiliser ultérieurement.
    je me suis référé à ce lien http://www.alberton.info/firebird_sql_meta_info.html
    mais je n'ai pas eu satisfaction.
    C'est pour cela j'ai essayé de découper mon raisonnement en sous requêtes :
    Je suis parvenu à avoir la liste des FK avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT  distinct rc.RDB$CONSTRAINT_NAME AS fk_name,
              refc.RDB$DELETE_RULE AS on_del,
              refc.RDB$UPDATE_RULE AS on_upd
         FROM RDB$RELATION_CONSTRAINTS rc
    LEFT JOIN RDB$REF_CONSTRAINTS refc ON rc.RDB$CONSTRAINT_NAME = refc.RDB$CONSTRAINT_NAME
    WHERE rc.RDB$CONSTRAINT_TYPE = 'FOREIGN KEY'
    AND rc.RDB$RELATION_NAME = 'PRE_PRESENTATION'
    et puis la liste des colonnes surlesquels s'applique cette FK avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select RDB$FIELD_NAME from RDB$INDEX_SEGMENTS where RDB$INDEX_NAME = 'FK1_PRE_PRESENTATION' order by RDB$FIELD_POSITION
    Mais je n'ai pas pu dégager la liste des tables et colonnes de référence. J'ai utilisé cette requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT distinct d2.RDB$DEPENDED_ON_NAME AS ref_tab, d1.RDB$FIELD_NAME
         FROM RDB$RELATION_CONSTRAINTS rc
    inner JOIN RDB$INDEX_SEGMENTS seg ON seg.RDB$INDEX_NAME = rc.RDB$CONSTRAINT_NAME
    inner JOIN RDB$DEPENDENCIES d1 ON d1.RDB$DEPENDED_ON_NAME = rc.RDB$RELATION_NAME
    inner JOIN RDB$DEPENDENCIES d2 ON d1.RDB$DEPENDENT_NAME = d2.RDB$DEPENDENT_NAME
    WHERE rc.RDB$CONSTRAINT_TYPE = 'FOREIGN KEY'
    and d1.RDB$FIELD_NAME = seg.RDB$FIELD_NAME
    AND d1.RDB$DEPENDED_ON_NAME <> d2.RDB$DEPENDED_ON_NAME
    AND d1.RDB$FIELD_NAME <> d2.RDB$FIELD_NAME
    AND rc.RDB$RELATION_NAME = 'PRE_PRESENTATION'
    and seg.RDB$INDEX_NAME   = 'FK1_PRE_PRESENTATION'
    and d1.RDB$FIELD_NAME    = 'PRE_SP_CODE_FK'
    mais il m'affiche toutes les dépendances de ma table source.
    Est ce que quelqu'un pourrait me corriger pour avoir les bons résultats.
    Merci d'avance pour votre collaboration.
    Cordialement

  2. #2
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 276
    Points : 83
    Points
    83
    Par défaut
    Après des recherches et test, j'ai parvenu a trouver la solution dont j'espère qu'elle sera utile pour qqun d'autre.
    1. Pour trouver la table de référence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT rc.RDB$RELATION_NAME AS PARENT 
    FROM RDB$RELATION_CONSTRAINTS a 
      JOIN RDB$INDICES b ON (b.RDB$INDEX_NAME=a.RDB$INDEX_NAME) 
      JOIN RDB$RELATION_CONSTRAINTS rc ON (rc.rdb$index_name=b.rdb$foreign_key) 
    WHERE a.RDB$CONSTRAINT_TYPE='FOREIGN KEY' 
    AND a.RDB$RELATION_NAME = 'NOM_TABLE' 
    and a.RDB$INDEX_NAME
    2. Pour trouver la/les colonnes de référence :
    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
    SELECT distinct d1.RDB$FIELD_NAME AS ref_field
    FROM RDB$RELATION_CONSTRAINTS rc
       inner JOIN RDB$INDICES b ON (b.RDB$INDEX_NAME = rc.RDB$INDEX_NAME)
       inner JOIN RDB$RELATION_CONSTRAINTS a ON (a.rdb$index_name = b.rdb$foreign_key) 
       inner JOIN RDB$DEPENDENCIES d1 ON d1.RDB$DEPENDED_ON_NAME = a.RDB$RELATION_NAME and d1.RDB$DEPENDENT_TYPE = 2
       inner JOIN RDB$DEPENDENCIES d2 ON d2.RDB$DEPENDED_ON_NAME = rc.RDB$RELATION_NAME 
                                                    AND d1.RDB$DEPENDENT_NAME = d2.RDB$DEPENDENT_NAME
                                                    and d2.RDB$DEPENDENT_TYPE = 2 
        join RDB$RELATION_FIELDS f on f.RDB$RELATION_NAME = a.RDB$RELATION_NAME
                                             and f.RDB$FIELD_NAME = d1.RDB$FIELD_NAME												WHERE rc.RDB$CONSTRAINT_TYPE = 'FOREIGN KEY' 
    AND rc.RDB$RELATION_NAME = 'NOM_TABLE_SOURCE'
    AND rc.RDB$CONSTRAINT_NAME = 'NOM_CONTRAINTE' 
    AND a.RDB$RELATION_NAME = 'NOM_TABLE_DEST' 
    and d1.RDB$FIELD_NAME is not null 
    and d2.RDB$FIELD_NAME is not null 
    order by f.RDB$FIELD_POSITION
    Cette dernière requête peut être remplacée par la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT distinct i.RDB$FIELD_NAME 
    FROM RDB$RELATION_CONSTRAINTS rc 
       left JOIN RDB$INDICES b ON (b.RDB$INDEX_NAME = rc.RDB$INDEX_NAME) 
       left JOIN RDB$RELATION_CONSTRAINTS a ON (a.rdb$index_name = b.rdb$foreign_key) 
       left join RDB$INDICES t on t.RDB$RELATION_NAME = a.RDB$RELATION_NAME 
                                      and t.RDB$INDEX_NAME = a.RDB$INDEX_NAME 
       left join RDB$INDEX_SEGMENTS i on i.RDB$INDEX_NAME = t.RDB$INDEX_NAME 
    WHERE rc.RDB$CONSTRAINT_TYPE = 'FOREIGN KEY'  
    and a.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY' 
    AND rc.RDB$RELATION_NAME = 'NOM_TABLE_SOURCE' 
    AND rc.RDB$CONSTRAINT_NAME = 'NOM_CONTRAINTE' 
    AND a.RDB$RELATION_NAME = 'NOM_TABLE_DEST'
    order by i.RDB$FIELD_POSITION
    Bon travail a tous .

Discussions similaires

  1. Colonne de référence dans une relation ManyToMany
    Par Rony Rauzduel dans le forum Doctrine2
    Réponses: 1
    Dernier message: 10/07/2013, 10h41
  2. Réponses: 5
    Dernier message: 17/02/2011, 16h56
  3. une colonne peut-elle être une référence à une table?
    Par professeur shadoko dans le forum Langage SQL
    Réponses: 17
    Dernier message: 24/06/2010, 15h25
  4. [Vb.Net]Datagrid, afficher colonne id liée d'une autre table
    Par SamRay1024 dans le forum Windows Forms
    Réponses: 12
    Dernier message: 05/04/2006, 14h45
  5. Données d'une table deviennent colonne dans autre table?
    Par christophe1245 dans le forum Access
    Réponses: 8
    Dernier message: 19/12/2005, 22h01

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