У пользователя базы данных HSQL отсутствует привилегия или объект не найдена ошибка

Я пытаюсь использовать hsqldb-2.3.4 для подключения из приложения Spring.

Я создал базу данных, используя следующие данные.

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

Я создал таблицу с именем ALBUM в схеме "MYDB"

В файле конфигурации 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>

И в моем контроллере 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)

Если я выполняю тот же запрос через SQL-редактор hsqldb, он выполняется отлично. Не могли бы вы помочь мне с этим.

Ответ 1

user lacks privilege or object not found может иметь несколько причин, наиболее очевидным из которых является доступ к таблице, которая не существует. Менее очевидная причина заключается в том, что при запуске кода соединение с URL-адресом базы данных на самом деле может создать БД. Сценарий, который вы испытываете, может заключаться в том, что вы настроили базу данных с помощью HSQL Database Manager, добавили таблицы и строки, но это не тот конкретный экземпляр, который использует ваш Java-код. Вы можете проверить, что у вас нет нескольких копий этих файлов: mydb.log, mydb.lck, mydb.properties и т.д. В вашей рабочей области. В случае, если ваш код Java создал эти файлы, местоположение зависит от того, как вы запускаете свою программу. Например, в проекте Maven внутри Netbeans файлы хранятся вместе с pom.xml.

Ответ 2

Если вы попробовали все другие ответы по этому вопросу, то, скорее всего, вы столкнулись с проблемой чувствительности к регистру.

По умолчанию HSQLDB чувствителен к регистру. Если вы не укажете двойные кавычки вокруг имени схемы или столбца или таблицы, то по умолчанию она будет конвертировать ее в верхний регистр. Если ваш объект был создан в верхнем регистре, вам повезло. Если он находится в нижнем регистре, вам придется окружить свое имя объекта двойными кавычками.

Например:

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

Чтобы выбрать из этой таблицы, вам нужно будет использовать следующий запрос

select "product_id" from "t1"

Ответ 3

Как сказано в предыдущем ответе, есть много возможных причин. Одним из них является то, что таблица не создана из-за несовместимости синтаксиса. Если используется определенный синтаксис поставщика БД или определенная возможность, 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, такого как array_agg для posgresql

Примечание: проблема возникает очень рано, когда код анализирует модель для создания схемы и затем скрывается во многих строках журналов, а затем происходит сбой кода unitTested с запутанным и непонятным исключением: "пользователю не хватает привилегии или ошибка объекта не найдена" что вовсе не указывает на реальную проблему. Поэтому обязательно прочитайте всю трассировку с самого начала и исправьте все возможные проблемы.

Ответ 4

У меня была ошибка user lacks privilege or object not found при попытке создать таблицу в пустой базе данных в памяти. Я использовал spring.datasource.schema, и проблема заключалась в том, что я пропустил точку с запятой в моем SQL файле после "CREATE TABLE" -Statement (за которым последовал "CREATE INDEX" ).

Ответ 5

У меня была похожая проблема с ошибкой ' 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> )

Ответ 6

При запуске сервера 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

Ответ 7

Я вставлял данные в hsql db используя следующий скрипт

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

У меня возникла проблема, связанная с тем, что объект Hello World не найден, а пользователю базы данных HSQL не хватает привилегии или объект не найден.

который я изменил в приведенный ниже скрипт

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

И сейчас все работает нормально.

Ответ 8

Недавно я столкнулся с такой же проблемой. Мы запускаем приложение Grails, и кто-то вставил SQL-скрипт в файл BootStrap (это точка входа для Grails). Этот сценарий должен был выполняться только в производственной среде, однако из-за плохой логики он также выполнялся в тесте. Итак, ошибка, которую я получил, была:

User lacks privilege or object not found:

без каких-либо дополнительных разъяснений...

Мне просто нужно было убедиться, что скрипт не был запущен в тестовой среде, и это исправило проблему для меня, хотя мне потребовалось 3 часа, чтобы понять это. Я знаю, что это очень, очень специфическая проблема, но все же, если я смогу сэкономить кому-то пару часов копания кода, это было бы здорово.

Ответ 9

У меня была такая же ошибка. В моем случае я забыл поставить apas в струнах.

Я делал String test = "inputTest";

Правильным является String test = "'inputTest'";

Произошла ошибка, когда я пытался положить что-то в базу данных

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

В моем случае просто поставьте кавычки ' чтобы исправить ошибку.

Ответ 10

В моем случае произошла ошибка, потому что я НЕ поместил TABLE_NAME в двойные кавычки "TABLE_NAME" и имел префикс схемы оракула.

Не работает:

SELECT * FROM FOOSCHEMA.BAR_TABLE

За работой:

SELECT * FROM "BAR_TABLE"

Ответ 11

была эта проблема с конкатенацией переменных в инструкции вставки. это сработало

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