J'utilise Grails 1.3.4, qui utilise Hibernate, par rapport à une base de données Oracle 11g. Mon application échoue au démarrage, avec l'erreur suivante:hibernate (grails) avec Oracle 11g - privilèges insuffisants
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)
Quand j'ajoute ce qui suit dans Oracle à mon rôle d'utilisateur de base de données, cela fonctionne. Cependant, mon état de DBA dans la production, il n'accordera pas ANALYZE ALL parce que ce n'est plus nécessaire dans 11G, et cela gâche ses statistiques. Quelle est la résolution?
GRANT ANALYZE ANY to APP_USER_ROLE;
Plus d'infos sur la configuration ci-dessous:
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 objet de domaine en utilisant la table:
static mapping = {
table 'MY_TABLE'
id generator:'sequence',params:[sequence:'MY_SEQ']
}
utilisateur Oracle et configuration rôle:
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;
Oui, cela a fonctionné. Je savais que je ne voulais pas dbCreate = create ou create-drop, mais je ne savais pas ce qu'il se passerait si on ne le laissait pas. La suppression empêche Hibernate de faire quoi que ce soit dans le schéma de la base de données. Trouvé une bonne explication dans Grails in Action, section 15.3.1, pour ceux gérant les changements de base de données "manuellement". – snowmanjack