目录
示例1:在SQL*Plus中创建以口令方式验证的用户dba_news_user01
示例2:在SQL*Plus中创建以外部方式验证的用户USER3
示例3:在SQL*Plus中创建以外部方式验证的用户USER3
[三、角色管理(像java中的封装 一次创建、多次使用)](#三、角色管理(像java中的封装 一次创建、多次使用))
用户管理和权限管理是确保数据库中数据安全的重要手段。如果能够正确地对数据库中的用户赋予权限,那么就能在很大程度上提高数据库的安全性。本次包括以下知识点:
❑用户的创建与管理
❑权限的创建与管理
❑角色的创建与使用
❑概要文件的创建与使用
本次内容基本涵盖了对数据库中的用户、权限、角色以及概要文件的创建与管理的方法。希望通过本次的学习,可以熟练地掌握数据库中的用户、权限、角色以及概要文件的使用方法。
如果有兴趣,也可以看一下MySQL的操作: MySQL中的SQL详解(DDL、DML、DQL、DCL)
问题背景:
在Oracle数据的日常运维中,用户权限的有效管理是至关重要的,这一点在我们部署Oracle的过程中应该有初步的深刻体会。在实际的项目过程中,如何有效的分配用户权限那也是至关重要。前不久,我接到了一个部署数据备份一体机的任务,里边为避免直接使用sys用户权限,就需要针对备份代理就需要创建一个合适的用户来进行管理。
一、用户管理
Oracle中的用户管理主要是针对数据库管理员说的,只有管理员才有权限创建、修改以及删除用户。本节就将介绍如何创建以及管理用户。
1.1.什么是用户管理
Oracle的用户管理应该说是每个数据库管理员都会遇到的一个问题,对用户管理涉及的主要问题就是用户所赋予的权限,根据每个用户访问Oracle数据库的需求不同,分配给用户的权限也就不同。如果数据库管理员对Oracle数据库用户的权限分配得合理,那么就能够提高数据库的安全性;相反,如果对Oracle数据库的用户权限分配得不合理,那么就会给数据库造成很大的隐患。对于权限分配的问题本次博客后续中会继续介绍。
在Oracle中用户登录数据库的方式主要有三种:
1)第一种是一般的密码验证方式。
2)第二种是外部验证方式,这种方式并没有把验证密码存放在Oracle数据库中,其验证的密码通常与数据库所在的操作系统的密码一致。
3)第三种就是全局验证方式,这种验证方式也不常用,它也不是把密码存放在Oracle数据库中的。
这三种验证方式中最常用的就是密码验证的方式,同时这种方式的安全性也更高一些。
1.1.1.创建用户
在Oracle中创建用户必须拥有数据库管理员的权限才能创建,在创建用户时还需要注意的是创建的用户的密码必须是以字母开头的。创建用户也可以在企业管理器中或者在SQL*Plus中使用语句创建。
(1)使用SQL*Plus创建用户
在SQL*Plus中创建用户使用的语法选项是比较多的。一般创建用户的语法如下:
CREATE USER username IDENTIFIED BY password
OR EXTERNALLY AS certificate_DN
OR GLOBALLY AS directory_DN
DEFAULT TABLESPACE tablespace
TEMPORARY TABLESPACE tablespace \| tablespace_group_name
QUOTA size \| UNLIMITED ON tablespace
PROFILE profile
PASSWORD EXPIRE
ACCOUNT LOCK \| UNLOCK
说明:
1)在创建用户时有三种验证方式,以口令作为验证方式时选择【IDENTIFIED BY password】选项即可;以外部作为验证方式时选择【EXTERNALLY AS certificate_DN】选项;以全局作为验证方式时选择【GLOBALLY AS directory_DN】选项即可。
2)DEFAULT TABLESPACE:设置默认表空间,如果省略了该语句,那么这个新创建的用户就存放在数据库的默认表空间中,如果数据库没有设置默认表空间,那么创建的用户就存放在SYSTEM表空间中。
3)TEMPORARY TABLESPACE:设置临时表空间或临时表空间组,可以把临时表空间存放在临时表空间组中,如果省略了该语句,那么就会把临时的文件存放到当前数据库中默认的临时表空间中;如果没有默认的临时表空间,那么会把临时文件存放到SYSTEM的临时表空间中。
4)QUOTA:设置当前用户使用表空间的最大值,在创建用户时可以有多个QUOTA来设置用户在不同表空间中能够使用的表空间大小。如果设置成UNLIMITED,表示对表空间的使用没有限制。注意:创建用户时不能设置用户在临时表空间上使用的范围。
5)PROFILE:设置当前用户使用的概要文件的名称,如果省略了该子句,那么用户就使用当前数据库中默认的概要文件。
6)PASSWORD EXPIRE:设置当前用户密码立即处于过期状态,用户如果想再登录数据库必须要更改密码。
7)ACCOUNT:设置用户的锁定状态,如果设置成LOCK,那么该用户不能访问数据库;如果设置成UNLOCK,那么用户则可以访问数据库。在Oracle 11g中默认的用户状态都为锁定的状态。
利用创建用户的语句,分别创建以口令验证方式的用户和以外部方式验证的用户。
示例1:在SQL*Plus中创建以口令方式验证的用户dba_news_user01
创建一个以口令方式验证的用户dba_news_user01,并且设置成密码立即过期的方式。具体实现代码如下:
CREATE USER dba_news_user01
IDENTIFIED BY abcd
DEFAULT TABLESPACE TS_NEWS_DATA
QUOTA 10M ON TS_NEWS_DATA
TEMPORARY TABLESPACE TEMP
PROFILE dba_news_user01_profile
PASSWORD EXPIRE;
代码解析:
第2行设置用户dba_news_user01的登录口令是abcd。
第3行设置用户dba_news_user01的默认表空间是TS_NEWS_DATA。
第4行设置用户dba_news_user01可以在表空间TS_NEWS_DATA中使用的磁盘限额是10MB。
第5行设置用户dba_news_user01的临时表空间是TEMP。
第6行设置用户dba_news_user01使用的概要文件是dba_news_user01_profile(前提是需要存在这个概要文件)。
第7行设置用户的密码是立即过期状态。
bash
SQL> select tablespace_name,status,contents from dba_tablespaces;
TABLESPACE_NAME STATUS CONTENTS
------------------------------ --------- ---------------------
SYSTEM ONLINE PERMANENT
SYSAUX ONLINE PERMANENT
UNDOTBS1 ONLINE UNDO
TEMP ONLINE TEMPORARY
USERS ONLINE PERMANENT
TS_NEWS_DATA ONLINE PERMANENT
6 rows selected.
SQL>
SQL> SELECT DISTINCT profile FROM dba_profiles ORDER BY profile;
PROFILE
--------------------------------------------------------------------------------
DEFAULT
GSM_PROF
ORA_STIG_PROFILE
SQL> column profile format a30
SQL> column limit format a30
SQL> set linesize 130
SQL> SELECT * FROM dba_profiles;
PROFILE RESOURCE_NAME RESOURCE LIMIT COM INH IMP
------------------------------ -------------------------------- -------- ------------------------------ --- --- ---
ORA_STIG_PROFILE PASSWORD_VERIFY_FUNCTION PASSWORD ORA12C_STIG_VERIFY_FUNCTION NO NO NO
ORA_STIG_PROFILE FAILED_LOGIN_ATTEMPTS PASSWORD 3 NO NO NO
DEFAULT FAILED_LOGIN_ATTEMPTS PASSWORD 10 NO NO NO
ORA_STIG_PROFILE PASSWORD_REUSE_MAX PASSWORD 10 NO NO NO
ORA_STIG_PROFILE IDLE_TIME KERNEL 15 NO NO NO
ORA_STIG_PROFILE PASSWORD_LIFE_TIME PASSWORD 60 NO NO NO
DEFAULT COMPOSITE_LIMIT KERNEL UNLIMITED NO NO NO
DEFAULT SESSIONS_PER_USER KERNEL UNLIMITED NO NO NO
DEFAULT CPU_PER_SESSION KERNEL UNLIMITED NO NO NO
DEFAULT CPU_PER_CALL KERNEL UNLIMITED NO NO NO
DEFAULT LOGICAL_READS_PER_SESSION KERNEL UNLIMITED NO NO NO
PROFILE RESOURCE_NAME RESOURCE LIMIT COM INH IMP
------------------------------ -------------------------------- -------- ------------------------------ --- --- ---
DEFAULT LOGICAL_READS_PER_CALL KERNEL UNLIMITED NO NO NO
DEFAULT IDLE_TIME KERNEL UNLIMITED NO NO NO
DEFAULT CONNECT_TIME KERNEL UNLIMITED NO NO NO
DEFAULT PRIVATE_SGA KERNEL UNLIMITED NO NO NO
DEFAULT PASSWORD_REUSE_TIME PASSWORD UNLIMITED NO NO NO
DEFAULT PASSWORD_REUSE_MAX PASSWORD UNLIMITED NO NO NO
DEFAULT PASSWORD_VERIFY_FUNCTION PASSWORD NULL NO NO NO
ORA_STIG_PROFILE PASSWORD_LOCK_TIME PASSWORD UNLIMITED NO NO NO
DEFAULT INACTIVE_ACCOUNT_TIME PASSWORD UNLIMITED NO NO NO
ORA_STIG_PROFILE INACTIVE_ACCOUNT_TIME PASSWORD 35 NO NO NO
GSM_PROF FAILED_LOGIN_ATTEMPTS PASSWORD 10000000 NO NO NO
PROFILE RESOURCE_NAME RESOURCE LIMIT COM INH IMP
------------------------------ -------------------------------- -------- ------------------------------ --- --- ---
ORA_STIG_PROFILE PASSWORD_REUSE_TIME PASSWORD 365 NO NO NO
DEFAULT PASSWORD_LOCK_TIME PASSWORD 1 NO NO NO
DEFAULT PASSWORD_GRACE_TIME PASSWORD 7 NO NO NO
ORA_STIG_PROFILE PASSWORD_GRACE_TIME PASSWORD 5 NO NO NO
DEFAULT PASSWORD_LIFE_TIME PASSWORD 180 NO NO NO
GSM_PROF COMPOSITE_LIMIT KERNEL DEFAULT NO NO NO
ORA_STIG_PROFILE COMPOSITE_LIMIT KERNEL DEFAULT NO NO NO
GSM_PROF SESSIONS_PER_USER KERNEL DEFAULT NO NO NO
ORA_STIG_PROFILE SESSIONS_PER_USER KERNEL DEFAULT NO NO NO
GSM_PROF CPU_PER_SESSION KERNEL DEFAULT NO NO NO
ORA_STIG_PROFILE CPU_PER_SESSION KERNEL DEFAULT NO NO NO
PROFILE RESOURCE_NAME RESOURCE LIMIT COM INH IMP
------------------------------ -------------------------------- -------- ------------------------------ --- --- ---
GSM_PROF CPU_PER_CALL KERNEL DEFAULT NO NO NO
ORA_STIG_PROFILE CPU_PER_CALL KERNEL DEFAULT NO NO NO
GSM_PROF LOGICAL_READS_PER_SESSION KERNEL DEFAULT NO NO NO
ORA_STIG_PROFILE LOGICAL_READS_PER_SESSION KERNEL DEFAULT NO NO NO
GSM_PROF LOGICAL_READS_PER_CALL KERNEL DEFAULT NO NO NO
ORA_STIG_PROFILE LOGICAL_READS_PER_CALL KERNEL DEFAULT NO NO NO
GSM_PROF IDLE_TIME KERNEL DEFAULT NO NO NO
GSM_PROF CONNECT_TIME KERNEL DEFAULT NO NO NO
ORA_STIG_PROFILE CONNECT_TIME KERNEL DEFAULT NO NO NO
GSM_PROF PRIVATE_SGA KERNEL DEFAULT NO NO NO
ORA_STIG_PROFILE PRIVATE_SGA KERNEL DEFAULT NO NO NO
PROFILE RESOURCE_NAME RESOURCE LIMIT COM INH IMP
------------------------------ -------------------------------- -------- ------------------------------ --- --- ---
GSM_PROF PASSWORD_LIFE_TIME PASSWORD DEFAULT NO NO NO
GSM_PROF PASSWORD_REUSE_TIME PASSWORD DEFAULT NO NO NO
GSM_PROF PASSWORD_REUSE_MAX PASSWORD DEFAULT NO NO NO
GSM_PROF PASSWORD_VERIFY_FUNCTION PASSWORD DEFAULT NO NO NO
GSM_PROF PASSWORD_LOCK_TIME PASSWORD DEFAULT NO NO NO
GSM_PROF PASSWORD_GRACE_TIME PASSWORD DEFAULT NO NO NO
GSM_PROF INACTIVE_ACCOUNT_TIME PASSWORD DEFAULT NO NO NO
51 rows selected.
SQL> create profile dba_news_user01_profile limit password_life_time 30;
Profile created.
SQL> SELECT * FROM dba_profiles;
PROFILE RESOURCE_NAME RESOURCE LIMIT COM INH IMP
------------------------------ -------------------------------- -------- ------------------------------ --- --- ---
ORA_STIG_PROFILE PASSWORD_VERIFY_FUNCTION PASSWORD ORA12C_STIG_VERIFY_FUNCTION NO NO NO
ORA_STIG_PROFILE FAILED_LOGIN_ATTEMPTS PASSWORD 3 NO NO NO
DEFAULT FAILED_LOGIN_ATTEMPTS PASSWORD 10 NO NO NO
ORA_STIG_PROFILE PASSWORD_REUSE_MAX PASSWORD 10 NO NO NO
ORA_STIG_PROFILE IDLE_TIME KERNEL 15 NO NO NO
ORA_STIG_PROFILE PASSWORD_LIFE_TIME PASSWORD 60 NO NO NO
DEFAULT COMPOSITE_LIMIT KERNEL UNLIMITED NO NO NO
DEFAULT SESSIONS_PER_USER KERNEL UNLIMITED NO NO NO
DEFAULT CPU_PER_SESSION KERNEL UNLIMITED NO NO NO
DEFAULT CPU_PER_CALL KERNEL UNLIMITED NO NO NO
DEFAULT LOGICAL_READS_PER_SESSION KERNEL UNLIMITED NO NO NO
PROFILE RESOURCE_NAME RESOURCE LIMIT COM INH IMP
------------------------------ -------------------------------- -------- ------------------------------ --- --- ---
DEFAULT LOGICAL_READS_PER_CALL KERNEL UNLIMITED NO NO NO
DEFAULT IDLE_TIME KERNEL UNLIMITED NO NO NO
DEFAULT CONNECT_TIME KERNEL UNLIMITED NO NO NO
DEFAULT PRIVATE_SGA KERNEL UNLIMITED NO NO NO
DEFAULT PASSWORD_REUSE_TIME PASSWORD UNLIMITED NO NO NO
DEFAULT PASSWORD_REUSE_MAX PASSWORD UNLIMITED NO NO NO
DEFAULT PASSWORD_VERIFY_FUNCTION PASSWORD NULL NO NO NO
ORA_STIG_PROFILE PASSWORD_LOCK_TIME PASSWORD UNLIMITED NO NO NO
DEFAULT INACTIVE_ACCOUNT_TIME PASSWORD UNLIMITED NO NO NO
ORA_STIG_PROFILE INACTIVE_ACCOUNT_TIME PASSWORD 35 NO NO NO
GSM_PROF FAILED_LOGIN_ATTEMPTS PASSWORD 10000000 NO NO NO
PROFILE RESOURCE_NAME RESOURCE LIMIT COM INH IMP
------------------------------ -------------------------------- -------- ------------------------------ --- --- ---
ORA_STIG_PROFILE PASSWORD_REUSE_TIME PASSWORD 365 NO NO NO
DBA_NEWS_USER01_PROFILE PASSWORD_LIFE_TIME PASSWORD 30 NO NO NO
DEFAULT PASSWORD_LOCK_TIME PASSWORD 1 NO NO NO
DEFAULT PASSWORD_GRACE_TIME PASSWORD 7 NO NO NO
ORA_STIG_PROFILE PASSWORD_GRACE_TIME PASSWORD 5 NO NO NO
DEFAULT PASSWORD_LIFE_TIME PASSWORD 180 NO NO NO
GSM_PROF COMPOSITE_LIMIT KERNEL DEFAULT NO NO NO
ORA_STIG_PROFILE COMPOSITE_LIMIT KERNEL DEFAULT NO NO NO
DBA_NEWS_USER01_PROFILE COMPOSITE_LIMIT KERNEL DEFAULT NO NO NO
GSM_PROF SESSIONS_PER_USER KERNEL DEFAULT NO NO NO
ORA_STIG_PROFILE SESSIONS_PER_USER KERNEL DEFAULT NO NO NO
PROFILE RESOURCE_NAME RESOURCE LIMIT COM INH IMP
------------------------------ -------------------------------- -------- ------------------------------ --- --- ---
DBA_NEWS_USER01_PROFILE SESSIONS_PER_USER KERNEL DEFAULT NO NO NO
GSM_PROF CPU_PER_SESSION KERNEL DEFAULT NO NO NO
ORA_STIG_PROFILE CPU_PER_SESSION KERNEL DEFAULT NO NO NO
DBA_NEWS_USER01_PROFILE CPU_PER_SESSION KERNEL DEFAULT NO NO NO
GSM_PROF CPU_PER_CALL KERNEL DEFAULT NO NO NO
ORA_STIG_PROFILE CPU_PER_CALL KERNEL DEFAULT NO NO NO
DBA_NEWS_USER01_PROFILE CPU_PER_CALL KERNEL DEFAULT NO NO NO
GSM_PROF LOGICAL_READS_PER_SESSION KERNEL DEFAULT NO NO NO
ORA_STIG_PROFILE LOGICAL_READS_PER_SESSION KERNEL DEFAULT NO NO NO
DBA_NEWS_USER01_PROFILE LOGICAL_READS_PER_SESSION KERNEL DEFAULT NO NO NO
GSM_PROF LOGICAL_READS_PER_CALL KERNEL DEFAULT NO NO NO
PROFILE RESOURCE_NAME RESOURCE LIMIT COM INH IMP
------------------------------ -------------------------------- -------- ------------------------------ --- --- ---
ORA_STIG_PROFILE LOGICAL_READS_PER_CALL KERNEL DEFAULT NO NO NO
DBA_NEWS_USER01_PROFILE LOGICAL_READS_PER_CALL KERNEL DEFAULT NO NO NO
GSM_PROF IDLE_TIME KERNEL DEFAULT NO NO NO
DBA_NEWS_USER01_PROFILE IDLE_TIME KERNEL DEFAULT NO NO NO
GSM_PROF CONNECT_TIME KERNEL DEFAULT NO NO NO
ORA_STIG_PROFILE CONNECT_TIME KERNEL DEFAULT NO NO NO
DBA_NEWS_USER01_PROFILE CONNECT_TIME KERNEL DEFAULT NO NO NO
GSM_PROF PRIVATE_SGA KERNEL DEFAULT NO NO NO
ORA_STIG_PROFILE PRIVATE_SGA KERNEL DEFAULT NO NO NO
DBA_NEWS_USER01_PROFILE PRIVATE_SGA KERNEL DEFAULT NO NO NO
DBA_NEWS_USER01_PROFILE FAILED_LOGIN_ATTEMPTS PASSWORD DEFAULT NO NO NO
PROFILE RESOURCE_NAME RESOURCE LIMIT COM INH IMP
------------------------------ -------------------------------- -------- ------------------------------ --- --- ---
GSM_PROF PASSWORD_LIFE_TIME PASSWORD DEFAULT NO NO NO
GSM_PROF PASSWORD_REUSE_TIME PASSWORD DEFAULT NO NO NO
DBA_NEWS_USER01_PROFILE PASSWORD_REUSE_TIME PASSWORD DEFAULT NO NO NO
GSM_PROF PASSWORD_REUSE_MAX PASSWORD DEFAULT NO NO NO
DBA_NEWS_USER01_PROFILE PASSWORD_REUSE_MAX PASSWORD DEFAULT NO NO NO
GSM_PROF PASSWORD_VERIFY_FUNCTION PASSWORD DEFAULT NO NO NO
DBA_NEWS_USER01_PROFILE PASSWORD_VERIFY_FUNCTION PASSWORD DEFAULT NO NO NO
GSM_PROF PASSWORD_LOCK_TIME PASSWORD DEFAULT NO NO NO
DBA_NEWS_USER01_PROFILE PASSWORD_LOCK_TIME PASSWORD DEFAULT NO NO NO
GSM_PROF PASSWORD_GRACE_TIME PASSWORD DEFAULT NO NO NO
DBA_NEWS_USER01_PROFILE PASSWORD_GRACE_TIME PASSWORD DEFAULT NO NO NO
PROFILE RESOURCE_NAME RESOURCE LIMIT COM INH IMP
------------------------------ -------------------------------- -------- ------------------------------ --- --- ---
GSM_PROF INACTIVE_ACCOUNT_TIME PASSWORD DEFAULT NO NO NO
DBA_NEWS_USER01_PROFILE INACTIVE_ACCOUNT_TIME PASSWORD DEFAULT NO NO NO
68 rows selected.
SQL>
SQL> create user dba_news_user01
2 IDENTIFIED BY abcd
3 DEFAULT TABLESPACE TS_NEWS_DATA
4 QUOTA 10M ON TS_NEWS_DATA
5 TEMPORARY TABLESPACE TEMP
6 PROFILE dba_news_user01_profile
7 PASSWORD EXPIRE;
User created.
SQL>
SQL> select username,default_tablespace from dba_users;
USERNAME DEFAULT_TABLESPACE
-------------------- ------------------------------
SYS SYSTEM
SYSTEM SYSTEM
XS$NULL SYSTEM
SYSBACKUP SYSTEM
SYSRAC SYSTEM
SYSKM SYSTEM
OUTLN SYSTEM
SYS$UMF SYSTEM
SYSDG SYSTEM
DBSNMP SYSAUX
APPQOSSYS SYSAUX
USERNAME DEFAULT_TABLESPACE
-------------------- ------------------------------
DBSFWUSER SYSAUX
GGSYS SYSAUX
ANONYMOUS SYSAUX
GSMADMIN_INTERNAL SYSAUX
XDB SYSAUX
GSMCATUSER USERS
REMOTE_SCHEDULER_AGE USERS
NT
AUDSYS USERS
DIP USERS
USERNAME DEFAULT_TABLESPACE
-------------------- ------------------------------
ORACLE_OCM USERS
GSMUSER USERS
DBA_NEWS_USER01 TS_NEWS_DATA
23 rows selected.
SQL>
示例2:在SQL*Plus中创建以外部方式验证的用户USER3
创建一个验证方式是外部的用户USER3。
具体代码如下:
CREATE USER USER3
IDENTIFIED EXTERNALLY
DEFAULT TABLESPACE test
QUOTA 5M ON test
PROFILE pro_test;
代码解析:
第2行设置用户USER3的验证方式是外部验证。
第3行设置用户USER3的默认表空间是test。
第4行设置用户USER3在test表空间中能够使用的磁盘配额是5MB。
第5行设置用户USER3所使用的概要文件是pro_test。
示例3:在SQL*Plus中创建以外部方式验证的用户USER3
创建一个验证方式是外部的用户USER3。具体代码如下:
CREATE USER USER3
IDENTIFIED EXTERNALLY
DEFAULT TABLESPACE test
QUOTA 5M ON test
PROFILE pro_test;
代码解析:
第2行设置用户USER3的验证方式是外部验证。
第3行设置用户USER3的默认表空间是test。
第4行设置用户USER3在test表空间中能够使用的磁盘配额是5MB。
第5行设置用户USER3所使用的概要文件是pro_test。
1.1.2.修改用户信息
创建好用户后有时会对用户的设置有所改变,SQL*Plus方式修改已经创建好的用户。
在SQL*Plus中修改用户的语法与创建用户的选项非常类似。具体的语法如下:
ALTER USER user IDENTIFIED
{BY password [REPLACE old_password]
|EXTERNALLY [AS'certificate_DN']
|GLOBALLY [AS ' [directory_DN]']
}
DEFAULT TABLESPACE tablespace
TEMPORARY TABLESPACE {tablespace \| tablespace_group_name}
QUOTA{size_clause \| UNLIMITED}ON tablespace
PROFILE profile
PASSWORD EXPIRE
ACCOUNT{LOCK \| UNLOCK}
参数的具体含义跟上边一样,可以对用户的密码和认证方式、默认的表空间、默认的临时表空间、当前用户使用的表空间的最大值、概要文件、密码过期设置、是否上锁进行修改。
下面利用上面的语法完成三个修改用户信息的操作。
示例1:修改用户dba_news_user01密码,具体语句如下:
ALTER USER dba_news_user01
IDENTIFIED BY newabcd
DEFAULT TABLESPACE test;
示例2:为用户dba_news_user01添加临时表空间,具体语句如下:
ALTER USER dba_news_user01
TEMPORARY TABLESPACE newspace1;
示例3:为用户dba_news_user01设置密码立即过期,具体语句如下:
ALTER USER dba_news_user01PASSWORD EXPIRE;
1.1.3.删除用户
数据库管理员经常会去除一些废弃不用的用户,而删除用户的同时也要把该用户所使用的数据库对象一并删除掉。在SQL*Plus中使用语句删除用户方式讲解。
在SQL*Plus中删除用户
在SQL*Plus中删除用户也是比较简单的,只要知道用户名即可删除,而且是把该用户下所有的数据文件一起删除。具体删除的语法如下
DROP UESR user CASCADE
说明:如果要删除的用户中没有任何数据库对象,那么就可以省略**CASCADE(层叠)**关键字。
二、权限管理
权限管理主要是针对前面讲的用户还有后面要讲解的角色进行管理的,数据库管理员如果要保证数据库的安全就要控制好每一个用户或者角色的权限。本节就将讲述如何授予、撤销以及查询用户或角色的权限。
2.1.什么是权限管理
在Oracle数据库中,权限有系统权限和对象权限两类。系统权限主要是指SESSION权限、USER权限等,也就是说对数据库的系统级的操作都可以称为系统权限。对象权限主要是指表对象、序列、触发器等操作的权限。
2.2.查看用户权限
查询用户权限也是数据库管理员经常要做的工作,由于权限都是针对用户或角色的,这里,只查询用户的权限。在查询权限时都通过用户名去查询该用户权限。
Oracle中的用户权限存放在数据库的数据字典中,用户系统权限存放在数据字典DBA_SYS_PRIVS中,用户的对象权限存放在数据字典DBA_TAB_PRIVS中。
说明:除了可以在DBA_SYS_PRIVS和DBA_TAB_PRIVS数据字典中查询权限之外,还可以直接 在数据字典USER_SYS_PRIVS中查询当前登录用户的系统权限; 在数据字典ALL_TAB_PRIVS中查询当前登录用户的对象权限。
查看当前用户:
-- 查看当前用户的系统权限
select * from user_sys_privs;
-- 查看当前用户的角色权限
select * from user_role_privs
-- 查看当前用户的对象权限
select * from user_tab_privs;
-- 查看当前用户的概要文件
select profile from dba_profiles where profile like 'DBA_NEWS%';
查看指定用户:
-- 查看指定用户的角色权限
SELECT * FROM dba_role_privs where grantee = 'dba_news_user01';
-- 查看指定用户的对象权限
select * from dba_tab_privs;
-- 查看指定用户的概要文件
select profile from dba_profiles where profile like 'DBA_NEWS%';
-- 查看指定用户的系统权限(这里我们用like进行模糊查询,其系统查询的区别重点关注在前缀DBA上)
select grantee,privilege from dba_sys_privs where grantee like '%NEWS%';
bash
SQL> column grantee format a20
SQL> column privilege format a20
SQL>
SQL> select grantee,privilege from dba_sys_privs;
GRANTEE PRIVILEGE
-------------------- --------------------
SYS ALTER ANY ANALYTIC V
IEW
SYS DROP ANY HIERARCHY
DBA CREATE ANY HIERARCHY
DBA ALTER ANY ATTRIBUTE
DIMENSION
DBA CREATE ANY ATTRIBUTE
DIMENSION
********
753 rows selected.
SQL> select grantee,privilege from dba_sys_privs where grantee like '%NEWS%';
GRANTEE PRIVILEGE
-------------------- --------------------
DBA_NEWS_USER01 CREATE SESSION
SQL> SELECT * FROM dba_role_privs where grantee = 'dba_news_user01';
no rows selected
SQL>
2.2.授予权限(grant)
授予权限的对象就是用户或者角色,授予权限的操作包括授予系统权限和授予对象权限,在SQL*Plus中如何授予系统权限与对象权限。
在SQL*Plus中授予系统权限:
授予权限的操作一般是由数据库管理员来处理的,只有拥有了足够的权限才能够给其他用户授予权限。
2.2.1.授予系统权限
基本语法如下:
GRANT system_privilege | ALL PRIVILEGES TO { user IDENTIFIED BY password | role} [ WITH ADMIN OPTION]
说明:
1)system_privilege:系统权限名称。
2)ALL PRIVILEGES:可以设置除SELECT ANY DICTIONARY权限之外的所有系统权限。
3){user IDENTIFIED BY password | role | }: 设置权限的对象,user IDENTIFIED BY
password子句代表的是设置指定用户的权限;role代表的是设置角色的权限。
4)WITH ADMIN OPTION:设置该子句后,表示当前给予授权的用户还可以给其他用户进行系统权限的授予 。(注:with grant option,只针对对象层面授权,子子孙孙,无穷尽也)
示例:
grant create session to dba_news_user01;也可以为它加上WITH ADMIN OPTION管理选项,让dba_news_user01也具有授予create session的权限。
具体代码如下:
grant create session to dba_news_user01 with admin option;


