2013-02-04 6 views
5

Mam źródło danych dla SQLServer utworzone w Weblogic z nazwą użytkownika "sa".Jak uzyskać nazwę użytkownika z java.sql.Connection?

W kodzie używam następujących po, aby uzyskać nazwę użytkownika.

Context ctx = new InitialContext(prop); 
Object obj = ctx.lookup("sqlserver1"); 
System.out.println("Data Source Found…."); 
DataSource ds = (DataSource) obj; 
Connection conn = ds.getConnection(); 
DatabaseMetaData mtdt = conn.getMetaData(); 
// Get UserName 
System.out.println("User name: " + mtdt.getUserName()); 

Ale powyższy kod zawsze zwraca "dbo" jako nazwę użytkownika. Spodziewałem się, że nazwa użytkownika będzie "sa". Jeśli DB to Oracle, działa dobrze. Czy istnieje ogólny sposób uzyskiwania nazwy użytkownika dla wszystkich typów baz danych?

Odpowiedz

4

Prawidłowa metoda powinna być DatabaseMetaData.getUserName(), ale jak wykazano, nie wszystkie bazy danych implementują ją poprawnie. Innym sposobem byłoby użycie funkcji JDBC escape USER() np. (Np. SELECT {fn USER()} FROM DUAL), ale nie wszystkie sterowniki implementują wszystkie instrukcje ucieczki JDBC, a może być tak, że zwracają to samo co DatabaseMetaData. Można również wypróbować standard SQL zdefiniowany jako CURRENT_USER (lub USER) w zapytaniu, ale istnieją dwa problemy: 1) niektóre bazy danych wymagają wyboru z tabeli (np. DUAL w Oracle, inne nie) i 2) nie wszystkie bazy danych implementują wszystkie części standardów SQL, więc zmienna kontekstowa CURRENT_USER lub może być nieobecna.

Ale ponieważ masz obiekt DataSource, możesz spróbować uzyskać właściwość user ze źródła danych (jest ona zdefiniowana w tabeli 9.1 specyfikacji JDBC 4.1, chociaż opisane tutaj nazwy właściwości nie są wymagane).

Tak na przykład:

Method getter = new PropertyDescriptor("user", ds.getClass()).getReadMethod(); 
String value = (String) getter.invoke(ds); 

to zakładamy, że 1) DataSource ds ma getUser() i 2), że faktycznie ustawić (na przykład za pomocą SQL Server zintegrowanego bezpieczeństwa DataSource nie musi wiedzieć użytkownik).

0

FWIW, Java 1.7 udostępnia metodę Connection.getSchema(). Nie wiem jednak, jak bardzo 1.7 zostało przyjęte w tym momencie, więc może to być coś, o czym warto pamiętać, by móc się z nim zapoznać w przyszłości.