求助:怎样利用procedu或者function改变用户身份?

[复制链接]
查看11 | 回复9 | 2012-5-15 15:24:11 | 显示全部楼层 |阅读模式
我想先用一个通用的帐户commonuser连到Oracle。然后通过执行一个存储过程或者function来改变当前的用户身份(就是说在存储过程或者函数中写这个connect sys/password,语法怎么写)。
请问能不能实现?
当存储过程、函数执行完毕的时候我还能不能保持sys的用户身份?
回复

使用道具 举报

千问 | 2012-5-15 15:24:11 | 显示全部楼层
的用意是什么?
不能通过授权实现么?
回复

使用道具 举报

千问 | 2012-5-15 15:24:11 | 显示全部楼层
其实我的用意是这样的。
我的所有应用都是通过一个叫appdev的用户连接到Oracle的。但是我不想让除了我以外的所有人使用或者知道有这个用户存在,就是完全屏蔽appdev这个用户(只能通过应用来使用appdev,不想开发人员知道这个用户的存在,不想让任何人通过appdev用sqlplus等登陆Oracle)。
我的思路是这样的:
1:所有的应用通过pub这个通用的帐户用户连接到Oracle上。(应用的种类很多。包括JDBC,ODBC,OCI,PROC等方式)
2:pub这个用户没有权限访问appdev用户下的任何对象。pub用户下有一个userinfo表,包括两个字段username=appdev,password=appdev(当然字段都是加密的)。pub下还有一个函数function(当然内容也是加密的)叫做myconnect。我想通过这个myconnect函数来改变当前的用户身份pub---------->appdev,这样就可以访问我应用所有的表。
3:myconnect函数中判断用户客户端的类型如果是应用就允许连接,如果是sqlplus等就拒绝。
(可能通过程序的名称来实现此功能,因为我的应用连接方式比较多,而且屏蔽的东西也多,像sqlplus/pl/sql developer/tod/pb等,所以这个方法不是很好,希望各位提供更好的方法!)
我开始也考虑把这个功能封装到*.dll或者*.o/*.a中来让开发人员调用,但是应用有windows C++的,有java的,有unix下的,所以可能比较繁琐,所以就想出这个办法,我知道不是太好,希望各位提供更好的实现方法,谢谢!
回复

使用道具 举报

千问 | 2012-5-15 15:24:11 | 显示全部楼层
请各位各抒己见,谢谢!
回复

使用道具 举报

千问 | 2012-5-15 15:24:11 | 显示全部楼层
As I understand it, what you want to achieve is to restrict end user to access database only through one specific application, such as Forms, they are not allowed to enter database using anything else.
How about defining a log on trigger to act as gate keeper?
回复

使用道具 举报

千问 | 2012-5-15 15:24:11 | 显示全部楼层
这个论坛出的书好象谈到,运行一个以DBMS开头的什么包就可以转换用户名。
回复

使用道具 举报

千问 | 2012-5-15 15:24:11 | 显示全部楼层
你的意思就是避免让开发人员直接来连接并且操作你的对象用户appdev,其实你没有必要这么做,一般我们在开发Oracle程序的时候,为了不让开发人员和其他的人员DDL用户的表,一般是通过建立公共的同义词来实现的;
1。建立用户appdev,DBA在appdev下面建立应用中所有的对象
2.给appdev用户建立和表名一样的公共同义词。
3.DBA建立开发人员和其他人员连接的用户pub
4.将appdev下所有对象的DML(select,insert,delete,update)权限赋予pub
5.告诉开发人员和其他人员pub的密码,让他们连接到pub对appdev下的对象进行DML操作
这样做的好处是:PUB开发人员只能对appdev下的对象进行DML操作,但是不能进行DDL操作
回复

使用道具 举报

千问 | 2012-5-15 15:24:11 | 显示全部楼层
No, restriction only on DDL is far from enough.
What if a developer deletes some rows of a table via TOAD which relies on the application to enforce the consistency to another table based on certain business rule?
What if a power user intends to select the content of a table via SQL*Plus
which are accessed in application only by another business user in another department?
回复

使用道具 举报

千问 | 2012-5-15 15:24:11 | 显示全部楼层
最初由 rchsh 发布
[B]你的意思就是避免让开发人员直接来连接并且操作你的对象用户appdev,其实你没有必要这么做,一般我们在开发Oracle程序的时候,为了不让开发人员和其他的人员DDL用户的表,一般是通过建立公共的同义词来实现的;
1。建立用户appdev,DBA在appdev下面建立应用中所有的对象
2.给appdev用户建立和表名一样的公共同义词。
3.DBA建立开发人员和其他人员连接的用户pub
4.将appdev下所有对象的DML(select,insert,delete,update)权限赋予pub
5.告诉开发人员和其他人员pub的密码,让他们连接到pub对appdev下的对象进行DML操作
这样做的好处是:PUB开发人员只能对appdev下的对象进行DML操作,但是不能进行DDL操作 [/B]


我的意思不止是屏蔽开发人员操作DML,我是要屏蔽整个用户appdev
回复

使用道具 举报

千问 | 2012-5-15 15:24:11 | 显示全部楼层
最初由 lazyoracle 发布
[B]As I understand it, what you want to achieve is to restrict end user to access database only through one specific application, such as Forms, they are not allowed to enter database using anything else.
How about defining a log on trigger to act as gate keeper? [/B]

能不能说得详细点?怎么as gate keeper
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行