2.2.2.授予对象权限
授予对象权限与授予系统权限的语法相似,只是有一点区别。具体语法如下:
GRANT object_privilege | ALL
ON schema.object
TO user | role
WITH ADMIN OPTION
WITH THE GRANT ANY OBJECT
说明:
1)object_privilege:对象权限的名称。
2)ALL:如果选择ALL,则代表授予用户所有的对象权限,这个权限在使用的时候一定要慎重。
3)schema.object:为用户授予对象权限所使用的对象。
4)user | role:user代表的是用户 / role代表的是角色。
5)WITH ADMIN OPTION:设置该子句后,表示当前给予授权的用户还可以给其他用户进行系统授权。
6)WITH THE GRANT ANY OBJECT:设置该子句后,表示当前给予授权的用户还可以给予其他用户对象权限。
示例:在SQL*Plus中授予用户对象权限
利用上面的语句,为用户dba_news_user01授予职工表:employee 查询和删除的权限。
具体代码如下:
grant select,delete on employee to dba_news_user01;
具体操作步骤:
1.在sys用户下创建表employee,并插入几条数据,如下图:

2.为用户dba_news_user01授予职工表:employee 查询和删除的权限。

3.在用户dba_news_user01下查询职工表,需在被授予用户下带上授予用户名

2.3.撤销用户权限(revoke)
撤销权限也叫收回权限,也就是删除用户的系统权限或者对象权限。
2.3.1.撤销系统权限
撤销系统权限的前提是当前的用户已经存在要撤销的系统权限,另外,撤销权限的操作只有数据库管理员才可以操作。
具体语法如下:
REVOKE system_privilege FROM user | role
2.3.2.撤销对象权限
撤销对象权限也使用REVOKE关键字完成。具体语法如下:
REVOKE object_privilege | ALL ON schema.object FROM user | role [CASCADE CONTRAINTS]
这里需要说明的就是CASCADE CONTRAINTS选项,它表示该用户授予其他用户的权限也一并撤销。
示例:撤销用户USER1的对象权限
利用上面的语法,完成撤销用户USER1的DELETE权限。具体代码如下:
REVOKE DELETE ON AA FROM USER1;
说明:在撤销用户权限时,撤销系统权限与撤销对象权限是不同的。如果撤销用户的系统权限,那么该用户授予其他用户的系统权限仍然存在;而撤销了用户的对象权限后,用户授予其他用户的对象权限也同时被撤销了
三、角色管理(像java中的封装 一次创建、多次使用)
角色在数据库中也是非常重要的一个名词,在数据库中角色并不是某个用户所独有的,而是用户可以根据权限的不同授予用户不同的角色。这种概念非常像Java中的封装的概念,该对象不是单独的为一个对象所服务,而是在将不同权限集合打包成一个角色供给其他任一合法用户使用。
试想:同一类型的用户,权限类型几乎相似或则直接就是一致的,叫你创建一百个用户,分别给这几个账户相同的权限,这个时候你要怎么处理呢?手动?
这时候如果要把这些权限封装成一个完整的对象,那么我们在赋权时只需调用这个角色就好了。
数据库中的角色可以授予多个用户也可以不授予用户,并且一个用户可以被授予多个角色。角色是在数据库中由数据库管理员定义的权限集合,方便对不同用户的权限授予。例如,如果在数据库中设置一个拥有能够查询数据库中表的权限的角色,那么凡是用户需要拥有查询数据库中表的权限时,都可以直接授予该角色。
3.1.查询角色
查询角色也是数据库管理员必须要做的工作,在SQL*Plus中查询角色是在数据库的数据字典DBA_ROLE_PRIVS中查询指定用户的角色。
常见的Oracle预定义角色:
-
DBA:拥有所有系统权限,是最高权限角色
-
CONNECT:基本连接权限(CREATE SESSION)
-
RESOURCE:开发人员权限(CREATE TABLE, PROCEDURE等)
-
SELECT_CATALOG_ROLE:查询数据字典的权限
-
EXECUTE_CATALOG_ROLE:执行部分系统包的权限
-
SCHEDULER_ADMIN:作业调度管理权限
3.1.1.查看当前数据库创建的角色信息
-- 查看所有角色(DBA视图)
SELECT role, password_required, authentication_type
FROM dba_roles
ORDER BY role;
-- 查看当前用户可看到的角色
SELECT * FROM user_roles;
-- 查看所有角色的创建时间等信息
SELECT role, created, oracle_maintained
FROM dba_roles
WHERE oracle_maintained = 'N' -- 只看用户创建的角色
ORDER BY created DESC;
3.1.2.查询指定用户的角色
示例:在数据字典DBA_ROLE_PRIVS中查询SYSTEM用户的角色
下面利用DBA_ROLE_PRIVS数据字典查询用户SYSTEM的角色,查询结果如下图所示:
column grantee format a20;
column granted_role format a20;
select * from dba_role_privs;
select * from dba_role_privs where GRANTEE = 'SYSTEM';


