无法访问 PUBLIC 架构中的表

Posted

技术标签:

【中文标题】无法访问 PUBLIC 架构中的表【英文标题】:Can not access tables in PUBLIC schema 【发布时间】:2016-05-01 19:48:32 【问题描述】:

设置:

我使用 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 和互联网,发现了数百篇关于此特定异常的帖子,但它是在如此广泛的情况下引发的,以至于解决方案没有帮助。

答案:

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

【问题讨论】:

【参考方案1】:

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

由于您是数据库新手,因此启动 HSQLDB 服务器并使用相同的 URL 从您的应用和 DatabaseManager 连接到它会更容易。

【讨论】:

哇,好电话。已经指定了整个文件路径并且它可以工作。您说使用 HSQLDB 服务器会更容易的原因是什么? Server 允许您在应用程序运行时从 DatabaseManager 进行连接。 啊,我明白你的意思了。还没试过。部署我的应用程序后,我需要至少 2 个用户同时连接。独立的会不允许吗? (我知道将数据库存放在服务器上是显而易见的解决方案,但我们的 IT 部门不会非常喜欢这种请求,而且出于显而易见的原因,我无法将数据库存放在内网之外) 阅读 HSQLDB 指南。一次只有一个 Java 进程可以连接到一个文件:数据库。但是进程可以有多个连接到同一个数据库。

以上是关于无法访问 PUBLIC 架构中的表的主要内容,如果未能解决你的问题,请参考以下文章

无法访问远程 MySQL 数据库的表

无法从 AWS Redshift 访问 AWS Athena 表

无法访问 Spring Boot 中的不安全端点

通过 Spark 加载的表在 Hive 中无法访问

Github 操作:无法访问属性文件中的值

无法通过 url http://localhost/myproject/public/ 访问 laravel 项目