我试图使用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配置文件中:
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg ref="dbcpDataSource" />
</bean>
<bean id="dbcpDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.hsqldb.jdbcDriver" />
<property name="url" value="jdbc:hsqldb:file:mydb" />
<property name="username" value="SA" />
<property name="password" value="SA" />
</bean>
在我的春季控制器中,我正在做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.log
,mydb.lck
,mydb.properties
等。如果您的Java代码确实创建了这些文件,则位置取决于您运行程序的方式。例如,在Netbeans内部运行的Maven项目中,文件与pom.xml一起存储。
如果您在此问题上尝试了所有其他答案,则很可能是您遇到了区分大小写的问题。
默认情况下,HSQLDB区分大小写。如果未在架构或列或表的名称周围指定双引号,则默认情况下会将其转换为大写。如果您的对象是以大写形式创建的,那么您很幸运。如果是小写,则必须用双引号括住对象名称。
例如:
CREATE MEMORY TABLE "t1"("product_id" INTEGER NOT NULL)
要从此表中进行选择,您必须使用以下查询
select "product_id" from "t1"
正如先前的回应所说,有许多可能的原因。其中之一是由于语法不兼容而未创建表。如果使用特定的DB供应商语法或特定功能,HSQLDB将无法识别它。然后,在执行创建代码时,您可以看到该表不是出于此语法原因而创建的。例如,如果实体使用@Column(columnDefinition = "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代码崩溃,出现令人困惑和模糊的异常“用户缺少权限或对象未找到错误”这根本没有指出真正的问题。因此,请务必从头开始阅读所有跟踪并修复所有可能的问题
我在尝试在空的内存数据库中创建表时遇到错误user lacks privilege or object not found
。我使用spring.datasource.schema
,问题是我在SQL文件中错过了一个分号,后面是“CREATE TABLE”-Statement(后跟“CREATE INDEX”)。
我有类似的问题与错误'org.hsqldb.HsqlException: user lacks privilege or object not found: DAYS_BETWEEN
'结果DAYS_BETWEEN
不被hsqldb识别为函数。请改用DATEDIFF。
DATEDIFF ( <datetime value expr 1>, <datetime value expr 2> )
运行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
我使用以下脚本在hsql db中插入数据
INSERT INTO Greeting (text) VALUES ("Hello World");
我遇到了与未找到Hello World对象相关的问题,并且HSQL数据库用户缺少权限或找不到对象错误
我改成了下面的脚本
INSERT INTO Greeting (text) VALUES ('Hello World');
现在它工作正常。
我最近遇到了同样的问题。我们正在运行一个grails应用程序,有人将一个SQL脚本插入到BootStrap文件中(这是grails的入口点)。该脚本应该只在生产环境中运行,但由于逻辑错误,它也在测试中运行。所以我得到的错误是:
User lacks privilege or object not found:
没有任何澄清......
我只是要确保脚本没有在测试环境中运行,它解决了我的问题,虽然我花了3个小时来弄明白。我知道这是一个非常非常具体的问题,但如果我可以节省一些代码挖掘的话,那将是非常好的。
我遇到了同样的错误。在我的情况下,我忘了把apas放在琴弦中。
我在做String test = "inputTest";
正确的是String test = "'inputTest'";
当我试图在数据库中放置一些东西时发生错误
connection.createStatement.execute("INSERT INTO tableTest values(" + test +")";
在我的情况下,只需使用引号'
来纠正错误。