繁体   English   中英

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

[英]How to get UserName from java.sql.Connection?

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

正确的方法应该是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) DataSource ds具有getUser()和2)它实际上已设置(例如,使用SQL Server集成安全性,数据源不需要了解用户)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM