如何从Java中一般性地检测数据库是否为“空”

时间:2008-09-23 03:53:27

标签: java sql-server database oracle derby

有人能建议一种检测Java数据库是否为空的好方法(需要至少支持Microsoft SQL Server,Derby和Oracle)吗?

对于空,我的意思是在状态下,如果数据库是使用新的create database语句新创建的,尽管如果覆盖99%的情况,检查不需要100%完美。

我的第一个想法是做这样的事情......

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

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

5 个答案:

答案 0 :(得分:2)

有一些跨数据库的SQL-92架构查询标准 - 这里的里程当然因供应商而异

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

对这些的支持因供应商而异,Table视图的列内容也不同。在此处找到的信息架构文档的SQL实现:

  

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

更具体地说,在SQL Server中,sysobjects元数据早于SQL92标准计划。

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

上面的查询返回数据库中用户表的计数。有关sysobjects表的更多信息,请访问:

  

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

答案 1 :(得分:1)

我不知道这是否是一个完整的解决方案......但您可以通过读取getTables返回的ResultSet的table_type列来确定表是否是系统表:

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;

在实践中......我认为你可能必须努力工作以获得真正可靠,真正通用的解决方案。

答案 2 :(得分:0)

您是否始终检查以相同方式创建的数据库?如果是这样,您可以简单地从您熟悉的表的子集中进行选择以查找数据。

您可能还需要关注静态数据,这些静态数据可能会从粗略的一瞥中添加到看起来像“数据”的查找表中,但事实上可能并不是真正的“数据”,而是一个有趣的术语。

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

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

肯定有一个元数据流程可以循环遍历表,只需通过一些可能存在更多自定义的东西。

答案 3 :(得分:0)

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

答案 4 :(得分: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