webentwicklung-frage-antwort-db.com.de

Dem HSQL-Datenbankbenutzer fehlt der Privilegien- oder Objektfehler

Ich versuche, hsqldb-2.3.4 zu verwenden, um eine Verbindung mit Spring-Applikation herzustellen.

Ich habe eine Datenbank mit den folgenden Details erstellt

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

Ich habe eine Tabelle mit dem NamenALBUMunter dem Schema "MYDB" erstellt

Im Frühjahr Konfigurationsdatei:

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

Und in meinem Frühlingscontroller mache ich jdbcTemplate.query("SELECT * FROM MYDB.ALBUM", new AlbumRowMapper());

Und es gibt mir eine Ausnahme:

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)

Wenn ich dieselbe Abfrage durch den SQL-Editor von hsqldb ausführte, wird sie einwandfrei ausgeführt. Können Sie mir bitte dabei helfen?.

16
Raju Boddupalli

user lacks privilege or object not found kann mehrere Ursachen haben, die offensichtlichste ist, dass Sie auf eine Tabelle zugreifen, die nicht vorhanden ist. Ein weniger offensichtlicher Grund ist, dass die Verbindung zu einer Dateidatenbank-URL beim Ausführen des Codes tatsächlich eine Datenbank erstellen kann. Das Szenario, in dem Sie sich befinden, besteht möglicherweise darin, dass Sie eine Datenbank mit HSQL Database Manager eingerichtet und Tabellen und Zeilen hinzugefügt haben. Es ist jedoch nicht diese spezielle Instanz, die Ihr Java-Code verwendet. Sie können überprüfen, ob Sie nicht mehrere Kopien dieser Dateien haben: mydb.log, mydb.lck, mydb.properties usw. in Ihrem Arbeitsbereich. Falls Ihr Java-Code diese Dateien erstellt hat, hängt der Speicherort davon ab, wie Sie Ihr Programm ausführen. In einem Maven-Projekt, das beispielsweise in Netbeans ausgeführt wird, werden die Dateien neben der Datei pom.xml gespeichert.

8
Arthur Noseda

Wenn Sie alle anderen Antworten zu dieser Frage ausprobiert haben, ist es höchst wahrscheinlich, dass Sie ein Problem mit der Groß- und Kleinschreibung haben.

HSQLDB unterscheidet standardmäßig zwischen Groß- und Kleinschreibung. Wenn Sie den Namen eines Schemas, einer Spalte oder einer Tabelle nicht in doppelte Anführungszeichen setzen, wird dies standardmäßig in Großbuchstaben konvertiert. Wenn Ihr Objekt in Großbuchstaben erstellt wurde, haben Sie Glück. Wenn es in Kleinbuchstaben ist, müssen Sie Ihren Objektnamen in doppelte Anführungszeichen setzen.

Zum Beispiel:

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

Um aus dieser Tabelle auszuwählen, müssen Sie die folgende Abfrage verwenden

select "product_id" from "t1"
4
Nerrve

Wie in einer früheren Antwort gesagt, gibt es viele mögliche Ursachen. Eine davon ist, dass die Tabelle aufgrund von Inkompatibilität mit der Syntax nicht erstellt wird. Wenn eine bestimmte DB-Anbietersyntax oder eine bestimmte Funktion verwendet wird, erkennt HSQLDB sie nicht . Während der Erstellungscode ausgeführt wird, können Sie sehen, dass die Tabelle aus diesem Syntaxgrund nicht erstellt wird. Wenn die Entität beispielsweise mit @column ("TEXT") gekennzeichnet ist, schlägt die Erstellung der Tabelle fehl.

Es gibt eine Problemumgehung , die HSQLDB mitteilt, sich in einem kompatiblen Modus zu befinden. Für pgsl sollten Sie Ihre Verbindungs-URL damit anhängen 

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

und für mysql with 

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

Oracle  

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

beachten Sie, dass abhängig von Ihrer Konfiguration eine Variante vorhanden ist Dies könnte hibernate.connection.url= oder spring.datasource.url= sein. Für diejenigen, die nicht die Erstellung des Hibernate-Schemas verwenden, aber ein SQL-Skript, sollten Sie diese Art von Syntax in Ihrem Skript verwenden

