有人能建议一种检测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中)。
答案 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: