1

データ移行を実行していますが、使用しているデータベースでは、各テーブルを個別にエクスポートおよびインポートすることしかできません。このようなセットアップでは、テーブルがインポートされる順序が重要であるため、インポートが問題になります (テーブルを参照する前に参照テーブルをインポートする必要があります)。

依存度が最も低いものから最も依存性が高いものへと並べ替えられたデータベース テーブルを一覧表示できる外部ツールはありますか?

前もって感謝します。

4

1 に答える 1

2

このコードは、この問題を解決するのに役立ちました。DB メタデータから読み取った FK リレーションに従って、依存度の低いテーブルから依存度の高いテーブルへとテーブルを並べ替えます。

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>();
        }
    }
}
于 2010-05-31T15:26:12.277 に答える