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

时间:2016-07-16 21:19:32

标签: java spring hsqldb spring-jdbc

我正在尝试使用 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编辑器执行相同的查询,它执行正常。能帮帮我吧。

18 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:5)

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

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

例如:

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

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

select "product_id" from "t1"

答案 2 :(得分:3)

如先前的答复所述,有许多可能的原因。其中之一是由于语法不兼容而未创建表。 如果使用特定的数据库供应商语法或特定功能,则HSQLDB将无法识别。然后,在执行创建代码时,您会看到由于这种语法原因未创建表。例如,如果实体带有@Column("TEXT")注释,则表的创建将失败。

有一个解决方法,它告诉HSQLDB处于兼容模式 对于pgsl,您应该在连接网址后添加

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

,对于 mysql

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

oracle

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

请注意,根据您的配置有不同的形式 可能是hibernate.connection.url=spring.datasource.url= 对于那些不使用休眠模式创建而是使用SQL脚本的用户,应该在脚本中使用这种语法

SET DATABASE SQL SYNTAX ORA TRUE;

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

array_agg

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

另一个原因可能是拼写错误的字段名称。如果您的实际表有一个名为专辑的 id 列并且您使用了专辑_id,那么这也可能发生。

正如另一个回答所说,字段名称的大小写差异也需要注意。

答案 5 :(得分:0)

物有所值 - 我遇到了同样的问题。我有一个名为“TYPE”的列,我将其重命名为“XTYPE”,还有一个名为 ORDER 的列,我将其重命名为“XORDER”,问题就消失了。

答案 6 :(得分:0)

就我而言,其中一列的名称为“key”,但缺少 @Column(name = "key") 注释,因此在日志中您可以看到创建该表的查询,但实际上并非如此那里。所以要小心列名

答案 7 :(得分:0)

添加这两个额外的属性:

spring.jpa.hibernate.naming.implicit-strategy=
org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl

spring.jpa.hibernate.naming.physical-strategy=
org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

答案 8 :(得分:0)

您必须在服务器模式下运行数据库并进行连接,否则它将无法从外部应用程序连接并给出类似于用户缺乏特权的错误。 在服务器模式下运行数据库时,还要相应地在spring配置文件中更改数据库的URL。

在服务器模式下运行数据库的示例命令 $ java -cp lib / hsqldb.jar org.hsqldb.server.Server --database.0文件:data / mydb --dbname.0测试

配置文件中URL的格式 jdbc:hsqldb:hsql:// localhost / Test

答案 9 :(得分:0)

在尝试运行我的应用程序时未在Intellij IDEA数据源(数据库)属性中指定“路径”字段时遇到此错误。其他所有配置均正确。

我能够在IDEA数据库控制台中运行脚本,并且脚本可以正确执行,但是由于没有提供指向IDEA的路径,因此无法识别连接位置,从而导致错误。

答案 10 :(得分:0)

在我的情况下,问题是由于persistence.xml中缺少以下行(我错误地将其注释掉)引起的:

<property name="hibernate.hbm2ddl.auto" value="update"/>

这阻止了Hibernate发出DDL来创建所需的架构元素...

(不同的Hibernate包装器将具有不同的机制来指定属性;我在这里使用JPA)

答案 11 :(得分:0)

在插入语句中串联变量时出现此问题。这有效

// var1, var3, var4 are String variables
// var2 and var5 are Integer variables
result = statement.executeUpdate("INSERT INTO newTable VALUES ('"+var1+"',"+var2+",'"+var3+"','"+var4+"',"+var5 +")");

答案 12 :(得分:0)

在我的情况下,发生错误是因为我没有将TABLE_NAME放在双引号“ TABLE_NAME”中,并且具有oracle模式前缀。

不起作用:

SELECT * FROM FOOSCHEMA.BAR_TABLE

工作:

SELECT * FROM "BAR_TABLE"

答案 13 :(得分:0)

我犯了同样的错误。就我而言,我忘记了将apas放在弦上。

我在做String test = "inputTest";

正确的是String test = "'inputTest'";

当我尝试将某些东西放入数据库时​​发生错误

connection.createStatement.execute("INSERT INTO tableTest values(" + test +")";

就我而言,只需将引号'改正错误即可。

答案 14 :(得分:0)

我最近遇到了同样的问题。我们正在运行grails应用程序,有人将SQL脚本插入BootStrap文件(这是grails的入口点)。该脚本原本只能在生产环境中运行,但是由于逻辑错误,它也在测试中运行。所以我得到的错误是:

User lacks privilege or object not found:

没有更多澄清...

我只需要确保脚本没有在测试环境中运行即可,尽管我花了3个小时才弄清楚该脚本,但它为我解决了这个问题。我知道这是一个非常非常具体的问题,但是如果我可以节省一个人几个小时的代码挖掘时间,那还是很棒的。

答案 15 :(得分:0)

我正在使用以下脚本在hsql db中插入数据

INSERT INTO Greeting (text) VALUES ("Hello World");

我遇到与找不到 Hello World 对象和HSQL数据库用户缺少特权或找不到对象错误相关的问题

我将其更改为以下脚本

INSERT INTO Greeting (text) VALUES ('Hello World');

现在工作正常。

答案 16 :(得分:0)

运行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

答案 17 :(得分:0)

我遇到了与错误类似的问题&#39; org.hsqldb.HsqlException: user lacks privilege or object not found: DAYS_BETWEEN&#39; hsqldb无法将DAYS_BETWEEN识别为函数。改为使用DATEDIFF。

DATEDIFF ( <datetime value expr 1>, <datetime value expr 2> )