Oracle 用户与概要文件
2012-09-01 15:05:47| 分类: Oracle | 标签:用户与概要文件 |举报 |字号大中小 订阅
用户管理看上去简单其实也是最常出现问题的一个环节,因为它不仅包括创建用户与授权,还包括安全策略与资源管理。在大型应用,资源的管理是对DBA的一个考验。
默认给用户分配的是DEFAULT概要文件,将该文件赋予了每个创建的用户。但该文件对资源没有任何限制,因此管理员常常需要根据自己数据库系统的环境自行建立概要文件。
1、用户的创建
可以使用create user命令进行用户的创建,如下:
SQL> create user djp01 identified by djp2012
2 /
User created.
SQL>
说明:创建的用户名为djp01,用户 identified by指定用户的密码,密码为djp2012。上述的语句中没有对用户djp01指定永久表空间与临时表空间,这时,Oracle将为新创建的用户指定一个默认的永久表空间与一个临时表空间。如下:
SQL> select default_tablespace,temporary_tablespace
2 from dba_users
3 where username = upper(‘djp01‘)
4 /
DEFAULT_TABLESPACE
------------------------------------------------------------
TEMPORARY_TABLESPACE
------------------------------------------------------------
USERS
TEMPTBSGRP
SQL>
当创建一个新用户后,必须给用户授予必要的权限以后,用户才可以进行工作。对于djp01用户,还不能连接到数据,因为它不具有相关的权限。要想使用户连接到数据库,必须给它授予连接权限,如下:
SQL> conn djp01/djp2012
ERROR:
ORA-01045: user DJP01 lacks CREATE SESSION privilege; logon denied
Warning: You are no longer connected to ORACLE.
SQL>
SQL> grant create session to djp01
2 /
Grant succeeded.
SQL> conn djp01/djp2012
Connected.
SQL>
说明:当给用户djp01授予连接权限时,该用户成功连接。对于连接,Oracle还提供了一个连接的角色
connect。可以给用户授予连接角色。下面我们查看用户djp01在表空间上的使用情况:
SQL> select tablespace_name,bytes/1024/1024 as use_size
2 from dba_ts_quotas
3 where username = upper(‘djp01‘)
4 /
no rows selected
SQL>
我们发现,用户djp01对表空间users没有任何配额。下面我们试卷在用户djp01下创建表,
SQL> create table t
2 (
3 x number,
4 y varchar2(10)
5 )
6 /
create table t
*
ERROR at line 1:
ORA-01031: 权限不足
SQL>
SQL> grant create table to djp01
2 /
Grant succeeded.
SQL>
SQL> create table t
2 (
3 x number,
4 y varchar2(10)
5 )
6 /
说明:当我们在djp01用户下创建表对象时,提示无权限,之后授予相应的权限并重新创建,发现,该语句一直处于挂起状态。
因为,用户djp01在表空间users中无一定的配额。(在无配额时,会出现“ORA-01950”错误,但在11g中缺于挂起状态。这个根据实际环境来分析)。下面我们给用户djp01在表空间users分配一定的配额并创建:
SQL> alter user djp01
2 quota 100M on users
3 /
User altered.
SQL>
SQL> create table t
2 (
3 x number,
4 y varchar2(10)
5 )
6 /
Table created.
SQL>
这时,我们发现,可以成功创建。下面我们再查看用户djp01在表空间上的使用情况:
SQL> select tablespace_name,bytes/1024/1024 as quota_size
2 from dba_ts_quotas
3 where username = upper(‘djp01‘)
4 /
TABLESPACE_NAME
QUOTA_SIZE
------------------------------------------------------------
----------
USERS
.0625
SQL>
我们也可以在创建用户的时候指定具体的表空间及配额,如下:
SQL> create user djp02 identified by djp2012
2 default tablespace imtabdata
3 temporary tablespace temptbsgrp
4 quota 200M on imtabdata
5 /
User created.
SQL>
说明:使用default
tablespac指定用户djp02默认永久表空间imtabdata,temporary
tablespace指定临时表空间或临时表空间组(关于临时表空间组请参考http://blog.163.com/donfang_jianping/blog/static/13647395120127252910384/)。使用quota为用户在指定的表空间分配配额。
2、用户的更改与删除
可以使用altter user命令来更改用户,可以更改用户的项为:
用户的密码
用户的表空间
用户的表空间配额
指派概要文件和默认角色(概要文件参见下文)
如:我们更改用户djp01的密码,
SQL> alter user djp01 identified by djp01
2 /
User altered.
SQL>
其他的更改项与更改密码类似,我这里不一一不列举,有需要的请查阅相关资料或给我留言。
如果使用alter user命令修改密码,那么必须具有alter
user权限或DBA更改。如果用户自己更改,可以使用SQL*Plus下的password命令即可,如下:
SQL> password
Changing password for DJP01
Old password:
New password:
Retype new password:
Password changed
SQL> conn djp01/djp2012
Connected.
SQL>
密码成功更改。
关于用户的删除,可以使用drop user命令进行删除,如下:
SQL> drop user djp01;
drop user djp01
*
ERROR at line 1:
ORA-01922: 必须指定 CASCADE 以删除 ‘DJP01‘
SQL>
我们发现使用drop
user对用户djp01进行删除,抛出一个错误。这是因为,djp01用户下拥有对象,不能进行简单删除。如果确实要进行删除,可以加上cascade命令即可。如下:
SQL> drop user djp01 cascade;
User dropped.
SQL>
这时用户连同它的对象一起被删除。如果用户下没有具体的对象,使用drop user <username >删除即可。
3、概要文件
我们创建了一个用户,为其授予权限,那么就可以该用户就可以使用。如果一个用户疯狂地使用资源,那么就会造成数据库资源的缺乏或者是一个不会法的使用者疯狂地对一个用户的密码进行破解,那么很可能会造成信息的泄露与丢失。
为些,我们可以在Oracle中使用概要文件(profile)来进行资源的限制与密码相关特性的设置。当我们创建一个用户时,如果不指定相应的概要文件,那么,Oracle将为其指定一个默认的概要文件。如下:
SQL> select profile
2 from dba_users
3 where username = upper(‘djp02‘)
4 /
PROFILE
------------------------------------------------------------
DEFAULT
SQL>
说明:用户djp02所使用的概要文件为default。下面我们查看概要文件default的特性,如下:
SQL> select distinct resource_name,limit
2 from dba_profiles
3 where profile = upper(‘default‘)
4 /
RESOURCE_NAME
----------------------------------------------------------------
LIMIT
--------------------------------------------------------------------------------
PASSWORD_LOCK_TIME
1
CONNECT_TIME
UNLIMITED
IDLE_TIME
UNLIMITED
RESOURCE_NAME
----------------------------------------------------------------
LIMIT
--------------------------------------------------------------------------------
PASSWORD_GRACE_TIME
7
PRIVATE_SGA
UNLIMITED
LOGICAL_READS_PER_SESSION
UNLIMITED
RESOURCE_NAME
----------------------------------------------------------------
LIMIT
--------------------------------------------------------------------------------
LOGICAL_READS_PER_CALL
UNLIMITED
FAILED_LOGIN_ATTEMPTS
10
PASSWORD_VERIFY_FUNCTION
NULL
RESOURCE_NAME
----------------------------------------------------------------
LIMIT
--------------------------------------------------------------------------------
CPU_PER_SESSION
UNLIMITED
SESSIONS_PER_USER
UNLIMITED
PASSWORD_LIFE_TIME
180
RESOURCE_NAME
----------------------------------------------------------------
LIMIT
--------------------------------------------------------------------------------
PASSWORD_REUSE_MAX
UNLIMITED
PASSWORD_REUSE_TIME
UNLIMITED
CPU_PER_CALL
UNLIMITED
RESOURCE_NAME
----------------------------------------------------------------
LIMIT
--------------------------------------------------------------------------------
COMPOSITE_LIMIT
UNLIMITED
16 rows selected.
SQL>
通过查看发现,概要文件default对大部分参数的值几乎都是unlimited。如果给用户指定默认的要件文件,最终可能会出现源源缺乏问题。下面我们总体看一个概要文件的创建与使用:
SQL> create profile miser
2 limit
3 connect_time 200
4 idle_time 60
5 sessions_per_user 2
6 failed_login_attempts 3
7 /
Profile created.
SQL>
说明:我们创建的概要文件为miser(中文翻译为“守财奴”,我时常看一些大师级写的书,他们对名字的取法很讲究,我这里也用一下),connect_time指出数据库允许最大连接120秒,idle_time指出如果用户空闲的时间超出60秒,那么用户将退出;
sessions_per_user指出限制用户只能有两个会话;failed_login_attempts指出如果用户登录三次没有成功,那么,该用户将被锁住。概要文件可以在用户创建时指定,也可以在用户创建后指定,例子如下:
SQL> create user djp01 identified by djp2012
2 default tablespace imtabdata
3 temporary tablespace temptbsgrp
4 quota 100M on imtabdata
5 profile miser
6 /
User created.
SQL>
说明:我们在第4行使用profile关键字指定概要文件为miser。我们也可以用如下的试指定:
SQL> alter user djp01
2 profile miser
3 /
User altered.
SQL>
这时,用户djp01已经拥有了概要文件中的特性。下面我们简单的做个测试,如下:
SQL> conn djp01/aaa
ERROR:
ORA-01017: invalid username/password; logon denied
Warning: You are no longer connected to ORACLE.
SQL> conn djp01/bbb
ERROR:
ORA-01017: invalid username/password; logon denied
SQL> conn djp01/ccc
ERROR:
ORA-01017: invalid username/password; logon denied
SQL> conn djp01/ddd
ERROR:
ORA-28000: the account is locked
SQL> conn djp01/2012
ERROR:
ORA-28000: the account is locked
SQL>
我们发现当用户djp01登录三次不成功时,该用户将会被锁住。当用户被锁后,我们可以使用超级用户将其解锁,如下:
SQL> alter user djp01 account unlock
2 /
User altered.
SQL> conn djp01/djp2012
Connected.
SQL>
解锁后,可以成功连接。
有关于概要文件的参数,可以分为两类,一类为资源类,另一类为密码类。下面我们分别进行介绍:
(1)资源类
connect_time:指定一个会话能保持连接到数据库的总时间
cpu_per_call:限制事务内每个调用使用CPU的时间。
cpu_per_sessin:限制每个会话内使用CPU的时间。
sessions_per_time:限制用户可以打开并发的最大会话数。
idle_time:限制用户的最大空闲时间。
logical_reads_per_session:限制数据块读取的总数目。
logical_reads_per_call:限制每个会话调用总的逻辑读取数。
private_sga:指定一个在SGA的共享池组件中分配的空间限额(仅适用于共享服务器)。
composite_limit:对资源设置使用一个总的限制。Oracle考虑用四个参数来计算加权的composite_limit。分别为:cpu_per_session,logical_reads_per_sessions,connect_time,private_sga。可以使用alter
resource cost来设置.。
(2)密码类
failed_login_attempts:指用户被锁之前可以尝试的最大登录数。
password_life_time:指定使用特定密码的时间限制,如果超出此时间间隔,那么密码将过期。
password_grace_time:设置一个时间段,在此时间段内将发出一个密码过期警告。
password_lock_time:设置用户被锁定的天数,过了此天数,用户将自行解锁。
password_reuse_time:指定重新使用密码要经过多少天。
password_reuse_max:指定重新使用某个特定密码前,要经过多少次修改。
passwrod_verify_function:此参数允许指定Oracle提供的密码验证函数来建立自动密码验证。
参数稍多一些,对于这些参数,我建议不要去背,只要知道意义就可以了,如果有某个参数忘了,可以查看dba_profiles字典。
可以使用alter
profile来更改概要文件,如下:
SQL> alter profile miser
2 limit
3 password_life_time 30
4 password_grace_time 25
5 /
Profile altered.
SQL>
如果在概要文件中使用资源的设置,那么,如是使其生效,必须更改初始化参数resource_limit为true,此参数的默认值为false。
可以使用drop profile进行删除,如下:
SQL> drop profile miser
2 /
drop profile miser
*
ERROR at line 1:
ORA-02382: 概要文件 MISER 指定了用户, 不能没有 CASCADE 而删除
SQL>
提示删除出错,这是因为概要文件miser指定了用户,如果没有指定用户,可以使用该命令进行删除。如果指定了用户,要想删除,可以使用如下删除方式:
SQL> drop profile miser cascade
2 /
Profile dropped.
SQL>
成功删除。
概要文件多数用来密码的管理,关于资源的管理,Oracle提供了一个更为高级的管理工具——Database Rsource
Manager,在以后的文章我会介绍该工具的使用。