2010-11-04 94 views
1

我正在使用Grails 1.3.4,它使用Hibernate,违背Oracle 11g数据库。我的应用程序无法在启动,并出现以下错误:使用Oracle 11g休眠(grails) - 权限不足

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) 

当我加入甲骨文以下到我的数据库用户角色,它的工作原理。然而,我的数据库管理员在生产环境中声明,他不会授予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; 

回答

1

Grails可能需要该权限来确定是否对未在架构中反映的域对象进行更改。

您是否需要grails自动更新生产模式?如果不是,请尝试删除生产环境的dbCreate = "update"

+0

是的,工作。我知道我不想要dbCreate = create或create-drop,但不知道如果你把它抛出去会发生什么。删除它可以防止Hibernate对数据库模式做任何事情。在Grails in Action中找到了一个很好的解释,第15.3.1节为那些“手动”处理数据库更改的人做了一个很好的解释。 – snowmanjack 2010-11-05 12:50:01