Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从java.sql.Connection获取用户名?_Java_Sql Server_Jdbc_Weblogic_Jndi - Fatal编程技术网

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

如何从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();

我有一个在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();
DatabaseMetaData mtdt = conn.getMetaData();
// Get UserName
System.out.println("User name: " + mtdt.getUserName());

但是上面的代码总是返回'dbo'作为用户名。我希望用户名是'sa'。如果数据库是Oracle,则工作正常。是否有一种通用方法可以获取所有不同类型数据库的用户名。

正确的方法应该是
DatabaseMetaData.getUserName()
,但正如您所演示的,并不是所有数据库都能正确实现这一点。另一种方法是使用JDBC函数escape
USER()
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在这一点上已经被广泛采用,所以这可能只是为了将来的参考而需要记住的东西