2010-11-04 4 views
1

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; 

Répondre

1

Grails a probablement besoin de cette autorisation pour déterminer si des modifications ont été apportées aux objets de domaine qui ne sont pas reflétés dans le schéma.

Avez-vous besoin de grails pour mettre à jour le schéma de production automatiquement? Si ce n'est pas le cas, essayez de supprimer dbCreate = "update" pour l'environnement de production.

+0

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

Questions connexes