2008-09-23 62 views
1

任何人都可以提出一個很好的方法來檢測數據庫是否從Java爲空(需要至少支持Microsoft SQL Server,Derby和Oracle)?我怎樣才能一般性地檢測數據庫是否從Java'空'

通過空我的意思是如果數據庫是新創建一個新的創建數據庫語句,但是如果覆蓋99%的案例,檢查不需要100%完美。

我首先想到的是做這樣的事情......

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

...但不幸的是這給了我一堆基礎系統表(至少在Microsoft SQL Server)。

回答

0

您是否總是檢查以相同方式創建的數據庫?如果是這樣,您可能只需從您熟悉的表的一個子集中進行選擇即可查找數據。

您也可能需要關注一下靜態數據,這些靜態數據可能被添加到一個看起來像'數據'的查找表中,但實際上可能並非真正成爲'數據'。

您能否提供有關您嘗試解決的特定問題的更多信息?我想知道更多的數據是否可以提供更簡單,更可靠的答案。

你正在創建這些數據庫嗎?
你每次創建它們的構造函數大致相同嗎? 什麼樣的過程會讓這些傢伙徘徊,那構造函數是否會破壞?

肯定有一個元數據過程循環表,只是通過一些更多的自定義可能存在。

+0

基本上,我想,以確保數據庫之前空我開始在其上運行一個安裝過程(以防止用戶意外針對已經包含其他數據的數據庫)。 更簡單的解決方案可能是可能的,但如果沒有好的通用解決方案,我可以自己構建。 – 2008-09-23 04:16:51

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中,系統對象元數據早於SQL92標準的主動權。

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

上面的查詢返回數據庫中用戶表的數量。有關sysobjects表點擊此處瞭解詳情:

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

1

我不知道這是一個完整的解決方案...但你可以確定某個表是系統表通過閱讀TABLE_TYPE通過的getTables返回的結果集的列:

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; 

在實踐中...我想你可能會工作得很難找到一個真正可靠,真正通用的解決方案。

0

在Oracle中,至少可以從USER_TABLES中選擇排除任何系統表。

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