我如何才能一般地检测数据库是否从Java中"清空"

时间:2020-03-06 14:34:46  来源:igfitidea点击:

谁能建议一种检测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中)。

解决方案

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

我们可能还需要担心静态数据可能添加到查找表中,从粗略地看一眼看上去就像"数据",但实际上可能并不是真正意义上的"数据"。

我们能否提供有关我们要解决的特定问题的更多信息?我想知道是否可以通过提供更多数据来提供更简单,更可靠的答案。

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

当然,有一个元数据过程可以遍历表,只是可能存在一些自定义的事物。

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

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

对这些功能的支持因供应商而异,"表"视图的列内容也不同。可在此处找到Information Schema文档的SQL实现:

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

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

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

上面的查询返回数据库中User表的数量。有关sysobjects表的更多信息,请参见:

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

我不知道这是否是一个完整的解决方案...但是我们可以通过读取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中,我们可以从USER_TABLES中进行选择以排除任何系统表。