如何从java.sql.Connection获取用户名?
我有一个在Weblogic中创建的SQLServer数据源,用户名为“sa” 在代码中,我使用以下命令获取用户名如何从java.sql.Connection获取用户名?,java,sql-server,jdbc,weblogic,jndi,Java,Sql Server,Jdbc,Weblogic,Jndi,我有一个在Weblogic中创建的SQLServer数据源,用户名为“sa” 在代码中,我使用以下命令获取用户名 Context ctx = new InitialContext(prop); Object obj = ctx.lookup("sqlserver1"); System.out.println("Data Source Found…."); DataSource ds = (DataSource) obj; Connection conn = ds.getConnection();
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函数escapeUSER()
eg(例如SELECT{fn USER()}FROM DUAL
),但并非所有驱动程序都实现所有JDBC转义,这可能只是返回与数据库元数据相同的转义。您也可以在查询中尝试定义的SQL标准CURRENT_USER
(或USER
),但存在两个问题:1)有些数据库需要您从表中进行选择(例如Oracle中的DUAL
,有些不需要),2)并非所有数据库都实现SQL标准的所有部分,因此,当前用户
或用户
上下文变量可能不存在
但是,当您拥有DataSource对象时,您可以尝试从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集成安全性,数据源不需要知道用户的情况)。FWIW,Java 1.7提供了该方法。我不知道1.7在这一点上已经被广泛采用,所以这可能只是为了将来的参考而需要记住的东西