![](/img/trans.png)
[英]How to get UserName from java.sql.Connection - SQL Server DB?
[英]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_USER
或USER
上下文变量。
但是,当您拥有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.