2013-02-04 4 views
5

Ich habe eine Datenquelle für SQLServer in Weblogic mit dem Benutzernamen 'sa' erstellt.Wie bekomme ich UserName von java.sql.Connection?

Im Code verwende ich folgende, um Benutzernamen zu erhalten.

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()); 

Aber obige Code gibt immer "Dbo" als Benutzername zurück. Ich habe erwartet, dass der Benutzername "sa" ist. Wenn die Datenbank Oracle ist, funktioniert es gut. Gibt es eine generische Möglichkeit für mich, Benutzernamen für alle Arten von Datenbanken zu erhalten.

Antwort

4

Die richtige Methode sollte DatabaseMetaData.getUserName() sein, aber wie Sie zeigen, implementieren nicht alle Datenbanken das korrekt. Ein anderer Weg wäre die Verwendung der JDBC-Funktion escape USER() zB (zB SELECT {fn USER()} FROM DUAL), aber nicht alle Treiber implementieren alle JDBC-Escape-Zeichen, und es könnte einfach sein, dass dies dasselbe wie das DatabaseMetaData zurückgibt. Sie könnten auch den SQL-Standard CURRENT_USER (oder USER) in einer Abfrage versuchen, aber dort haben Sie zwei Probleme: 1) einige Datenbanken müssen Sie aus einer Tabelle auswählen (zB DUAL in Oracle, einige nicht) und 2) nicht Alle Datenbanken implementieren alle Teile der SQL-Standards, sodass die CURRENT_USER oder USER Kontextvariable möglicherweise nicht vorhanden ist.

Da Sie jedoch das DataSource-Objekt haben, könnten Sie versuchen, die user-Eigenschaft aus der Datenquelle abzurufen (sie ist in Tabelle 9.1 der JDBC 4.1-Spezifikation definiert, obwohl die dort beschriebenen Eigenschaftsnamen nicht alle erforderlich sind).

So zum Beispiel:

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

Dies davon aus, dass 1) die DataSource ds ein getUser() hat und 2) dass es tatsächlich (zum Beispiel mit SQL Server integrierter Sicherheit festgelegt ist die Datenquelle muss nicht darüber wissen Ein Benutzer).

0

FWIW, Java 1.7 bietet die Connection.getSchema() Methode. Ich weiß nicht, wie weit 1.7 an dieser Stelle bereits angenommen wurde, also könnte dies nur etwas sein, was man für zukünftige Referenzen im Auge behalten sollte.