3.2.创建角色(包含授予角色本身权限)
在理解了角色是数据库管理员的好帮手之后,掌握在数据库中创建角色是至关重要的。那如何创建角色呢?在SQL*Plus中创建角色分为两个步骤。
3.2.1.创建角色
创建角色就是在数据库中创建一个只有名称的角色。
具体语法如下:
CREATE ROLE role
NOT IDENTIDIED\|IDENTIFIED BY\[password\]\|IDENTIFIED BY EXETERNALLY\|IDENTIFIED BY GLOBALLY
说明:
在创建角色时要注意验证的方式,可以选择的验证方式有四种:
第一种是NOT IDENTIDIED,不需要验证;
第二种是IDENTIFIED BY[password],这是口令验证的方式;
第三种是IDENTIFIED BY EXETERNALLY, 这是外部验证的方式;
第四种是 IDENTIFIED BY GLOBALLY,这是全局验证方式。
3.2.2.授予角色权限
授予角色权限与授予用户权限所使用的语法一样,只是授予对象不是用户而是角色。授予角色系统权限的语法和授予角色对象权限的语法不同。
授予角色系统权限具体语法如下:
GRANT system_privilege | ALL PRIVILEGES TO role [WITH ADMIN OPTION]
在给角色授予权限时,数据库管理员必须拥有GRANT_ANY_PRIVIEGES权限才可以给角色赋予任何权限
示例:
-- 创建不需要密码的角色
CREATE ROLE clerk;
-- 创建需要密码的角色
CREATE ROLE manager IDENTIFIED BY manager123;
-- 创建外部认证角色
CREATE ROLE app_user IDENTIFIED EXTERNALLY;
实例:在SQL*Plus中创建角色
下面就利用上面的两个步骤来创建角色testrole,并给角色授予CREATE SESSION权限。具体代码如下:
CREATE ROLE testrole NOT IDENTIFIED;
GRANT CREATE SESSION TO testrole;
这样,就在数据库中创建了一个拥有CREATE SESSION的角色TESTROLE。用户可以根据创建角色的步骤,创建不同验证方式和授予不同权限的角色。
bash
SQL> CREATE ROLE testrole NOT IDENTIFIED;
Role created.
SQL> GRANT CREATE SESSION TO testrole;
Grant succeeded.
SQL> desc dba_role_privs
Name Null? Type
----------------------------------------- -------- ----------------------------
GRANTEE VARCHAR2(128)
GRANTED_ROLE VARCHAR2(128)
ADMIN_OPTION VARCHAR2(3)
DELEGATE_OPTION VARCHAR2(3)
DEFAULT_ROLE VARCHAR2(3)
COMMON VARCHAR2(3)
INHERITED VARCHAR2(3)
SQL> desc dba_roles
Name Null? Type
----------------------------------------- -------- ----------------------------
ROLE NOT NULL VARCHAR2(128)
ROLE_ID NOT NULL NUMBER
PASSWORD_REQUIRED VARCHAR2(8)
AUTHENTICATION_TYPE VARCHAR2(11)
COMMON VARCHAR2(3)
ORACLE_MAINTAINED VARCHAR2(1)
INHERITED VARCHAR2(3)
IMPLICIT VARCHAR2(3)
EXTERNAL_NAME VARCHAR2(4000)
SQL> column role format a20
SQL> column external_name format a20
SQL> select * from dba_roles where role = 'testrole';
no rows selected
SQL> select * from dba_roles where role = 'TESTROLE';
ROLE ROLE_ID PASSWORD AUTHENTICAT COM O INH IMP
-------------------- ---------- -------- ----------- --- - --- ---
EXTERNAL_NAME
--------------------
TESTROLE 76 NO NONE NO N NO NO
SQL>
3.3.修改角色
角色创建完成后,如果想要修改其内容,可以修改角色中已经授予的角色以及权限。在SQL*Plus中修改角色的语法如下:
ALTER ROLE role
NOT IDENTIDIED \| IDENTIFIED BY \[password\] \| IDENTIFIED BY EXETERNALLY \| IDENTIFIED BY GLOBALLY
上面的语法只是修改角色本身,如果修改已经授予角色的权限或者角色,则要使用GRANT或者REVOKE来完成。
3.4.删除角色
如果要移除不用的角色,可以在企业管理器中删除角色,也可以在SQL*Plus中删除角色。下面就分别讲解用这两种方式删除角色
在SQL*Plus中删除角色也是非常容易的,删除角色的语法如下:
DROP.ROLE rolename
这里,rolename就是数据库中要删除的角色名称。