1

任何人都可以提出一种从 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 中)。

4

5 回答 5

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 中,sysobjects 元数据早于 SQL92 标准倡议。

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

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

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

于 2008-09-23T04:08:04.210 回答
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;

在实践中......我认为您可能需要非常努力地获得一个真正可靠、真正通用的解决方案。

于 2008-09-23T04:12:04.963 回答
0

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

您可能还需要关注可能添加到查找表中的静态数据,这些数据粗略一瞥看起来像“数据”,但实际上可能不是真正意义上的“数据”。

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

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

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

于 2008-09-23T04:01:41.417 回答
0

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

于 2008-09-23T05:24:28.783 回答
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

于 2017-06-18T14:12:00.027 回答