2008-09-23 57 views
1

任何人都可以提出一个很好的方法来检测数据库是否从Java为空(需要至少支持Microsoft SQL Server,Derby和Oracle)?我怎样才能一般性地检测数据库是否从Java'空'

通过空我的意思是如果数据库是新创建一个新的创建数据库语句,但是如果覆盖99%的案例,检查不需要100%完美。

我首先想到的是做这样的事情......

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

...但不幸的是这给了我一堆基础系统表(至少在Microsoft SQL Server)。

回答

0

您是否总是检查以相同方式创建的数据库?如果是这样,您可能只需从您熟悉的表的一个子集中进行选择即可查找数据。

您也可能需要关注一下静态数据,这些静态数据可能被添加到一个看起来像'数据'的查找表中,但实际上可能并非真正成为'数据'。

您能否提供有关您尝试解决的特定问题的更多信息?我想知道更多的数据是否可以提供更简单,更可靠的答案。

你正在创建这些数据库吗?
你每次创建它们的构造函数大致相同吗? 什么样的过程会让这些家伙徘徊,那构造函数是否会破坏?

肯定有一个元数据过程循环表,只是通过一些更多的自定义可能存在。

+0

基本上,我想,以确保数据库之前空我开始在其上运行一个安装过程(以防止用户意外针对已经包含其他数据的数据库)。 更简单的解决方案可能是可能的,但如果没有好的通用解决方案,我可以自己构建。 – 2008-09-23 04:16:51

2

有一些跨数据库SQL-92架构查询标准 - 这门课程的里程有所不同,根据厂商

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

支持这些改变由供应商一样,列在表中的内容视图。 SQL执行这里找到信息架构文档的:

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

更具体地说在SQL Server中,系统对象元数据早于SQL92标准的主动权。

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

上面的查询返回数据库中用户表的数量。有关sysobjects表点击此处了解详情:

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

1

我不知道这是一个完整的解决方案...但你可以确定某个表是系统表通过阅读TABLE_TYPE通过的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; 

在实践中...我想你可能会工作得很难找到一个真正可靠,真正通用的解决方案。

0

在Oracle中,至少可以从USER_TABLES中选择排除任何系统表。

0

我找不到标准的通用解决方案,所以每个数据库都需要自己的测试集。

对于Oracle比如,我用来检查表,序列和索引:

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

对于SqlServer的我用来检查表,视图和存储过程:

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

最好我得到的通用(直观)解决方案是使用ANT SQL任务 - 我需要做的就是为每种类型的数据库传递不同的参数。

即Ant构建文件看起来是这样的:

<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> 

欲了解更多详情,请参阅ANT:

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