2010-11-04 34 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