HSQL数据库用户缺少权限或对象未找到错误

我试图使用hsqldb-2.3.4从Spring应用程序连接。

我使用以下详细信息创建了数据库

Type : HSQL Database Engine Standalone Driver: org.hsqldb.jdbcDriver URL: jdbc:hsqldb:file:mydb UserName: SA Password: SA 

我在“MYDB”模式下创建了一个名为ALBUM的表

在spring配置文件中:

          

在我的spring控制器中,我正在做jdbcTemplate.query("SELECT * FROM MYDB.ALBUM", new AlbumRowMapper());

它给了我例外:

 org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [SELECT * FROM MYDB.ALBUM]; nested exception is java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: ALBUM org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) javax.servlet.http.HttpServlet.service(HttpServlet.java:622) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) javax.servlet.http.HttpServlet.service(HttpServlet.java:729) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

如果我通过hsqldb的SQL编辑器执行相同的查询,它执行正常。 你能帮我解决这个问题吗?

user lacks privilege or object not found可能有多种原因,最显而易见的是您正在访问不存在的表。 一个不太明显的原因是,当您运行代码时,与文件数据库URL的连接实际上可以创建数据库。 您遇到的情况可能是您使用HSQL数据库管理器设置了数据库,添加了表和行,但这不是您的Java代码使用的特定实例。 您可能想要检查您的工作区中是否没有这些文件的多个副本: mydb.logmydb.lckmydb.properties等。 如果您的Java代码确实创建了这些文件,则位置取决于您运行程序的方式。 例如,在Netbeans内部运行的Maven项目中,文件与pom.xml一起存储。

如果您在此问题上尝试了所有其他答案,则很可能是您遇到了区分大小写的问题。

默认情况下,HSQLDB区分大小写。 如果未在架构或列或表的名称周围指定双引号,则默认情况下会将其转换为大写。 如果您的对象是以大写forms创建的,那么您很幸运。 如果是小写,则必须用双引号括住对象名称。

例如:

 CREATE MEMORY TABLE "t1"("product_id" INTEGER NOT NULL) 

要从此表中进行选择,您必须使用以下查询

 select "product_id" from "t1" 

我有错误user lacks privilege or object not found在尝试在空的内存数据库中创建表时user lacks privilege or object not found 。 我使用了spring.datasource.schema ,问题是在“CREATE TABLE”-Statement(后面跟着“CREATE INDEX”)之后我错过了我的SQL文件中的分号。

我遇到了与错误’ org.hsqldb.HsqlException: user lacks privilege or object not found: DAYS_BETWEEN类似的问题org.hsqldb.HsqlException: user lacks privilege or object not found: DAYS_BETWEEN ‘结果certificatehsqldb不能将DAYS_BETWEEN识别为函数。 请改用DATEDIFF。

 DATEDIFF ( ,  ) 

正如先前的回应所说,有许多可能的原因。 其中之一是由于语法不兼容而未创建表。 如果使用特定的DB供应商语法或特定function,HSQLDB将无法识别它 。 然后,在执行创建代码时,您可以看到该表未因此语法原因而创建。 例如,如果实体使用@column(“TEXT”)进行注释,则表的创建将失败。

有一个工作告诉HSQLDB处于pgsl的兼容模式,你应该附加你的连接URL

 "spring.datasource.url=jdbc:hsqldb:mem:testdb;sql.syntax_pgs=true" 

而对于mysql

 "spring.datasource.url=jdbc:hsqldb:mem:testdb;sql.syntax_mys=true" 

神谕

 "spring.datasource.url=jdbc:hsqldb:mem:testdb;sql.syntax_ora=true" 

请注意,根据您的配置存在变体,可能是hibernate.connection.url=spring.datasource.url=对于那些不使用hibernate架构创建但是SQL脚本的人,您应该在脚本中使用这种语法

 SET DATABASE SQL SYNTAX ORA TRUE; 

它还将解决由于SQL请求中的供应商特定语法引起的问题,例如对于posgresql的array_agg

Nota bene :当代码解析模型以创建模式然后隐藏在许多行日志中时,问题很早发生,然后unitTested代码崩溃,出现令人困惑和模糊的exception“用户缺少权限或对象未找到错误”这根本没有指出真正的问题。 因此,请务必从头开始阅读所有跟踪并修复所有可能的问题

运行HSWLDB服务器时。 例如你的java配置文件有:

hsql.jdbc.url = jdbc:hsqldb:hsql://localhost:9005/YOURDB;sql.enforce_strict_size=true;hsqldb.tx=mvcc

检查以确保您设置了server.dbname.# 。 例如我的server.properties文件:

  server.database.0=eventsdb server.dbname.0=eventsdb server.port=9005