2010-05-28 3 views
1

J'effectue une migration de données et la base de données que j'utilise permet uniquement d'exporter et d'importer chaque table séparément. Dans une telle configuration, l'importation devient un problème car l'ordre dans lequel les tables sont importées est important (vous devez importer les tables référencées avant de les référencer).Tri des tables de base de données les moins dépendantes à les plus dépendantes

Existe-t-il un outil externe qui me permet de lister les tables de base de données triées du moins dépendant au plus dépendant?

Merci d'avance.

+0

Quel SGBD utilisez-vous? –

+0

J'utilise TimesTen. On dirait qu'il n'y a pas d'outil de ce genre inclus, donc je cherche un logiciel tiers. –

Répondre

2

Ce code m'a aidé à résoudre ce problème. Il trie les tables de la plus dépendante à la plus dépendante en fonction de leurs relations FK lues à partir des métadonnées DB.

public class Main { 
    public static void main(String[] args) throws SQLException { 
     DriverManager.registerDriver(new TimesTenDriver()); 
     Connection c = ...; 
     DatabaseMetaData md = c.getMetaData(); 

     final ResultSet rawTables = md.getTables(null, "<your schema>", "%", null); 

     List<Table> tables = new ArrayList<Table>(); 

     while (rawTables.next()) { 
      final String tableName = rawTables.getString("TABLE_NAME"); 
      Table table = new Table(tableName); 

      ResultSet rawKeys = md.getImportedKeys(null, "<your schema>", tableName); 

      while (rawKeys.next()) { 
       table.refs.add(rawKeys.getString("PKTABLE_NAME")); 
      } 

      rawKeys.close(); 

      tables.add(table); 
     } 

     rawTables.close(); 
     c.close(); 

     LinkedList<List<Table>> layers = new LinkedList<List<Table>>(); 

     while (tables.size() > 0) { 
      List<Table> indep = new ArrayList<Table>(); 
      for (Table o : tables) { 
       indep.add(o); 
       for (Table i : tables) { 
        if (i.refs.contains(o.name)) { 
         indep.remove(o); 
         break; 
        } 
       } 
      } 

      layers.add(indep); 

      for (Iterator<Table> it = tables.iterator(); it.hasNext();) { 
       Table t = it.next(); 
       if (indep.contains(t)) { 
        it.remove(); 
       } 
      } 
     } 

     for (ListIterator<List<Table>> it = layers.listIterator(layers.size()); it.hasPrevious();) { 
      final List<Table> layer = it.previous(); 

      for (Table table : layer) { 
       System.out.println("ttbulkcp -i <your DSN> <your schema>." + table + " " + table); 
      } 
     } 
    } 

    private static class Table { 
     public final String name; 
     public final Set<String> refs; 

     public Table(String name) { 
      this.name = name; 
      this.refs = new HashSet<String>(); 
     } 
    } 
} 
Questions connexes