在oracle中存在三类用户:sysdba、sysoper、普通用户。前两类用户为特权用户,拥有数据库的所有权限,特权用户的相关信息可以从动态性能视图v$pwfile_users中获得。
SQL> select * from v$pwfile_users;创建用户只能由sys用户完成,或者拥有CREATE USER权限的用户。
USERNAME SYSDBA SYSOPER SYSASM
----------------------------- ---------- ---------- ----------
SYS TRUE TRUE FALSE
创建用户的语法格式如下:
CREATE USER user_name IDENTIFIED BY passwordQUOTA子句为用户在表空间上指定空间配额,可以KB、MB等为单位,或UNLIMITED指定为无限制的空间配额,或授予用户UNLIMITED TABLESPACES系统权限。
DEFAULT TABLESPACE tbs_name
TEMPORARY TABLESPACE temp_tbs_name
QUOTA tbs_size ON tbs_name
PASSWORD EXPIRE
ACCOUNT LOCK|UNLOCK
PASSWORD EXPIRE子句指定用户在第一次登陆时必须修改密码。
ACCOUNT指定用户账号的状态。
用户创建之后可通过ALTER USER命令修改用户的相关信息。
删除用户:
SQL>DROP USER user_name;但是当用户下存在对象时,需要使用CASCADE选项进行删除:
SQL>DROP USER user_name CASCADE;此时创建了用户并不能进行登录,需要对用户赋予相应权限之后才能进行登录。
SQL> conn test1/test@lsjcom
ERROR:
ORA-01045: 用户 TEST1 没有 CREATE SESSION 权限; 登录被拒绝
二、 用户权限的管理
Oracle中用户权限有两类,一类是系统权限,包括对数据库对象的增、删、改,对数据库的创建和备份等;另一类是数据库权限,主要是针对数据库对象的访问权限。
表2-1 常用的系统权限
系统权限 |
说明 |
Create cluster |
在自己的模式中创建簇的权限 |
Create procedure |
在自己的模式中创建存储函数、存储过程、程序包的权限 |
Create session |
登录数据库的权限 |
Create table |
在自己的模式中创建表的权限 |
Create tablespace |
在自己的模式中创建表空间的权限 |
Unlimited tablespace |
在任意表空间都有无限空间配额的权限 |
Create trigger |
在自己的模式中创建触发器的权限 |
Create user |
创建用户的权限 |
Create view |
在自己的模式中创建视图的权限 |
更多的系统权限:
http://docs.oracle.com/database/121/SQLRF/statements_9013.htm#BABEFFEE
表2-2 常用的对象权限
对象权限 |
说明 |
ALTER |
修改表和序列的权限 |
SELECT |
对数据库对象中的数据的查询权限 |
INSERT |
对数据库对象中的数据插入的权限 |
DELETE |
对数据库对象中的数据删除的权限 |
UPDATE |
对数据库对象中的数据更新的权限 |
REFERENCES |
可以与一个表建立关联关系的权限,在授予权限时可以指定列,也可以不指定 |
EXECUTE |
执行存储函数、存储过程和程序包的权限 |
RENAME |
重命名数据库对象的权限 |
更多对象权限:
http://docs.oracle.com/database/121/SQLRF/statements_9013.htm#BGBCIIEG
为用户授予系统权限的语法格式如下:
SQL>GRANT 权限,… TO user,… [WITH ADMIN OPTION];为用户授予对象权限的语法格式如下:
SQL>GRANT 权限(列名),… ON 对象 TO user,… [WITH ADMIN OPTION]其中WITH ADMIN OPTION子句使得权限的获得者可以将权限再分配给其他用户。
回收用户系统权限的语法格式如下:
SQL>REVOKE 权限,… FROM user,…回收用户对象权限的语法格式如下:
SQL>REVOKE 权限,… ON 对象 FROM user,…;当回收所有权限时,可以使用REVOKE ALL
三、 与权限相关的数据字典
权限类型 |
数据字典视图 |
说明 |
系统权限 |
system_privilege_map |
当前数据库中已经定义的所有系统权限 |
dba_sys_prvis |
任何用户所具有的系统权限(sys用户) |
|
user_sys_privs |
用户自己所拥有的系统权限 |
|
session_privs |
一个用户在当前会话中所具有的权限 |
|
对象权限 |
dba_tab_privs |
任何用户所具有的对象权限 |
dba_col_privs |
任何用户在列上所具有的权限 |
|
user_tab_privs |
用户自己所拥有的对象权限 |
|
user_col_privs |
用户自己所拥有的列的权限 |
四、 角色管理
角色是一组权限的集合,使权限管理更加方便。数据库中有两类角色,一类是oracle预定义角色,一类是用户自定义角色。
角色名称 |
所包含权限 |
CONNECT |
CREATE SESSION |
RESOURCE |
CREATE CLUSTER, CREATE INDEXTYPE, CREATE OPERATOR, CREATE PROCEDURE, CREATE SEQUENCE, CREATE TABLE, CREATE TRIGGER, CREATE TYPE. |
DBA |
可通过DBA_SYS_PRIVS数据字典查看 |
更多Oracle预定义的角色:
http://docs.oracle.com/database/121/DBSEG/authorization.htm#DBSEG4414
1、 创建角色:
SQL>CREATE ROLE role_name;2、 删除角色:
SQL>DROP ROLE role_name;3、 向角色授予权限
授予系统权限:
SQL>GRANT 权限,… TO role_name [WITH ADMIN OPTION];授予对象权限:
SQL>GRANT 权限,… ON 对象 TO role_name;4、 回收权限:
SQL>REVOKE ………… FROM………5、 角色的分配:
SQL>GRANT role_name TO user1;6、 角色的回收
SQL>REVOKE role_name FROM user;7、 与角色有关的数据字典
1) dba_roles:数据库中的所有角色
2) dba_role_privs:所有被授予用户或另一角色的角色
3) user_role_privs:所有被授予当前用户的角色
4) role_role_privs:一个角色中包含的其它角色
5) role_sys_privs:一个角色中包含的系统权限
6) role_tab_privs:一个角色中包含的对象权限
7) session_roles:当前会话中所使用的角色
五、 PROFILE
PROFILE是一种数据库对象,用来对用户口令的使用情况和资源消耗情况进行控制。可通过dba_users查看对用户指定的profile,以及通过dba_profiles查看一个profile所施加的限制。
创建PROFILE的命令格式:
SQL>CREATE PROFILE profile_name LIMIT口令限制
资源限制
1、 口令限制
1) FAILED_LOGIN_ATTEMPTS:允许失败的登录次数,到达指定的失败次数后账户将被锁定。
2) PASSWORD_LOCK_TIME:账号登录失败被锁定后的锁定时间
3) PASSWORD_LIFF_TIME:口令有效期
4) PASSWORD_GRACE_TIME:口令有效期的延长期
5) PASSWORD_REUSE_TIME:为了再次使用过去的口令,必须经过的天数。
6) PASSWORD_REUSE_MAX:为了再次使用过去的口令,必须使用不同口令的次数。
2、 资源限制
为了使PROFILE的资源限制起作用需要修改初始参数RESOURCE_LIMIT=TRUE:
SQL>ALTER SYSTEM set RESOURCE_LIMIT=TRUE;1) SESSION_PER_USER:一个用户所允许的并发会话数目
2) CPU_PER_SESSION:用户在一个会话内所使用的CPU时间的总和,时间单位为0.01s
3) LOGICAL_READS_PER_SESSION:用户在一个会话内所能访问的数据块的数量
4) CONNECT_TIME:一个用户会话所能持续的时间,单位分钟
5) IDLE_TIME:一个用户会话所允许的连续的空闲时间,单位分钟
6) PRIVATE_SGA:在共享模式的连接模式下,这个参数用来为一个用户会话所分配的SGA空间
7) CPU_PER_CALL:用户执行的每条命令所使用的CPU时间,时间单位为0.01s
8) LOGICAL_READS_PER_CALL:用户执行的每条命令所能访问的数据块的数量。
将PROFILE指定给用户:
SQL>CREATE USER user_name IDENTIFIED pwd PROFILE pro_name;删除PROFILE:
SQL>ALTER USER user_name PROFILE pro_name;
SQL>DROP PROFILE pro_name [CASCADE/*若PROFILE已经指定给了用户*/]