Chinaunix首页 | 论坛 | 博客
  • 博客访问: 92554818
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-04-12 13:49:53

   来源:31896    作者:LeeBolin

由于仅被授予sysoper/sysdba系统权限的用户才存在于密码文件中,所以当向某一用户授予或收回sysoper/sysdba系统权限时,他们的帐号也将相应地被加入到密码文件或从密码文件中删除。由此,向密码文件中增加或删除某一用户,实际上也就是对某一用户授予或收回sysoper/sysdba系统权限。

要进行此项授权操作,需使用sysdba权限(或internal帐号)连入数据库,且初始化参数remote_login_passwordfile的设置必须为exclusive。具体操作步骤如下:

创建相应的密码文件;

设置初始化参数remote_login_passwordfile=exclusive;

使用sysdba权限登录: connect sys/internal_user_passsword as sysdba;

启动数据库实例并打开数据库;

创建相应用户帐号,对其授权(包括sysoper和sysdba): 授予权限:grant sysdba to user_name;

收回权限:revoke sysdba from user_name;

现在这些用户可以以管理员身份登录数据库系统了;

·使用密码文件登录:

有了密码文件后,用户就可以使用密码文件以sysoper/sysdba权限登录oracle数据库实例了,注意初始化参数remote_login_passwordfile应设置为exclusive或shared。任何用户以sysoper/sysdba的权限登录后,将位于sys用户的schema之下,以下为两个登录的例子:

1. 以管理员身份登录:

假设用户scott已被授予sysdba权限,则他可以使用以下命令登录:

connect scott/tiger as sysdba

2. 以internal身份登录:

connect internal/internal_password

·密码文件的维护:

1. 查看密码文件中的成员:

可以通过查询视图v$pwfile_users来获取拥有sysoper/sysdba系统权限的用户的信息,表中sysoper/sysdba列的取值true/false表示此用户是否拥有相应的权限。这些用户也就是相应地存在于密码文件中的成员。

2. 扩展密码文件的用户数量:

当向密码文件添加的帐号数目超过创建密码文件时所定的限制(即orapwd.exe工具的max_users参数)时,为扩展密码文件的用户数限制,需重建密码文件,具体步骤如下:

a) 查询视图v$pwfile_users,记录下拥有sysoper/sysdba系统权限的用户信息;

b) 关闭数据库;

c) 删除密码文件;

d) 用orapwd.exe新建一密码文件;

e) 将步骤a中获取的用户添加到密码文件中。

3. 修改密码文件的状态:

密码文件的状态信息存放于此文件中,当它被创建时,它的缺省状态为shared。可以通过改变初始化参数remote_login_passwordfile的设置改变密码文件的状态。当启动数据库事例时,oracle系统从初始化参数文件中读取remote_login_passwordfile参数的设置;当加载数据库时,系统将此参数与口令文件的状态进行比较,如果不同,则更新密码文件的状态。若计划允许从多台客户机上启动数据库实例,由于各客户机上必须有初始化参数文件,所以应确保各客户机上的初始化参数文件的一致性,以避免意外地改变了密码文件的状态,造成数据库登陆的失败。

4. 修改密码文件的存储位置:

密码文件的存放位置可以根据需要进行移动,但作此修改后,应相应修改系统注册库有关指向密码文件存放位置的参数或环境变量的设置。

5. 删除密码文件:

在删除密码文件前,应确保当前运行的各数据库实例的初始化参数remote_login_passwordfile皆设置为none。在删除密码文件后,若想要以管理员身份连入数据库的话,则必须使用操作系统验证的方法进行登录。

但是管理员都觉得乏味,因为在管理员中流行一种很简单的加密办法--就是经常,很频繁地修改自己的密码。可是,每次修改都跟打一次仗似的--因为更新程序并不是每个人都愿意做的事情。

那么有没有什么简单点的办法呢?请往下看:

模型:oracle7.3;开发工具:develope2000。收费系统(在数据库中的名称是sfyy),其client端分散在市区的数个营业点,通过城域网与主机(小型机)相连。

过程:

·在收费小型机oracle系统的system用户(dba)下,创建新用户test;?

create user test?
identified by carton?
default tablespace dataspace1?
quota 100k?

·对test用户授以权限;

?
grant create session to test;?
grant resource to test;?

·在test用户下建立一个存储函数mmtranslate,它其实是一个加密程序。下面是一个简单的例子。?

function mmtranslate(m varchar2)?
return varchar2?
as?
i number(2);?
kk varchar2(10);?
begin?
kk:=′′;?
i:=1;?
loop?
if i<=length(m) then?
if instr(′1234567890′,substr(m,i,1),1,1)>0 then?
kk:=kk||chr(100+to_number(substr(m,i,1)));?
elseif instr(‘wxyz‘,substr(m,i,1),1,1)>0 then?
kk:=kk||chr(-8+ascii(substr(m,i,1)));?
else?
kk:=kk||chr(4+ascii(substr(m,i,1)));?
end if;?
else?
exit;?
end if;?
i:=i+1;?
end loop;?
return kk;?
exception?
when others then?
return ′-1′;?
end;?

·在test用户下建表mmtest并插入记录:?

create table mmtest?
(usnamevarchar2(6),------用户名称?
mimavarchar2(6)------加密前的密码);?
insert into mmtest values( ‘sfyy‘,‘eds2‘);?
commit;

·执行以下语句

?
sql>select mmtranslate(‘eds2‘) from dual;?
mmtranslate(‘eds2‘)?
----------------------------------------?
ihwf?

利用dba权限更改sfyy的密码为上面语句的执行结果:?

alter user sffy?
identified by ihwf; ;?

·修改应用程序,对于开发环境是develope2000的程序来说,主要是修改主程序的on-lo gon触发器:

declare?
mm varchar2(6);?
begin?
logon(‘test‘,‘carton‘);?
select mima into mm from mmtest where usname=‘sfyy‘;?
mm:=mmtranslate(mm);?
logout;?
logon(‘sfyy‘,mm);?
end;?
阅读(292) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~