Weblogic环境下如何从Java.sql.Connection获取SQL Server登录用户名?
解决Weblogic连接SQL Server时获取实际登录名的问题
这个问题其实是SQL Server的**登录名(Login)和数据库用户(User)**分离机制导致的,JDBC的getMetaData().getUserName()返回的是当前连接对应的数据库用户,而不是你用来登录的SQL Server登录名。
为什么返回的是dbo?
当你用sa登录SQL Server时,默认会自动映射到每个数据库的dbo用户(数据库所有者)。JDBC驱动的getUserName()方法遵循JDBC规范,返回的是数据库层面的用户身份,所以就得到了dbo,而不是登录名sa。
正确获取实际登录名的方法
要拿到真正的登录名,你需要执行SQL查询来获取,推荐用ORIGINAL_LOGIN()函数(它会返回最初建立连接时使用的登录名,即使之后有模拟身份的操作也能准确获取),或者SUSER_SNAME()(返回当前上下文的登录名)。
下面是修改后的Java代码示例:
InitialContext ic = new InitialContext(); DataSource ds = (DataSource)ic.lookup(jndiName); Connection connection = ds.getConnection(); connection.setAutoCommit(false); // 获取实际登录名 String actualLoginName = null; try (Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery("SELECT ORIGINAL_LOGIN() AS ActualLogin")) { if (rs.next()) { actualLoginName = rs.getString("ActualLogin"); } } catch (SQLException e) { // 处理异常 e.printStackTrace(); } System.out.println("实际登录名: " + actualLoginName);
补充说明
- 如果你的场景中没有身份模拟的情况,
SUSER_SNAME()也能得到正确结果,但ORIGINAL_LOGIN()的适用性更广。 - 检查Weblogic数据源配置:确保你在数据源中配置的确实是
sa作为登录用户,没有误设为dbo(不过dbo是数据库用户,不能直接用来登录SQL Server,所以大概率不会有这个问题)。
内容的提问来源于stack exchange,提问作者Ioanna Katsanou
相关产品推荐
相关产品推荐