SET DATABASE SQL SYNTAX ORA TRUE;

Es behebt auch Probleme aufgrund herstellerspezifischer Syntax in SQL-Anforderungen wie array_agg for posgresql

Nota bene : Das Problem tritt sehr früh auf, wenn der Code das Modell analysiert, um das Schema zu erstellen und dann in vielen Protokollzeilen ausgeblendet ist. Dann stürzt der UnitTested-Code mit einer verwirrenden und obskuren Ausnahme ab, "der Benutzer hat keine Berechtigung oder kein Objekt Fehler nicht gefunden ", der das eigentliche Problem überhaupt nicht zeigt. Lesen Sie daher die gesamte Ablaufverfolgung von Anfang an und beheben Sie alle möglichen Probleme

1
Damien MIRAS

Ich hatte den Fehler user lacks privilege or object not found beim Versuch, eine Tabelle in einer leeren In-Memory-Datenbank zu erstellen .__ Ich verwendete spring.datasource.schema und das Problem war, dass ich nach der folgenden Anweisung "CREATE TABLE" ein Semikolon in meiner SQL-Datei verpasste durch "CREATE INDEX").

1
Arigion

Ich habe die Daten in hsql db mit folgendem Skript eingefügt 

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

Ich habe ein Problem im Zusammenhang mit dem Hello World - Objekt nicht gefunden und der HSQL-Datenbankbenutzer hat keine Berechtigung oder ein Objekt wurde nicht gefunden

was ich in das unten stehende Skript geändert habe 

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

Und jetzt funktioniert es gut.

0
cammando

Ich hatte den gleichen Fehler. In meinem Fall habe ich vergessen, die Apas in die Saiten zu stecken.

Ich habe getan String test = "inputTest";

Der richtige ist String test = "'inputTest'";

Der Fehler trat auf, als ich versuchte, etwas in die Datenbank einzufügen

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

In meinem Fall setzen Sie einfach die Anführungszeichen ', um den Fehler zu korrigieren.

0
Eduardo Mior

In meinem Fall trat der Fehler auf, weil ich den TABLE_NAME NICHT in doppelte Anführungszeichen "TABLE_NAME" setzte und das Oracle-Schema-Präfix hatte.

Funktioniert nicht:

SELECT * FROM FOOSCHEMA.BAR_TABLE

Arbeiten:

SELECT * FROM "BAR_TABLE"
0
R.S

hatte dieses Problem mit der Verkettung von Variablen in der insert-Anweisung. das hat funktioniert

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

Wenn Sie einen HSWLDB-Server ausführen. Ihre Java-Konfigurationsdatei hat zum Beispiel:

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

stellen Sie sicher, dass Sie einen server.dbname.# gesetzt haben. Zum Beispiel meine server.properties Datei:

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

Ich hatte ein ähnliches Problem mit dem Fehler "org.hsqldb.HsqlException: user lacks privilege or object not found: DAYS_BETWEEN". Es stellte sich heraus, dass DAYS_BETWEEN von hsqldb nicht als Funktion erkannt wird. Verwenden Sie stattdessen DATEDIFF.

DATEDIFF ( <datetime value expr 1>, <datetime value expr 2> )
0
Nirmal Mangal

Ich bin in letzter Zeit auf das gleiche Problem gestoßen. Wir führen eine Grails-Anwendung aus und jemand hat ein SQL-Skript in die Datei BootStrap (das ist der Einstiegspunkt für Grails) eingefügt. Dieses Skript sollte jedoch aufgrund von nur in der Produktionsumgebung ausgeführt werden schlechte Logik, es lief auch im Test. Also der Fehler, den ich bekam, war:

User lacks privilege or object not found:

ohne weitere klärung ...

Ich musste nur sicherstellen, dass das Skript nicht in der Testumgebung ausgeführt wurde, und es hat das Problem für mich behoben, obwohl ich 3 Stunden gebraucht habe, um es herauszufinden. Ich weiß, dass es ein sehr, sehr spezifisches Problem ist, aber wenn ich jemandem ein paar Stunden Code-Graben ersparen kann, wäre das großartig.

0