Как я могу вообще определить, является ли база данных «пустой» от Java - PullRequest
1 голос
/ 23 сентября 2008

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

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

Моей первой мыслью было сделать что-то подобное ...

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

... но, к сожалению, это дает мне кучу базовых системных таблиц (по крайней мере, в Microsoft SQL Server).

Ответы [ 5 ]

2 голосов
/ 23 сентября 2008

Существует несколько стандартов запросов схемы 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 метаданные sysobjects предшествуют инициативе стандартов SQL92.

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

Запрос выше возвращает количество пользовательских таблиц в базе данных. Больше информации о таблице sysobjects здесь:

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

1 голос
/ 23 сентября 2008

Я не знаю, является ли это полным решением ... но вы можете определить, является ли таблица системной таблицей, прочитав столбец 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 голосов
/ 18 июня 2017

Мне не удалось найти стандартное универсальное решение, поэтому для каждой базы данных необходим собственный набор тестов.

Например, для 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

0 голосов
/ 23 сентября 2008

По крайней мере, в Oracle вы можете выбрать из USER_TABLES, чтобы исключить любые системные таблицы.

0 голосов
/ 23 сентября 2008

Вы всегда проверяете базы данных, созданные одинаково? Если это так, вы можете просто выбрать из подмножества таблиц, с которыми вы знакомы, для поиска данных.

Вам также может потребоваться забота о статических данных, возможно, добавленных в справочную таблицу, которая выглядит как «данные» из беглого взгляда, но на самом деле может не быть «данными» в интересном смысле этого термина.

Можете ли вы предоставить больше информации о конкретной проблеме, которую вы пытаетесь решить? Интересно, можно ли получить больше данных для более простого и надежного ответа.

Вы создаете эти базы данных?
Вы создаете их с примерно одинаковым конструктором каждый раз? Какого рода процесс заставляет этих парней болтаться, и может ли этот конструктор разрушить?

Несомненно, существует процесс метаданных для циклического перемещения по таблицам, просто существует нечто более нестандартное.

...