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

4

2 回答 2

4

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

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

例如:

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

这假设 1)DataSource ds具有 agetUser()和 2) 它实际上已设置(例如,对于 SQL Server 集成安全性,数据源不需要了解用户)。

于 2013-02-04T19:25:19.163 回答
1

FWIW,Java 1.7 提供了Connection.getSchema()方法。但是,我不知道此时 1.7 的采用范围有多广,因此这可能只是为了将来参考而牢记在心。

于 2014-03-27T13:31:41.400 回答