L'utilisateur de la base de données HSQL n'a pas de privilège ou l'objet n'a pas trouvé d'erreur

je suis en train d'utiliser hsqldb-2.3.4 pour se connecter à partir de L'application du ressort.

j'ai créé la base de données en utilisant les détails suivants

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

j'ai créé une table nommée ALBUM sous le schéma "MYDB"

dans le fichier de configuration du printemps:

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

Et dans mon printemps contrôleur je fais jdbcTemplate.query("SELECT * FROM MYDB.ALBUM", new AlbumRowMapper());

Et Il me donne de l'exception:

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)

si j'exécute la même requête via L'éditeur SQL de hsqldb il s'exécute bien. Pouvez vous s'il vous plaît m'aider avec cela.

15
demandé sur Rae Burawes 2016-07-17 00:19:31

6 réponses

user lacks privilege or object not found peut avoir plusieurs causes, la plus évidente étant que vous accédez à une table qui n'existe pas. Une raison moins évidente est que, lorsque vous exécutez votre code, la connexion à une URL de base de données de fichiers peut en fait créer une base de données. Le scénario que vous rencontrez pourrait être que vous avez mis en place une base de données en utilisant le Gestionnaire de base de données HSQL, ajouté des tables et des lignes, mais ce n'est pas cette instance spécifique que votre code Java utilise. Vous voudrez peut-être vérifier que vous n'avez pas plusieurs copies de ces fichiers: mydb.log, mydb.lck, mydb.properties, etc dans votre espace de travail. Dans le cas où votre code Java n'créer ces fichiers, l'emplacement dépend de la façon dont vous exécutez votre programme. Dans un projet Maven exécuté à L'intérieur de Netbeans par exemple, les fichiers sont stockés à côté du pom.XML.

8
répondu Arthur Noseda 2016-07-16 22:39:06

si vous avez essayé toutes les autres réponses à cette question, alors il est très probable que vous êtes confrontés à un problème de sensibilité.

HSQLDB est sensible à la casse par défaut. Si vous ne spécifiez pas les guillemets doubles autour du nom d'un schéma ou d'une colonne ou d'une table, alors il convertira par défaut en majuscules. Si votre objet a été créé en majuscules, alors vous avez de la chance. Si il est en minuscules, alors vous devez entourer votre nom d'objet avec double citation.

Par exemple:

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

Pour sélectionner à partir de ce tableau, vous devrez utiliser la requête suivante

select "product_id" from "t1"
3
répondu Nerrve 2017-12-11 08:27:28

j'ai eu l'erreur user lacks privilege or object not found en essayant de créer une table dans une base de données vide en mémoire. J'ai utilisé spring.datasource.schema et le problème est que j'ai manqué un point-virgule dans mon fichier SQL après la déclaration "CREATE TABLE"(qui a été suivi par "CREATE INDEX").

1
répondu Arigion 2017-11-10 07:33:49

j'ai eu le même problème avec le message d'erreur 'org.hsqldb.HsqlException: user lacks privilege or object not found: DAYS_BETWEEN' s'est avéré DAYS_BETWEEN n'est pas reconnu par hsqldb comme une fonction. utilisez plutôt DATEDIFF.

DATEDIFF ( <datetime value expr 1>, <datetime value expr 2> )
0
répondu Nirmal Mangal 2018-06-10 16:15:41

comme il a été dit dans une réponse précédente, il y a de nombreuses causes possibles. L'un d'eux est que la table n'est pas créée à cause d'une incompatibilité de syntaxe. si la syntaxe spécifique du fournisseur DB ou la capacité spécifique est utilisée, HSQLDB ne la reconnaîtra pas. Alors que le code de création est exécuté, vous pouvez voir que la table n'est pas créée pour cette raison de syntaxe. Par exemple, si l'entité est annotée avec @column("texte") la création de la table échouera.

il y a un travail autour de et que dire de HSQLDB pour être dans un mode compatible pour pgsl vous devez ajouter votre url de connexion avec

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

et mysql

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

oracle

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

notez qu'il existe des variantes selon votre configuration il pourrait être la hibernate.connection.url= ou spring.datasource.url= pour ceux qui n'utilisent pas la création du schéma d'hibernation mais un script SQL vous devriez utiliser ce genre de syntaxe dans votre script

SET DATABASE SQL SYNTAX ORA TRUE;

il corrigera également les problèmes dus à la syntaxe spécifique au fournisseur dans la requête SQL tels que array_agg posgresql

Nota: le problème se produit très tôt lorsque le code analyse le modèle pour créer le schéma et est ensuite caché dans de nombreuses lignes de logs, puis le code crash non-testé avec une exception confuse et obscure "l'utilisateur manque de privilège ou l'objet n'a pas trouvé d'erreur" qui ne pointe pas le vrai problème à tout. Assurez-vous de lire toutes les traces de début et de résoudre tous les problèmes possibles

0
répondu Damien MIRAS 2018-07-17 09:01:25

lors de l'exécution d'un serveur HSWLDB. par exemple, votre fichier de configuration java a:

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

vérifiez que votre jeu a server.dbname.#. par exemple, mon serveur.fichier de propriétés:

    server.database.0=eventsdb 
    server.dbname.0=eventsdb 
    server.port=9005
0
répondu LCM 2018-08-27 00:44:22