【发布时间】:2012-11-12 09:37:39
【问题描述】:
我正在尝试使用 DatabaseMetaData.getTables() 方法获取所有数据库表。但是这种方法需要数据库模式名称模式。是否可以获取当前数据库连接的架构名称?
【问题讨论】:
我正在尝试使用 DatabaseMetaData.getTables() 方法获取所有数据库表。但是这种方法需要数据库模式名称模式。是否可以获取当前数据库连接的架构名称?
【问题讨论】:
当前连接的标准架构是您用于登录的用户名。因此,如果您的用户是SCOTT,则必须使用SCOTT 来表示DatabaseMetaData.getTables()。
您可以通过DatabaseMetaData.getUserName()获取用户名。
但请记住,在 JDBC 驱动程序中比较模式/用户名是区分大小写的,并且通常用户名是大写的。
我不能 100% 确定 DatabaseMetaData.getUserName() 是否会在所有情况下以正确的大小写返回名称。可以肯定的是,您可能希望在使用该值之前执行一个 upperCase()。
【讨论】:
where owner = ? 的操作,并且 that 比较区分大小写(与所有其他字符串比较一样)。作为 标识符 一部分的用户名不区分大小写。 select * from SCOTT.foobar 与 select * from scott.FOObar 相同
尝试使用 getCatalogs()。这是一个速写
public List<String> getDatabases(DBEnv dbEnv) {
Connection conn = getConnection(dbEnv);
List<String> resultSet = new ArrayList<String>();
try {
DatabaseMetaData metaData = conn.getMetaData();
ResultSet res = metaData.getCatalogs();
while (res.next()) {
resultSet.add(res.getString("TABLE_CAT"));
}
} catch (SQLException e) {
logger.error(e.toString());
}
return resultSet;
}
【讨论】:
从 Java 7 开始,Connection 有一个 getSchema 方法:https://docs.oracle.com/javase/8/docs/api/java/sql/Connection.html#getSchema--
【讨论】:
不幸的是,答案是没有一致的解决方案。如果 John 有权访问 Sally.Table ... 查询将起作用,但 getUserName() 将返回 John 而不是 Sally 模式。对于 Oracle,用户拥有他们的架构,而其他人可能有权访问,该用户 ID 是该连接上的 默认 架构。
此外,getSchemaName() 和 getCatalog() 都不会返回架构名称。
@horse_with_no_name 对 Oracle 有最接近的答案,因为给定的用户名是(默认)模式名称,除非在对象引用中被覆盖,如图所示。
对于其他数据库,相同的规则并不一致。
【讨论】:
您可以使用
获取架构名称Connection conn =
DriverManager.getConnection("jdbc:oracle:thin:@server:port:SID",prop);
DatabaseMetaData databaseMetaData = conn.getMetaData();
System.out.println("schema name >>>> "+databaseMetaData.getUserName());
【讨论】: