如何从java.sql.Connection获取UserName?

时间:2013-02-04 17:17:18

标签: java sql-server jdbc weblogic jndi

我在Weblogic中创建了一个用户名为“sa”的SQLServer数据源。

在代码中我使用以下来获取用户名。

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,它可以正常工作。我是否有通用的方法来获取所有不同类型数据库的用户名。

2 个答案:

答案 0 :(得分:4)

正确的方法应该是DatabaseMetaData.getUserName(),但正如您所示,并非所有数据库都能正确实现。另一种方法是使用JDBC函数escape USER()例如(例如SELECT {fn USER()} FROM DUAL),但并非所有驱动程序都实现所有JDBC转义,并且它可能只是返回与{{1}相同的}。您还可以在查询中尝试定义DatabaseMetaData(或CURRENT_USER)的SQL标准,但是您有两个问题:1)某些数据库要求您从表中进行选择(例如USER在Oracle中,有些不这样做)和2)并非所有数据库都实现了SQL标准的所有部分,因此DUALCURRENT_USER上下文变量可能不存在。

但是,当您拥有DataSource对象时,您可以尝试从数据源获取USER属性(它在JDBC 4.1规范的表9.1中定义,尽管其中描述的属性名称并非都是必需的)

例如:

user

这假设1)Method getter = new PropertyDescriptor("user", ds.getClass()).getReadMethod(); String value = (String) getter.invoke(ds); 具有DataSource ds和2)它实际上已设置(例如,使用SQL Server集成安全性,数据源不需要了解用户)。

答案 1 :(得分:1)

FWIW,Java 1.7提供了Connection.getSchema()方法。我不知道1.7在这一点上采用了多大的1.7,所以这可能只是需要记住以供将来参考。