itsource

HSQL 데이터베이스 사용자에게 권한이 없거나 개체를 찾을 수 없음 오류가 발생했습니다.

mycopycode 2023. 10. 29. 19:42
반응형

HSQL 데이터베이스 사용자에게 권한이 없거나 개체를 찾을 수 없음 오류가 발생했습니다.

저는 spring application에서 hsqldb-2.3.4를 사용하여 연결하려고 합니다.

다음 세부 정보를 사용하여 데이터베이스를 작성했습니다.

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

"MYDB" 스키마로 ALBUM이라는 테이블을 만들었습니다.

스프링 구성 파일에서:

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

hsqldbit의 SQL 에디터를 통해 동일한 쿼리를 실행하면 잘 실행됩니다.이것 좀 도와주시겠습니까?

이전 응답에서 말한 것처럼 여러 가지 가능한 원인이 있습니다.그 중 하나는 구문이 호환되지 않아 테이블이 생성되지 않는다는 것입니다.특정 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=동면 스키마 생성을 사용하지 않고 SQL 스크립트를 사용하는 사람들은 스크립트에서 이러한 종류의 구문을 사용해야 합니다.

SET DATABASE SQL SYNTAX ORA TRUE;

또한 SQL 요청의 공급업체별 구문(: array_agg for posgresql)으로 인한 문제도 해결합니다.

참고 : 코드가 모델을 구문 분석하여 스키마를 만든 다음 많은 로그 행에 숨겨져 있을 때 문제가 발생합니다. 그런 다음 unitTested 코드가 혼동되고 불분명한 예외 "user lanks privilege or object not found error"와 함께 충돌하여 실제 문제를 전혀 지적하지 않습니다.그래서 모든 흔적을 처음부터 읽고 가능한 모든 문제를 해결해야 합니다.

이 질문에 대한 다른 모든 답변을 시도해 본 경우 대소문자 구분 문제에 직면했을 가능성이 높습니다.

HSQLDB는 기본적으로 대소문자를 구분합니다.스키마 또는 열 또는 테이블 이름 주위에 큰따옴표를 지정하지 않으면 기본적으로 대문자로 변환됩니다.개체가 대문자로 작성되었다면 운이 좋은 것입니다.소문자일 경우 개체 이름을 큰따옴표로 둘러싸야 합니다.

예를 들어,

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

이 표에서 선택하려면 다음 쿼리를 사용해야 합니다.

select "product_id" from "t1"

user lacks privilege or object not found여러 가지 원인이 있을 수 있습니다. 가장 분명한 것은 존재하지 않는 테이블에 액세스한다는 것입니다.코드를 실행할 때 파일 데이터베이스 URL에 대한 연결이 실제로 DB를 만들 수 있다는 점이 덜 명확한 이유입니다.HSQL Database Manager를 사용하여 DB를 설정하고 테이블과 행을 추가하는 경우가 발생할 수 있지만 Java 코드가 사용하는 특정 인스턴스는 아닙니다.다음 파일의 복사본이 여러 개가 없는지 확인할 수 있습니다.mydb.log,mydb.lck,mydb.properties, 작업 공간에 설치할 수 있습니다.Java 코드가 이러한 파일을 만든 경우 프로그램을 실행하는 방법에 따라 위치가 달라집니다.예를 들어 Netbeans 내부에서 실행되는 메이븐 프로젝트에서 파일은 pom.xml과 함께 저장됩니다.

