2011-03-04 60 views
2

首先,对不起我的英文。在NHibernate中执行Oracle PL/SQL存储过程

我现在正在创建Oracle数据库,其中所有的DML打包到存储过程中(例如,客户端不能直接执行“INSERT ONTO Articles(...”,它必须调用SP“ArticleInsert()”) 。数据库也有它自己的安全系统 - 特殊的表,比如“Users”,“Privileges”,“Users_Privileges”。当建立到数据库的连接时,我必须执行特殊的存储过程才能“登录系统” ,例如“登录(database_user,user_password)”。在这个数据库“知道”后,我是谁,并且知道我的权限

我计划在C#中使用NHibernate编写客户端应用程序,但是这个ORM用于每个新对象修改使用来自池的新数据库连接。因此,当我写 cl屁股“文章”和suhib标准的NHib DML行为(“INSERT/UPDATE/DELETE”将被执行适当的存储过程所取代),当NHibernate调用新的db连接时,如何执行“Login(database_user,user_password)”池?

或者如何解决这些任务?


感谢

回答

0

我想你重新发明轮子了一下。 Oracle允许像任何RDBMS一样记录访问的粒度,并且比您可能需要的更多。你为什么不使用这种能力来布置数据权限?

无论如何,对于CRUD操作,是的,您可以通过指定插入,更新和删除操作的存储过程来覆盖NHibernate的默认SQL生成。查询必须符合NH的条款;通过调用一个检索存储过程来强制延迟加载对象的每个字段和子对象,从而绕过90%的NHibernate强大功能。因此,您至少需要重新设计安全性,以根据需要为模式/表上的已验证用户授予SELECT权限。

+0

我认为在严格的Oracle DBA只允许应用程序运行少量存储的情况下,他有插入/更新/删除的要点,因为我完全同意你的选择,我会让NH执行它,它做得很好: ) – 2011-03-04 17:50:05

+0

当然,SELECT操作将使用标准的NHibernate方法执行,而不是通过SP。存储过程仅适用于CREATE/UPDATE/DELETE。 – JSP 2011-03-04 18:57:22

0

这不是第一个轮子,因为缺乏知识我正在重塑,:)。

我们假设,我们为某个组织实施人力资源管理系统。该组织由一组部门组成,其中有自己的子部门等。因此,我们具有层次结构,每个部门至少有三个属性: - ID - PARENT_ID(上级部门的ID) - NAME

例如,我们有SP数据库 - DeptChangeName(ID, NewName),我们希望一个数据库用户只能更改ID为112的部门及其子项的名称,其他用户只能更改ID为34的部门的名称,并且它是子项。所以,特权 - 不仅是“执行DeptChangeName”,而且还有“执行ID = 112的DeptChangeName或它的子项”。

另一个例子 - 用户“Xxx”可以在ID = 112下创建具有不确定深度的新子分类。

如果这些情况可以通过Oracle手段解决,而没有“手工制作的风轮”,您能给我一个适当的链接或短语的谷歌?