如何从java.sql.Connection获取用户名?

6

我有一个在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个回答

4
正确的方法应该是DatabaseMetaData.getUserName(),但正如您所演示的,并非所有数据库都正确实现了它。另一种方法是使用JDBC函数转义USER(),例如(例如SELECT {fn USER()} FROM DUAL),但并非所有驱动程序都实现了所有JDBC转义,而且这可能只返回与DatabaseMetaData相同的结果。您还可以尝试在查询中使用SQL标准定义的CURRENT_USER(或USER),但存在两个问题: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) 数据源 ds 有一个 getUser() 方法; 2) 它已经被设置好了(例如,对于SQL Server集成安全性,数据源不需要知道用户信息)。

1

值得一提的是,Java 1.7 提供了 Connection.getSchema() 方法。不过,我不知道目前1.7有多广泛地被采用,所以这可能只是未来参考的一些内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接