2013-05-17 2 views
3

JDBC를 통해 실행되는 SQL 쿼리와 관련된 테이블의 이름을 알 수있는 방법이 있습니까? 예를 들어JDBC : SQL 쿼리와 관련된 테이블 이름 얻기

:

SELECT r.roleId FROM User u, UserRole r where r.userId = u.userId and u.name = "Jonh Smith" 

나는 단지이 쿼리의 결과 집합하지만 실제 테이블 이름 ("사용자"및 "역할")를 원하지 않습니다. 뷰 이름은 신경 쓰지 않지만 뷰에 사용 된 기본 테이블을 얻는 방법이 없다면 큰 문제는 아니지만 중첩 쿼리와 함께 작동해야합니다.

다른 개발자가 응용 프로그램을 빌드 할 수있게 해주는 플랫폼을 만들고 있기 때문에이 정보가 필요한 이유는 다음과 같습니다. 필자의 플랫폼에서는 다른 개발자가 자신의 쿼리를 등록하게하고이를 데이터베이스에 저장합니다. 나는 개발자가 실제로 쿼리 자체와 함께 테이블 이름을 실제로 수동으로 등록해야하는 것을 원하지 않는다. 그래서 내가 쿼리를 실행하고있을 때 나는 그 쿼리가 무엇을하는지 실제로 알지 못합니다.

+4

당신이 묘사 한 것 ("다른 개발자들이 자신의 쿼리를 등록하고 데이터베이스에 저장하게했습니다 ... 그래서 쿼리를 실행하고있을 때 나는 그 쿼리가 무엇을하는지 모릅니다. ")는 일어날 대기 SQL 주입입니다. –

+0

@BrianRoach 다른 개발자가 내 서버에서 응용 프로그램을 실행하지 않을 것입니다. 내 플랫폼의 각 "사용자 정의"는 개발자가 별도로 배포합니다. 따라서 쿼리가 악용되지 않을 것이라고 확신 할 수 있습니다. 응용 프로그램의 일반 사용자는 쿼리에 액세스 할 수 없습니다. – Hoffmann

답변

2

나는 당신이 필요로하는 것을 정확하게하는 방법을 발견하지 못했지만, 어쨌든 이것을 언급하기에는 너무 길기 때문에 이것을 게시 할 것입니다. 내가 찾은 가장 가까운 것은 ResultSetMetaData입니다.

This is a tutorial on how to get it. 그러나이 자습서에서는 테이블 이름을 가져 오는 방법을 보여주지 않습니다. 이를 수행하는 방법은 getTableName입니다.

/** 
* Gets the designated column's table name. 
* 
* @param column the first column is 1, the second is 2, ... 
* @return table name or "" if not applicable 
* @exception SQLException if a database access error occurs 
*/ 
String getTableName(int column) throws SQLException; 

모든 열을 반복하고 테이블 이름을 Set에 넣어야합니다. 결과는 사용 된 모든 테이블이어야하지만 ... 문제는 열이 선택에서 노출되지 않으면 테이블을 발견 할 수 없다는 것입니다. 이 문제를 해결할 방법을 찾을 수 없었습니다.

+0

흠, 질문을 할 때 해결책을 얻는 데별로 희망이 없었습니다. 그러나 이것은 제 경우에 실제로 작용할 것입니다. 나는 또 다른 문제가 있지만, 내 플랫폼에서 개발자가 사용하고있는 JDBC 드라이버의 .jar를 제공 할 수 있도록했다. 그래서 나는 그들이 사용하고있는 JDBC 드라이버가 스펙과 100 % 호환된다는 보장이 없으며,이 ResultSetMetaData를 모든 주요 드라이버에서 올바르게 구현할 수 있다고 믿을 수 있습니까? – Hoffmann

+0

@Hoffmann 나는 그것을 기대하지만, 나는 보장 할 수 없다. –

+0

일부 드라이버는 이와 같은 메소드를 구현하지 않으므로주의하십시오. 예를 들어 getTableName은 Redshift의 공식 드라이버를 사용할 때 null을 반환합니다. – Vilis