2008-09-23 11 views
1

Quelqu'un peut-il suggérer un bon moyen de détecter si une base de données est vide de Java (doit au moins supporter Microsoft SQL Server, Derby et Oracle)?Comment détecter de manière générique si une base de données est "vide" de Java

Par vide, je veux dire dans l'état ce serait si la base de données était fraîchement créée avec une nouvelle instruction create database, bien que la vérification ne soit pas parfaite à 100% si elle couvre 99% des cas.

Ma première pensée était de faire quelque chose comme ça ...

tables = metadata.getTables(null, null, null, null); 
Boolean isEmpty = !tables.next(); 
return isEmpty; 

... mais malheureusement, qui me donne un tas de tables système sous-jacent (au moins dans Microsoft SQL Server).

Répondre

0

Vérifiez-vous toujours les bases de données créées de la même manière? Si c'est le cas, vous pouvez simplement sélectionner parmi un sous-ensemble de tables que vous connaissez pour rechercher des données. Vous pourriez aussi avoir besoin de vous préoccuper des données statiques peut-être ajoutées à une table de recherche qui ressemble à des données à partir d'un coup d'œil rapide, mais qui pourraient en fait ne pas être des données dans un sens intéressant du terme. Pouvez-vous fournir plus d'informations sur le problème spécifique auquel vous tentez de vous attaquer? Je me demande si avec plus de données une réponse plus simple et plus fiable pourrait être fournie.

Créez-vous ces bases de données?
Les créez-vous avec à peu près le même constructeur à chaque fois? Quel genre de processus laisse ces types traîner, et ce constructeur peut-il détruire?

Il y a certainement un processus de métadonnées pour faire une boucle dans les tables, juste à travers quelque chose de plus personnalisé.

+0

Fondamentalement, je veux être sûr une base de données est vide avant Je commence à exécuter un processus d'installation dessus (pour protéger les utilisateurs de cibler accidentellement une base de données qui contient déjà d'autres données par erreur). Une solution plus simple pourrait être possible, mais je peux le faire moi-même s'il n'y a pas de solution générique. –

2

Il existe des normes de requête de schéma SQL-92 bases de données croisées - un certain kilométrage pour cela bien sûr varie selon le vendeur

SELECT COUNT(*) FROM [INFORMATION_SCHEMA].[TABLES] WHERE [TABLE_TYPE] = <tabletype> 

Le soutien à ces Varie par le vendeur, tout comme le contenu des colonnes pour les tableaux vue. L'implémentation SQL des informations de schéma docs trouvés ici:

http://msdn.microsoft.com/en-us/library/aa933204(SQL.80).aspx

Plus précisément dans SQL Server, SYSOBJECTS métadonnées est antérieure à l'initiative des normes SQL92.

SELECT COUNT(*) FROM [sysobjects] WHERE [type] = 'U' 

La requête ci-dessus renvoie le nombre de tables utilisateur dans la base de données. Plus d'informations sur la table sysobjects ici:

http://msdn.microsoft.com/en-us/library/aa260447(SQL.80).aspx

1

Je ne sais pas si cela est une solution complète ... mais vous pouvez déterminer si une table est une table système en lisant le table_type colonne du ResultSet retourné par getTables:

int nonSystemTableCount = 0; 
tables = metadata.getTables(null, null, null, null); 
while(tables.next()) { 
    if(!"SYSTEM TABLE".equals(tables.getString("table_type"))) { 
     nonSystemTableCount++; 
    } 
} 
boolean isEmpty = nonSystemTableCount == 0; 
return isEmpty; 

en pratique ... Je pense que vous pourriez avoir à travailler assez dur pour obtenir une solution vraiment fiable, vraiment générique.

0

Dans Oracle, vous pouvez au moins sélectionner USER_TABLES pour exclure les tables système.

0

Je n'ai pas trouvé de solution générique standard, donc chaque base de données a besoin de son propre ensemble de tests.

Pour Oracle, par exemple, je l'habitude de vérifier les tables, les séquences et les index:

select count(*) from user_tables 
select count(*) from user_sequences 
select count(*) from user_indexes 

Pour SqlServer je pour vérifier les tables, vues et procédures stockées:

SELECT * FROM sys.all_objects where type_desc in ('USER_TABLE', 'SQL_STORED_PROCEDURE', 'VIEW') 

Le meilleur La solution générique (et intuitive) que j'ai obtenue est en utilisant la tâche ANT SQL - tout ce que je devais faire est de passer différents paramètres pour chaque type de base de données.

à savoir Le fichier de compilation ANT ressemble à ceci:

<project name="run_sql_query" basedir="." default="main"> 
    <!-- run_sql_query: --> 
    <target name="run_sql_query"> 
     <echo message="=== running sql query from file ${database.src.file}; check the result in ${database.out.file} ==="/> 
     <sql classpath="${jdbc.jar.file}" 
      driver="${database.driver.class}" 
      url="${database.url}" 
      userid="${database.user}" 
      password="${database.password}" 
      src="${database.src.file}" 
      output="${database.out.file}" 
      print="yes"/> 
    </target> 

    <!-- Main: --> 
    <target name="main" depends="run_sql_query"/> 
</project> 

Pour plus de détails, s'il vous plaît se référer à ANT:

https://ant.apache.org/manual/Tasks/sql.html

Questions connexes