Redshift是否支持java.sql.DatabaseMetaData?getTables无结果求助
我之前也碰到过类似的情况,Redshift的JDBC驱动对DatabaseMetaData.getTables的处理确实有几个容易踩的小坑,结合你的场景,给你几个排查和解决的方向:
1. 明确指定表类型参数
你当前第四个参数传的是null,这会让驱动尝试返回所有类型的数据库对象(包括视图、系统表等),但Redshift驱动在这种场景下的过滤逻辑可能出现偏差。试试明确指定只查询普通表:
ResultSet rs = md.getTables(null, "public", "mytable", new String[] {"TABLE"});
2. 检查Schema参数的大小写匹配
Redshift的标识符默认不区分大小写,但JDBC驱动处理getTables的schema参数时,可能会严格匹配存储的实际大小写。你可以先通过SQL确认表的schema和名称的真实存储形式:
SELECT table_schema, table_name FROM information_schema.tables WHERE table_name ILIKE 'mytable';
如果结果里的table_schema是大写的PUBLIC,就把第二个参数改成"PUBLIC"再试;如果是小写,保持"public"即可。另外也可以尝试将schema参数设为null,看是否能返回目标表:
ResultSet rs = md.getTables(null, null, "mytable", new String[] {"TABLE"});
3. 验证当前用户的访问权限
确保你连接Redshift的用户拥有访问public.mytable的权限,至少需要public schema的USAGE权限和该表的SELECT权限。可以执行以下SQL授权(如果还没配置的话):
GRANT USAGE ON SCHEMA public TO your_connection_user; GRANT SELECT ON public.mytable TO your_connection_user;
授权完成后再重试getTables方法。
4. 替代方案:直接查询information_schema
如果上面的方法都不生效,你可以绕开DatabaseMetaData,直接查询Redshift的系统表获取表信息,这也是很多Redshift开发者常用的方式:
String query = "SELECT table_name, table_type, table_schema " + "FROM information_schema.tables " + "WHERE table_schema = 'public' AND table_name = 'mytable'"; Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery(query); while (rs.next()) { // 处理查询结果 }
Redshift官方确实没有对java.sql.DatabaseMetaData的每个方法做细致的文档说明,但通过以上几个方向排查,基本能解决getTables返回空结果的问题。
内容的提问来源于stack exchange,提问作者Bruce

