无法访问PUBLIC架构中的表

时间:2016-05-01 19:48:32

标签: java sql jdbc hsqldb

设置:

我使用JDBC连接到独立的(文件中的数据库)HSQLDB。程序启动时连接打开,退出时关闭。用户是使用ADMIN权限创建的。

我使用hsqldb.jar数据库管理器在我的数据库中创建一个名为COMPONENTS的表。它驻留在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。但是,当我将该语句复制/粘贴到数据库管理器中时,它工作正常(我在两个地方都使用相同的用户登录)。

问题:

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

我搜索了SO和互联网,并且发现了数百个关于这个特殊例外的帖子,但是在如此广泛的情况下它被抛出,解决方案没有帮助。

答案:

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

1 个答案:

答案 0 :(得分:1)

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

由于您不熟悉数据库,因此可以更轻松地启动HSQLDB服务器并使用相同的URL从您的应用程序和DatabaseManager连接到该数据库。