列出不需要用模式名称限定的数据库表

Posted

技术标签:

【中文标题】列出不需要用模式名称限定的数据库表【英文标题】:list database tables that don't need to be qualified with schema name 【发布时间】:2021-12-28 16:36:45 【问题描述】:

我使用:jdbc:postgresql://127.0.0.1/mydb?currentSchema=app96 连接到 PostgreSQL 服务器。 我需要列出存在的表并创建在我的服务器初始化期间丢失的表。

这是我的代码:

final ResultSet rs2 =
    conn.getMetaData().getTables(null, "", null, new String[]  "TABLE" );
while (rs2.next()) 
    System.out
        .println(rs2.getString("TABLE_SCHEM") + "." + rs2.getString("TABLE_NAME"));

打印出来:

app96.t1
app96.t2
public.administration$account
public.appmodule$uploadedfile
public.audittrail$audittrailsuperclass
...

来自getTables的javadoc:

schemaPattern ... "" 检索那些没有架构的

但似乎getTables 对待空字符串的方式与 null 相同。是否有纯 JDBC 方法来按当前模式进行过滤,还是我必须自己实现特定于 DB 的过滤器?

【问题讨论】:

在 Postgres 中没有没有模式的表这样的东西。是否需要完全限定查询中的表引用取决于 search_path 中指定的架构 【参考方案1】:

是的,按照 Java 中的 JDBC 规范,这是正确的。

schemaPattern - 模式名称模式;必须与架构名称匹配 它存储在数据库中; "" 检索那些没有模式的; null 表示不应使用模式名称来缩小范围 搜索

但 PostgreSQL 实现 PgDatabaseMetaData 似乎没有兑现这一点。

getTables 方法具有以下检查,其中检查 NULL 以及非空字符串。 (可能这就是 PostgreSQL 的实现方式)

  if (schemaPattern != null && !schemaPattern.isEmpty()) 
      select += " AND n.nspname LIKE " + escapeQuotes(schemaPattern);
    

PgDatabaseMetaData implementation code from Github

【讨论】:

这是正确的,因为在 Postgres 中没有没有模式的表。所以传递"" 永远不会返回任何东西。

以上是关于列出不需要用模式名称限定的数据库表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Google BigQuery 中列出与特定名称匹配的表?

无法使用视图定义中具有表的完全限定名称的视图编译 SSDT 数据库项目

从三个表中提取数据;试图列出员工正在从事的项目的项目编号、项目名称和工作时间

用于获取表名、视图和存储过程的 SQL 语句,按模式排序

需要用表名和表的模式列出 SQL Server 数据库中的所有触发器

创建一个列出值的数据透视表