복붙노트

[SPRING] HSQL 데이터베이스 사용자가 권한이 없거나 객체를 찾을 수 없음 오류

SPRING

HSQL 데이터베이스 사용자가 권한이 없거나 객체를 찾을 수 없음 오류

Spring 애플리케이션에서 연결하기 위해 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)

hsqldb의 SQL 편집기를 통해 동일한 쿼리를 실행하면 정상적으로 실행됩니다. 이걸 좀 도와 주실 래요?

해결법

  1. ==============================

    1.사용자가 권한이 없거나 찾을 수없는 개체가 여러 원인을 가질 수 있습니다. 존재하지 않는 테이블에 액세스하는 것이 가장 확실합니다. 덜 명백한 이유는 코드를 실행할 때 파일 데이터베이스 URL에 대한 연결이 실제로 DB를 만들 수 있다는 것입니다. 시나리오에서 HSQL 데이터베이스 관리자를 사용하여 DB를 설정하고 테이블과 행을 추가했는데 Java 코드가 사용하는 특정 인스턴스가 아닌 것 같습니다. 작업 공간에 mydb.log, mydb.lck, mydb.properties 등 여러 개의 파일 사본이 없는지 확인하고 싶을 수 있습니다. Java 코드가 이러한 파일을 작성한 경우 위치는 프로그램 실행 방법에 따라 다릅니다. 예를 들어 Netbeans에서 실행되는 Maven 프로젝트에서 파일은 pom.xml과 함께 저장됩니다.

    사용자가 권한이 없거나 찾을 수없는 개체가 여러 원인을 가질 수 있습니다. 존재하지 않는 테이블에 액세스하는 것이 가장 확실합니다. 덜 명백한 이유는 코드를 실행할 때 파일 데이터베이스 URL에 대한 연결이 실제로 DB를 만들 수 있다는 것입니다. 시나리오에서 HSQL 데이터베이스 관리자를 사용하여 DB를 설정하고 테이블과 행을 추가했는데 Java 코드가 사용하는 특정 인스턴스가 아닌 것 같습니다. 작업 공간에 mydb.log, mydb.lck, mydb.properties 등 여러 개의 파일 사본이 없는지 확인하고 싶을 수 있습니다. Java 코드가 이러한 파일을 작성한 경우 위치는 프로그램 실행 방법에 따라 다릅니다. 예를 들어 Netbeans에서 실행되는 Maven 프로젝트에서 파일은 pom.xml과 함께 저장됩니다.

  2. ==============================

    2.이 질문에 대한 다른 답변을 모두 시도한 경우 대소 문자를 구분할 가능성이 높습니다.

    이 질문에 대한 다른 답변을 모두 시도한 경우 대소 문자를 구분할 가능성이 높습니다.

    HSQLDB는 기본적으로 대소 문자를 구분합니다. 스키마 나 컬럼 또는 테이블 이름 주위에 큰 따옴표를 지정하지 않으면 기본적으로이를 대문자로 변환합니다. 오브젝트가 대문자로 작성 되었다면 행운입니다. 소문자이면 오브젝트 이름을 큰 따옴표로 묶어야합니다.

    예 :

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

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

    select "product_id" from "t1"
    
  3. ==============================

    3.비어있는 메모리 데이터베이스에 테이블을 만들려고 시도하는 동안 사용자에게 권한이 없거나 개체를 찾을 수 없다는 오류가 발생했습니다. spring.datasource.schema를 사용했는데 "CREATE TABLE"문법 (CREATE INDEX이 뒤따라 옴) 뒤에 SQL 파일의 세미콜론을 놓쳤다는 것이 문제였습니다.

    비어있는 메모리 데이터베이스에 테이블을 만들려고 시도하는 동안 사용자에게 권한이 없거나 개체를 찾을 수 없다는 오류가 발생했습니다. spring.datasource.schema를 사용했는데 "CREATE TABLE"문법 (CREATE INDEX이 뒤따라 옴) 뒤에 SQL 파일의 세미콜론을 놓쳤다는 것이 문제였습니다.

  4. ==============================

    4.'org.hsqldb.HsqlException : 사용자 권한이 없거나 개체를 찾을 수 없음 : DAYS_BETWEEN'오류가 발생하여 비슷한 문제가 발생했습니다. DAYS_BETWEEN이 hsqldb에 의해 함수로 인식되지 않습니다. 대신 DATEDIFF를 사용하십시오.

    'org.hsqldb.HsqlException : 사용자 권한이 없거나 개체를 찾을 수 없음 : DAYS_BETWEEN'오류가 발생하여 비슷한 문제가 발생했습니다. DAYS_BETWEEN이 hsqldb에 의해 함수로 인식되지 않습니다. 대신 DATEDIFF를 사용하십시오.

    DATEDIFF ( <datetime value expr 1>, <datetime value expr 2> )
    
  5. ==============================

    5.이전의 응답에서 말했듯이, 가능한 많은 원인이 있습니다. 그 중 하나는 구문 비 호환성 때문에 테이블이 만들어지지 않는다는 것입니다. 특정 DB 벤더 구문이나 특정 기능이 사용되면 HSQLDB는이를 인식하지 못합니다. 그런 다음 작성 코드가 실행되는 동안이 구문 이유로 테이블이 작성되지 않았 음을 알 수 있습니다. 예를 들어 엔티티에 @column ( "TEXT")가 표시되어 있으면 테이블 생성이 실패합니다.

    이전의 응답에서 말했듯이, 가능한 많은 원인이 있습니다. 그 중 하나는 구문 비 호환성 때문에 테이블이 만들어지지 않는다는 것입니다. 특정 DB 벤더 구문이나 특정 기능이 사용되면 HSQLDB는이를 인식하지 못합니다. 그런 다음 작성 코드가 실행되는 동안이 구문 이유로 테이블이 작성되지 않았 음을 알 수 있습니다. 예를 들어 엔티티에 @column ( "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;
    

    또한 posgresql에 대한 array_agg와 같은 SQL 요청의 공급 업체 특정 구문으로 인해 발생하는 문제를 해결합니다.

    주의 사항 : 코드가 모델을 구문 분석하여 스키마를 만든 다음 여러 줄의 로그에 숨겨져 있고 unitTested 코드가 혼란스럽고 애매한 예외로 인해 "사용자에게 권한이 없거나 개체를 찾을 수 없음 오류가 발생했습니다."라는 오류가 발생하면 문제가 발생합니다. 진짜 문제를 전혀 지적하지 않습니다. 따라서 처음부터 모든 추적을 읽고 가능한 모든 문제를 해결하십시오.

  6. ==============================

    6.HSWLDB 서버를 실행할 때. 예를 들어 자바 설정 파일은 다음과 같습니다.

    HSWLDB 서버를 실행할 때. 예를 들어 자바 설정 파일은 다음과 같습니다.

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

    set server.dbname. #을 확인하십시오. 예를 들어 내 server.properties 파일 :

        server.database.0=eventsdb 
        server.dbname.0=eventsdb 
        server.port=9005
    
  7. from https://stackoverflow.com/questions/38415734/hsql-database-user-lacks-privilege-or-object-not-found-error by cc-by-sa and MIT license