실수를 했습니다.user lacks privilege or object not found빈 인메모리 데이터베이스에 테이블을 만들려는 중입니다.사용했습니다.spring.datasource.schema문제는 "CREATE TABLE"-Statement("CREATE INDEX" 뒤에 SQL 파일의 세미콜론이 누락되었다는 것입니다.

오류와 비슷한 문제가 있었습니다.'org.hsqldb.HsqlException: user lacks privilege or object not found: DAYS_BETWEEN' 알고보니DAYS_BETWEENhsqldb에서 함수로 인식되지 않습니다.대신 DATEIFF를 사용합니다.

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

다음 스크립트를 이용하여 hsql db에 데이터를 삽입하고 있었습니다.

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

Hello World 개체를 찾을 수 없으며 HSQL 데이터베이스 사용자에게 권한이 없거나 개체를 찾을 수 없음 오류와 관련된 문제가 발생했습니다.

나는 아래 대본으로 바꿨습니다.

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

그리고 지금은 잘 작동하고 있습니다.

HSWLDB 서버를 실행할 때.예를 들어 java config 파일은 다음과 같습니다.

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

당신의 세트가 a인지 확인하기 위해 체크하세요.server.dbname.#를 들어 예를 들어 my server.properties 파일:

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

다음 두 가지 속성을 추가합니다.

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

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

저는 최근에 같은 문제에 부딪쳤습니다.우리는 grails 애플리케이션을 실행하고 있는데 누군가가 BootStrap 파일에 SQL 스크립트를 삽입했습니다(그것이 grail의 진입점입니다).이 스크립트는 프로덕션 환경에서만 실행되도록 되어 있었지만 논리가 좋지 않아 테스트에서도 실행되고 있었습니다.그래서 제가 받은 오류는 다음과 같습니다.

User lacks privilege or object not found:

더 이상의 설명도 없이...

테스트 환경에서 스크립트가 실행되지 않는지 확인해야 했고 그것이 문제를 해결해 주었지만 3시간이 걸렸습니다.그것이 매우, 매우 구체적인 문제라는 것을 알고 있지만 여전히 몇 시간 동안 코드를 캐는 사람을 구할 수 있다면 좋을 것입니다.

저도 같은 실수를 하고 있었습니다.제 경우에는 아파스를 현에 넣는 것을 잊어버리고 있었습니다.

하고 있었습니다.String test = "inputTest";

은 입니다.String test = "'inputTest'";

데이터베이스에 무엇인가를 넣으려고 할 때 오류가 발생했습니다.

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

저 같은 경우는 따옴표만 붙여주세요.'오류를 수정합니다.

제 경우에는 TABLE_NAME을 큰따옴표 "TABLE_NAME"에 넣지 않고 오라클 스키마 접두사가 있어서 오류가 발생했습니다.

작동하지 않음:

SELECT * FROM FOOSCHEMA.BAR_TABLE

작업:

SELECT * FROM "BAR_TABLE"

삽입 문에 변수를 연결할 때 이 문제가 발생했습니다.효과가 있었습니다.

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

저의 경우 다음 줄의 부재로 인해 문제가 발생했습니다(실수로 코멘트를 했습니다).persistence.xml:

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

필요한 스키마 요소를 만들기 위해 동면 상태에서 DDL을 내보내지 못했습니다...

(서로 다른 Hibernate 포장지에는 속성을 지정하는 메커니즘이 다릅니다. 여기서는 JPA를 사용합니다.)

Intellij IDEA 데이터베이스(데이터베이스) 속성에서 "경로" 필드를 지정하지 않고 응용 프로그램을 실행하려고 하다가 이 오류가 발생했습니다.다른 것들은 모두 올바르게 구성되었습니다.

IDEA 데이터베이스 콘솔에서 스크립트를 실행할 수 있었고 스크립트는 올바르게 실행되었지만 IDEA에 대한 경로를 제공하지 않아 연결할 위치를 확인할 수 없어 오류가 발생했습니다.

데이터베이스를 서버 모드로 실행하고 연결해야 합니다.그렇지 않으면 외부 응용 프로그램에서 연결되지 않으며 사용자 권한 부족과 유사한 오류가 발생합니다.또한 서버 모드에서 DB를 실행할 때 스프링 구성 파일에서 데이터베이스의 URL을 적절히 변경합니다.

서버 모드 $java -cp lib/hsqldb.jar org.hsqldb.server에서 DB를 실행하기 위한 샘플 명령입니다.서버 --database.0 파일:data/mydb --dbname.0시험

구성 파일의 URL 형식 jdbc:hsqldb:hsqldb://localhost/Test

제 경우에는 열 중 하나에 @Column(이름 = "key") 주석이 누락된 'key'라는 이름이 있어서 로그에서 테이블을 만든 쿼리를 볼 수 있었지만 실제로는 없었습니다.그래서 열 이름을 조심해야 합니다.

무슨 가치가 있건 간에, 저도 똑같은 문제를 가지고 있었습니다.제가 'XTYPE'으로 이름을 바꾼 'TYPE'이라는 컬럼과 'XORDER'로 이름을 바꾼 'ORDER'라는 컬럼이 있었는데 문제가 사라졌습니다.

그러나 철자가 틀린 필드 이름이 또 다른 이유일 수 있습니다.실제 테이블에 albumid라는 ID 열이 있고 album_id를 사용한 경우에도 이 문제가 발생할 수 있습니다.

또 다른 답변자가 언급한 것처럼, 필드 이름의 경우 차이도 주의할 필요가 있습니다.

동일한 문제에 직면하여 하나 이상의 지속성 유닛(ReadOnly 및 ReadWrite)이 있다는 것을 발견했습니다. 따라서 하나의 지속성 유닛의 스키마를 사용하여 생성된 HSQLDDB의 테이블은 다른 지속성 유닛에서 액세스할 때 예외(HSQL 데이터베이스 사용자에게 권한이 없거나 개체를 찾을 수 없음 오류)가 발생했습니다.JPA의 한 세션에서 테이블을 만들고 다른 세션에서 액세스할 때 발생합니다.

내 경우에는 테이블이MY_TABLE스키마에 있었습니다.SOME_SCHEMA. 선택/삽입 등을 직접 호출하는 것은 효과가 없었습니다.수정 방법:

  1. 파일 추가schema.sqlresources폴더
  2. 이 파일에 줄을 추가합니다.CREATE SCHEMA YOUR_SCHEMA_NAME;

같은 문제가 있었습니다.데이터베이스를 설정할 때 나의 경우.

SQL 클라이언트를 통해 데이터베이스를 만든 경우 생성에 성공했지만 Java에서 동일한 SQL DDL을 생성하려고 하면 이상한 오류가 발생하여 도움이 되지 않습니다.

SQL DDL 문을 별도의 CREATE 문으로 분할하기로 하고 이를 실행했습니다.이제 모든 표와 지수는 아무런 문제 없이 만들어졌습니다.

그건 그렇고, 내가 executeUpdate(DDL)를 사용하든, executeUpdate(DDL)를 사용하든 상관없습니다.둘 다 동일한 오류 메시지와 함께 실패합니다. 내가 그 문장들을 분할하지 않는 한 말이죠.

문을 여러 개 삽입하면 문제없이 작동합니다.저는 이 일관성 없는 행동을 이해할 수 없습니다.

언급URL : https://stackoverflow.com/questions/38415734/hsql-database-user-lacks-privilege-or-object-not-found-error

반응형