2013-02-04 68 views
5

我有一個使用用戶名'sa'在Weblogic中創建的SQLServer的數據源。如何從java.sql.Connection獲取UserName?

在代碼中我使用以下來獲取用戶名。

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

但上面的代碼總是返回'dbo'作爲用戶名。我預計用戶名是'sa'。如果數據庫是Oracle,它工作正常。有沒有一種通用的方式來獲取所有不同類型的數據庫的用戶名。

回答

4

正確的方法應該是DatabaseMetaData.getUserName(),但是正如您演示的那樣,並非所有數據庫都正確實施。另一種方法是使用例如JDBC函數轉義USER()(例如SELECT {fn USER()} FROM DUAL),但並不是所有驅動程序都實現所有JDBC轉義,並且它可能只是返回與DatabaseMetaData相同的結果。您也可以嘗試在查詢中定義的CURRENT_USER(或USER)SQL標準,但是您遇到兩個問題:1)某些數據庫要求您從表中進行選擇(例如,Oracle中的DUAL,有些不需要)和2)不是所有數據庫都實現了SQL標準的所有部分,因此CURRENT_USERUSER上下文變量可能不存在。但是由於您有DataSource對象,因此您可以嘗試從數據源獲取user屬性(它在JDBC 4.1規範的表9.1中定義,儘管這裏描述的屬性名稱並不都是必需的)。

因此,例如:

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

這個假設1)DataSource dsgetUser()和2),它實際上是設置(例如與SQL Server集成安全的數據源並不需要了解一個用戶)。

0

FWIW,Java 1.7提供了Connection.getSchema()方法。但是,我不知道現在有多寬1.7,所以這可能只是爲了將來的參考。

相關問題