如何从Java中常规检测数据库是否为“空”
有人能提出一种检测Java数据库是否为空的好方法吗?至少需要支持Microsoft SQL Server、Derby和Oracle 我所说的empty是指,在这种状态下,如果数据库是使用新的createdatabase语句新创建的,那么这种检查就不必是100%完美的,如果它覆盖了99%的情况 我的第一个想法是这样做如何从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
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>