Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Java中常规检测数据库是否为“空”_Java_Sql Server_Database_Oracle_Derby - Fatal编程技术网

如何从Java中常规检测数据库是否为“空”

如何从Java中常规检测数据库是否为“空”,java,sql-server,database,oracle,derby,Java,Sql Server,Database,Oracle,Derby,有人能提出一种检测Java数据库是否为空的好方法吗?至少需要支持Microsoft SQL Server、Derby和Oracle 我所说的empty是指,在这种状态下,如果数据库是使用新的createdatabase语句新创建的,那么这种检查就不必是100%完美的,如果它覆盖了99%的情况 我的第一个想法是这样做 tables = metadata.getTables(null, null, null, null); Boolean isEmpty = !tables.next(); retu

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

我所说的empty是指,在这种状态下,如果数据库是使用新的createdatabase语句新创建的,那么这种检查就不必是100%完美的,如果它覆盖了99%的情况

我的第一个想法是这样做

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

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

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

您可能还需要关注静态数据,这些静态数据可能添加到一个查找表中,从粗略的角度看,这些数据看起来像“数据”,但实际上可能并不是术语意义上的“数据”

你能提供更多关于你试图解决的具体问题的信息吗?我想知道如果有更多的数据,是否可以提供一个更简单、更可靠的答案

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


当然,有一个元数据过程可以在表中循环,只是通过一些更自定义的内容。

有一些跨数据库SQL-92模式查询标准-当然,这方面的里程数根据供应商而异

SELECT COUNT(*) FROM [INFORMATION_SCHEMA].[TABLES] WHERE [TABLE_TYPE] = <tabletype>
上面的查询返回数据库中用户表的计数。有关sysobjects表的更多信息,请参见此处:


我不知道这是否是一个完整的解决方案。。。但您可以通过读取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;

实际上。。。我认为您可能需要非常努力才能获得真正可靠、真正通用的解决方案。

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

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

例如,对于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')
我得到的最好的通用和直观的解决方案是使用AntSQL任务——我所需要做的就是为每种类型的数据库传递不同的参数

i、 e.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> 
有关更多详细信息,请参阅蚂蚁:


基本上,我希望在开始对数据库运行安装过程之前确保数据库是空的,以防止用户意外地将目标锁定到已经错误地包含其他数据的数据库。一个更简单的解决方案可能是可行的,但如果没有好的通用解决方案,我可以自己构建。
<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>