2008-09-23 4 views
1

누구든지 데이터베이스가 Java에서 비어 있는지 확인하는 좋은 방법을 제안 할 수 있습니까? (Microsoft SQL Server, Derby 및 Oracle 이상을 지원해야합니까?)데이터베이스에서 Java가 '비어 있는지'를 일반적인 방법으로 감지 할 수 있습니까?

비어 있음으로써 데이터베이스가 새로 작성된 데이터베이스 명령문으로 새로 작성된 경우를 의미합니다. 검사가 99 %의 경우를 포함하면 100 % 완벽 할 필요는 없습니다.

내 첫번째 생각은 ...

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

을 같은 것을 할 것이었다 ...하지만 불행히도 그것은 나에게 (적어도 마이크로 소프트 SQL 서버의) 기본 시스템 테이블의 무리를 준다.

답변

0

같은 방식으로 생성 된 데이터베이스를 항상 확인하고 있습니까? 그렇다면 익숙한 테이블 하위 집합에서 데이터를 검색하기 위해 선택할 수 있습니다.

또한 정적 데이터가 대략적으로 '데이터'처럼 보이지만 용어의 흥미로운 의미에서 실제로 '데이터'가 아닐 수도있는 조회 테이블에 추가 될 필요가있을 수도 있습니다.

태클하려는 특정 문제에 대한 추가 정보를 제공 할 수 있습니까? 더 많은 데이터를 사용하면 더 간단하고 안정적인 대답을 얻을 수 있을지 궁금합니다.

이러한 데이터베이스를 만들고 있습니까?
매번 거의 동일한 생성자로 생성하고 있습니까? 어떤 종류의 프로세스가이 사람들을 매달아 놓고 그 생성자를 파괴 할 수 있습니까?

테이블을 순환하는 메타 데이터 프로세스가 있습니다. 조금 더 많은 사용자 지정이있을 수 있습니다.

+0

는 기본적으로, 데이터베이스 전에 비어 있는지되고 싶어요 설치 프로세스를 실행하기 시작합니다. 실수로 이미 다른 데이터가 들어있는 데이터베이스를 실수로 대상 지정하는 것을 방지합니다. 더 간단한 해결책이 가능할 수도 있지만 좋은 일반적인 것이 없다면 직접 만들 수 있습니다. –

2

는 일부 데이터베이스 간 SQL-92 스키마 쿼리 기준이있다 - 물론이 마일리지 다릅니다 공급 업체에 의해이 다름에 대한

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

지원 공급 업체에 따라 테이블의 컬럼의 내용처럼 전망. 여기 정보 스키마 문서의 SQL 구현 : SQL Server의 구체적

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

은 메타 데이터가 SQL92 표준의 주도권을 선행을 sysobjects.

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

위의 쿼리는 데이터베이스의 사용자 테이블 수를 반환합니다. 여기을 sysobjects 테이블에 대한 자세한 정보 :

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

1

이 완벽한 솔루션입니다 경우 몰라요 ...하지만 테이블이 시스템 테이블이 TABLE_TYPE을 읽는 경우 당신이 결정할 수 있습니다 의 getTables에 의해 반환 된 ResultSet의 칼럼 : 실제로

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

표준 일반 솔루션을 찾을 수 없어서 각 데이터베이스에 자체 테스트 세트가 필요합니다.

SELECT * FROM sys.all_objects where type_desc in ('USER_TABLE', 'SQL_STORED_PROCEDURE', 'VIEW') 

최고 : 나는 테이블, 뷰 및 저장 프로 시저를 확인하는 데 사용 SQLSERVER 들어

select count(*) from user_tables 
select count(*) from user_sequences 
select count(*) from user_indexes 

: 예를 들어 Oracle의 경우

, 나는 테이블, 시퀀스 및 인덱스를 확인하는 데 사용 내가 얻은 일반적인 (직관적 인) 솔루션은 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