hibernate (grails) с Oracle 11g - недостаточные привилегии

Я использую Grails 1.3.4, который использует Hibernate, работая с базой данных Oracle 11g. Мое приложение завершается сбоем при запуске со следующей ошибкой:

2010-11-04 09:45:34,671 INFO  [grails.spring.BeanBuilder] [RuntimeConfiguration] Configuring data source for environment: TEST 
2010-11-04 09:45:36,812 ERROR [org.hibernate.util.JDBCExceptionReporter] ORA-01031: insufficient privileges

2010-11-04 09:45:36,812 ERROR [org.hibernate.tool.hbm2ddl.SchemaUpdate] could not complete schema update 
org.hibernate.exception.SQLGrammarException: could not get table metadata: MY_TABLE
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)

Когда я добавляю следующее в Oracle к моей роли пользователя базы данных, это работает. Тем не менее, мой администратор баз данных заявляет в Production, что он не предоставит ANALYZE ALL, потому что это больше не нужно в 11G, и это искажает его статистику. Какое разрешение?

GRANT ANALYZE ANY to APP_USER_ROLE;

Дополнительная информация по настройке ниже:

Grails DataSource.groovy

    dataSource {
        driverClassName = "oracle.jdbc.driver.OracleDriver"
        username = "APP_USER"
        password = "APP_USER_PASS"
        dbCreate = "update"
        url = "jdbc:oracle:thin:@MY_servername:1521:MY_SCHEMANAME"
        dialect="org.hibernate.dialect.Oracle10gDialect"
    }    
    hibernate {
        default_schema="WEBSYS"
    }

Объект домена Grails с использованием таблицы:

static mapping = {
    table 'MY_TABLE'
    id generator:'sequence',params:[sequence:'MY_SEQ']
}

Настройка пользователя и роли Oracle:

CREATE ROLE APP_USER_ROLE NOT IDENTIFIED;
GRANT QUERY REWRITE TO APP_USER_ROLE;
GRANT CREATE SESSION TO APP_USER_ROLE;
GRANT GLOBAL QUERY REWRITE TO APP_USER_ROLE;
GRANT APP_USER_ROLE TO APP_USER;
CREATE USER APP_USER
  IDENTIFIED BY APP_USER_PASS
  DEFAULT TABLESPACE APPL_DATA
  TEMPORARY TABLESPACE TEMP
  PROFILE DEFAULT
  ACCOUNT UNLOCK;
  GRANT APP_USER_ROLE TO APP_USER;
  ALTER USER APP_USER DEFAULT ROLE ALL;
  ALTER USER APP_USER QUOTA UNLIMITED ON APPL_DATA;

  GRANT SELECT,UPDATE,DELETE,INSERT ON MYSCHEMA.MY_TABLE to APP_USER_ROLE;
  GRANT SELECT ON MYSCHEMA.MY_SEQ to APP_USER_ROLE;

person snowmanjack    schedule 04.11.2010    source источник


Ответы (1)


Grails, вероятно, требуется это разрешение, чтобы определить, были ли внесены изменения в объекты домена, которые не отражены в схеме.

Нужен ли вам Grails для автоматического обновления производственной схемы? Если нет, попробуйте удалить dbCreate = "update" для рабочей среды.

person ataylor    schedule 04.11.2010
comment
Да, это сработало. Я знал, что не хочу использовать dbCreate=create или create-drop, но не знал, что произойдет, если вы просто пропустите это. Его удаление не позволяет Hibernate что-либо делать со схемой базы данных. Нашел хорошее объяснение в Grails в действии, раздел 15.3.1, для тех, кто обрабатывает изменения базы данных вручную. - person snowmanjack; 05.11.2010