NHibernate & oracle: ORA-01045

本文介绍了一个CRM系统中Oracle数据库权限管理的最佳实践。通过创建特定的角色和用户,限制了应用程序对数据库的操作权限,增强了系统的安全性。

原有的一个CRM系统,使用的是 oracle, NHibernate 在链接数据库时,采用了 oracle 的该应用的DBA作为链接用户,这对系统的安全非常非常的不好。

作为调整,为该应用创建了一个新的客户端用户,使其拥有最小权限。在这种复合权限的应用中,会产生很多的问题。在这里我们逐一列举。

ORACLE版本: 11g1

NHibernate: 2.1.2.4

.Net: 2.x/3.x/4.x

1. 创建应用用户角色

create role app_user_role not identified;

///对象的权限列表很长,此处简写了

grant select/delete/insert on app_dba.tables/sequence/function/procedure to app_user_role;

///

grant connect to app_user_role;

grant create session to app_user_role;


2. 创建应用用户,并附角色

create user app_user identified by 'app user password here'

default tablespace XXXX
temporary tablespace XXXXXX
profile default
account unlock;

grant app_user_role to app_user;


3. 尝试 app_user 登录

C:\Users\Administrator>sqlplus app_user@appdb

SQL*Plus: Release 11.1.0.6.0 - Production on 星期五 9月 2 12:18:48 2011

Copyright (c) 1982, 2007, Oracle.  All rights reserved.


输入口令:
ERROR:
ORA-01045: user APP_USER lacks CREATE SESSION privilege; logon denied

[说明]

上面的错误说明,connect, create session 被付给了角色 app_user_role, 而 app_user并没能从角色中获得这两个权限,所以我们需要重新设定权限:

revoke connect from app_user_role;
grant create session to app_user;

从命令行上,app_user 现在已经可以成功登录了.

为什么把权限 create session 赋给 app_user_role,然后把app_user_role再赋给app_user,却不起作用呢?这个问题可以参考 4. 启动应用程序.... ,他们是属于同一类型的问题:app_user_role必须作为用户的默认角色。

4. 启动应用程序,却得到了 ORA-00942: 表或视图不存在 的错误

可以在 sqlplus 中重现此问题:

SQL> connect app_user@appdb

SQL> select table_name from all_tables where owner='APP_ADMIN';

TABLE_NAME
------------------------------

SQL>

我们看到,app_user 确实看不到 app_admin 的表,这是怎么回事呢? 问题在 app_user_role 付给 app_user 后,还缺少一步:

alter user app_user default role app_user_role;
让 app_user 的默认权限角色是 app_user_role 很关键

我并不记得oracle8/9中是否必须这样设置了(那是很久以前的事了)


NHibernate.Exceptions.GenericADOException HResult=0x80131500 Message=could not insert: [Nebula.EAP.Core.Scenario.Models.CUST_UPH_NORMAL#Nebula.EAP.Core.Scenario.Models.CUST_UPH_NORMAL][SQL: INSERT INTO CUST_UPH_NORMAL (EVENT_TIME, NORMAL_UPH, USE_FLAG, STATE, EQP_CODE, WORK_STATION, MODEL_ID, DIE_PART, GRINDING_THINESS, BDCODE, BDVERSION, CUST_DEVICE) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)] Source=NHibernate StackTrace:NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessionImplementor session) 在 NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Object obj, ISessionImplementor session) 在 NHibernate.Action.EntityInsertAction.Execute() 在 NHibernate.Engine.ActionQueue.InnerExecute(IExecutable executable) 在 NHibernate.Engine.ActionQueue.ExecuteActions[T](List`1 list) 在 NHibernate.Engine.ActionQueue.ExecuteActions() 在 NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session) 在 NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event) 在 NHibernate.Impl.SessionImpl.Flush() 在 NHibernate.Impl.SessionImpl.BeforeTransactionCompletion(ITransaction tx) 在 NHibernate.Transaction.AdoTransaction.Commit() 在 Nebula.EAP.Core.Scenario.Dao.CommonDao.SaveNormalUph(EQP_SECS_CONFIG esc, CUST_UPH_NORMAL custUphNormal) 在 F:\ProgramNew\nebula.eap.core\Nebula.EAP.Core.Scenario\Dao\CommonDao.cs 中: 第 28491 行 此异常最初是在此调用堆栈中引发的: [外部代码] 内部异常 1: OracleException: ORA-01502: 索引 'FHEAP.CUST_UPH_NORMAL_PK' 或这类索引的分区处于不可用状态
最新发布
06-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值