2008-09-23 1 views
1

Может ли кто-нибудь предложить хороший способ обнаружения, если база данных пуста из Java (требуется поддержка, по крайней мере, Microsoft SQL Server, Derby и Oracle)?Как я могу определить, является ли база данных «пустой» из Java

Пустым я имею в виду, что если бы база данных была свежеприготовлена ​​с помощью нового оператора создания базы данных, хотя проверка не должна быть на 100% идеальной, если охватывает 99% случаев.

Моя первая мысль была сделать что-то вроде этого ...

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 из данных Schema документы находятся здесь:

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

Я не знаю, является ли это полным решением ... но вы можете определить, является ли это таблица системы, прочитав TABLE_TYPE колонка ResultSet возвращенного 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 - все, что мне нужно сделать, это передавать разные параметры для каждого типа базы данных.

т.е. муравей построения файла выглядит следующим образом:

<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

Смежные вопросы