【问题标题】:How to get UserName from java.sql.Connection?如何从 java.sql.Connection 获取用户名?
【发布时间】:2013-01-19 10:56:05
【问题描述】:

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

【问题讨论】:

    标签: java sql-server jdbc weblogic jndi


    【解决方案1】:

    正确的方法应该是DatabaseMetaData.getUserName(),但正如您所展示的,并非所有数据库都能正确实现。另一种方法是使用 JDBC 函数转义 USER() 例如(例如 SELECT {fn USER()} FROM DUAL),但并非所有驱动程序都实现所有 JDBC 转义,它可能只是返回与 DatabaseMetaData 相同的值。您也可以在查询中尝试定义CURRENT_USER(或USER)的SQL 标准,但是您有两个问题:1)某些数据库要求您从表中进行选择(例如Oracle 中的DUAL,有些则不需要) t) 和 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 集成安全性,数据源不需要了解用户)。

    【讨论】:

      【解决方案2】:

      FWIW,Java 1.7 提供了Connection.getSchema() 方法。不过,我不知道目前 1.7 的采用范围有多广,所以这可能只是需要记住的一点,以备将来参考。

      【讨论】:

        猜你喜欢
        • 2011-08-08
        • 2020-10-05
        • 2020-10-26
        • 1970-01-01
        • 2018-12-18
        • 1970-01-01
        • 2013-10-29
        • 2020-11-22
        • 1970-01-01
        相关资源
        最近更新 更多