无法访问 PUBLIC 架构中的表

Can not access tables in PUBLIC schema

设置:

我使用 JDBC 连接到一个独立的(文件中的数据库)HSQLDB。连接在程序启动时打开,并在程序退出时关闭。创建的用户具有管理员权限。

我已经使用 hsqldb.jar 数据库管理器在我的数据库中创建了一个名为 COMPONENTS 的 table。它驻留在 PUBLIC 模式中,我已经能够使用数据库管理器从中添加和减去记录。

我正在使用以下代码,在 main 方法中调用,以证明我可以正确查询我的数据库:

public static void displayAllRows() {
    String sql = "SELECT * FROM INFORMATION_SCHEMA.AUTHORIZATIONS";
    try (
        Statement stmt = CONN.createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        ) {

        System.out.println("Authorizations Table:");
        while(rs.next()) {
        StringBuilder bf = new StringBuilder();
        bf.append(rs.getString("AUTHORIZATION_NAME")).append(": ");
        bf.append(rs.getString("AUTHORIZATION_TYPE")).append(", ");
        System.out.println(bf.toString());
        }
    } catch (SQLException ex) {
        Logger.getLogger(CompManager.class.getName()).log(Level.SEVERE, null, ex);
    }
}

以上代码的输出是正确的,基于在数据库管理器工具中使用 SELECT * FROM INFORMATION_SCHEMA.AUTHORIZATIONS 语句。

问题:

然后我运行下面的简化代码。唯一的变化是 SELECT 语句,我取出了 try 块中的所有内容(这样就不会意外导致错误)。

private static final Connection CONN = ConnectionManager.getInstance().getConnection();

public static void displayAllRows() {
    String sql = "SELECT * FROM COMPONENTS";
    try (
        Statement stmt = CONN.createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        ) {


    } catch (SQLException ex) {
        Logger.getLogger(CompManager.class.getName()).log(Level.SEVERE, null, ex);
    }
}

抛出异常:java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: COMPONENTS

我也试过在声明中使用PUBLIC.COMPONENTS。但是,当我 copy/paste 将该语句输入数据库管理器时,它工作正常(我在两个地方都使用相同的用户登录)。

问题:

考虑到我对数据库的了解程度,我可能做错了什么。我可以尝试使第二个查询成功吗?

我搜索了 SO 和互联网,发现了数百篇关于这个特定异常的帖子,但它是在如此广泛的情况下抛出的,以至于解决方案都没有帮助。

答案:

不知何故,我不小心用我的程序连接到与数据库管理器不同的数据库。解决方案是将整个文件路径放入数据库连接字符串,而不是使用相对引用

您正在连接到两个不同的数据库。可能,您的数据库 URL 指定了一个相对于您启动 DatabaseManager 和您的应用程序的目录的文件路径。使用绝对路径或使用~符号的路径来表示user.home目录。

由于您是数据库新手,启动 HSQLDB 服务器并使用相同的 URL.

从您的应用程序和 DatabaseManager 连接到它会更容易