Oracle+11g+笔记(6)-数据库用户管理
6、数据库用户管理
6.1 权限授予
6.1.1 直接授权
直接授权是指通过GRANT
语句直接把权限授予用户,包括系统权限
的授权和对象权限
的授权两种情况。
6.1.1.1 系统权限的授权
在创建用户后,如果没有给用户授予相应的系统权限,则用户不能连接到数据库,因为该用户缺少创建会话的权
限。
在数据库中要进行某一种操作时,用户必须具有相应的系统权限,系统权限是由数据库管理员为用户授予的。向用
户授予权限语句为GRANT
,其语法格式为:
GRANT 系统权限 TO {PUBLIC|role|usemame}[WITH ADMIN OPTION]
提示:在为用户授权时,可以使用WITH ADMIN OPTION
选项,表示该用户可以将其所有权再授予其他用户,并且
该用户还可以将授予的权限再回收。
在Oracle
数据库中,用户SYSTEM
、SYS
是数据库管理员,它具有DBA
所有系统权限,包括
SELECT ANY DICTIONARY
权限,所以SYSTEM
和SYS
用户可以查询数据字典中以DBA
开头的数据字典视图、创建
数据库结构等。
在Oracle 11g
中有206
个系统权限。可以在数据字典表SYSTEM_PRIVILEGE_MAP
中看到所有这些权限,用
SELECT
语句可以查询这些权限。
SELECT * FROM SYSTEM_PRIVILEGE_MAP;
PRIVILEGE|NAME |PROPERTY|
---------+------------------------------+--------+
-3|ALTER SYSTEM | 0|
-4|AUDIT SYSTEM | 0|
-5|CREATE SESSION | 0|
-6|ALTER SESSION | 0|
-7|RESTRICTED SESSION | 0|
-10|CREATE TABLESPACE | 0|
-11|ALTER TABLESPACE | 0|
-12|MANAGE TABLESPACE | 0|
-13|DROP TABLESPACE | 0|
-15|UNLIMITED TABLESPACE | 0|
-20|CREATE USER | 0|
-21|BECOME USER | 0|
-22|ALTER USER | 0|
-23|DROP USER | 0|
-30|CREATE ROLLBACK SEGMENT | 0|
......
SELECT count(*) FROM SYSTEM_PRIVILEGE_MAP;
COUNT(*)|
--------+
208|
提示:系统权限中有一种ANY
权限,具有ANY
权限的用户可以在任何用户模式中进行操作。
系统权限可以划分为群集权限、数据库权限、索引权限、过程权限、概要文件权限、角色权限、回退段权限、序列
权限、会话权限、同义词权限、表权限、表空间权限、用户权限、视图权限、触发器权限、专用权限、其他权限
等。
connect sys/sysroot as sysdba;
create user User1 identified by 123456;
GRANT sysdba to User1;
connect User1/123456 as sysdba;
connect sys/sysroot as sysdba;
SQL> create user User2 identified by 123456
2 DEFAULT TABLESPACE users
3 TOMPORARY TABLESPACE temp;
GRANT create session to User2;
6.1.1.2 对象权限的授予
对象权限是用户之间的表、视图、序列等模式对象的相互存取操作的权限。对属于某一用户模式的所有模式对象,
该用户对这些模式对象具有全部的对象权限,也就是说,模式的拥有者对模式中的对象具有全部对象权限。同时,
模式的拥有者还可以将这些对象权限授予其他用户。
按照不同的对象类型,Oracle
数据库中设置了不同种类的对象权限。对象权限及对象之间的对应关系如表所示。
对象权限由该对象的拥有者为其他用户授权,非对象的拥有者不得为对象授权,将对象权限授出后,获权用户可以
对对象进行相应的操作,没有授予的权限不得操作。对象权限被授出后,对象的拥有者属性不会改变,存储属性也
不会改变。
使用GRANT
语句可以将对象权限授予指定的用户、角色、PUBLIC公共用户组,其语法格式如下:
GRANT [object_privilege|ALL[PRIVILEGES]ON[schema.]object TO{user|role|PUBLIC}
其中,对象权限是上表中某一类对象的相应权限,多个权限之间用逗号隔开,多个用户名之间也用逗号隔开,角色
表示数据库中已创建的角色。PUBLIC 表示将该对象权限授予数据库中全体用户。
一个用户没有其他用户的对象权限,所以不能访问其他用户的对象。但是,如果把另外一个用户的某种对象权限授
予该用户,该用户就具备了相应的访问对象的权限。
SQL>CONNECT hr/hrroot
SQL>GRANT select,insert,update ON employees TO User2;
SQL>CONNECT User2/123456;
SQL>SELECT FIRST_NAME,LAST_NAME,JOB_ID,SALARY FROM hr.employees where salary>15000;
SQL> SELECT FIRST_NAME,LAST_NAME,JOB_ID,SALARY FROM hr.employees where salary>15000;
FIRST_NAME LAST_NAME JOB_ID SALARY
-------------------- ------------------------- ---------- ----------
Steven King AD_PRES 24000
Neena Kochhar AD_VP 17000
Lex De Haan AD_VP 17000
6.1.2 授权角色
可以使用角色为用户授权,同样也可以从用户中回收角色。由于角色集合了多种权限,所以当为用户授予角色时,
相当于为用户授予了多种权限。这样就避免了向用户逐一授权,从而简化了用户权限的管理。
在为用户授予角色时,既可以向用户授予系统预定义的角色,也可以自己创建角色,然后再授予用户。在创建角色
时,可以为角色设置应用安全性。角色的应用安全性是通过为角色设置密码进行保护的,只有提供正确的密码才能
允许修改或设置角色。
提示:权限、角色不仅可以被授予用户,也可以被授予用户组(public)。当将权限或角色授予public之后,会使得
所有用户都具有该权限或角色。
通过查询数据字典DBA_ROLES
可以了解数据库中全部的角色信息,其查询语句如下:
SELECT * FROM dba_roles;
ROLE |PASSWORD_REQUIRED|AUTHENTICATION_TYPE|
---------------------------+-----------------+-------------------+
CONNECT |NO |NONE |
RESOURCE |NO |NONE |
DBA |NO |NONE |
SELECT_CATALOG_ROLE |NO |NONE |
EXECUTE_CATALOG_ROLE |NO |NONE |
DELETE_CATALOG_ROLE |NO |NONE |
EXP_FULL_DATABASE |NO |NONE |
IMP_FULL_DATABASE |NO |NONE |
LOGSTDBY_ADMINISTRATOR |NO |NONE |
DBFS_ROLE |NO |NONE |
AQ_ADMINISTRATOR_ROLE |NO |NONE |
DBA
角色拥有所有系统级权限。通常,角色CONNECT
、RESOURCE
和 DBA
主要用于数据库管理。对于数据库管理
员需要分别授予CONNECT
、RESOURCE
和DBA
角色。对于数据库开发用户需要分别授予CONNECT
和RESOURCE
角
色。
如果系统预定义的角色不符合用户的需要,数据库管理员还可以创建更多的角色。
创建角色的用户必须具有CREATE ROLE
系统权限。
在角色刚刚创建时,它并不具有任何权限,这时的角色是没有用处的。因此,在创建角色后,通常还需要立即为它
授予权限。
create role access_database;
GRANT create session,create table,create view to access_database;
GRANT access_database to User1;
注意:在一个GRANT语句中,可以同时为用户授予系统权限和角色,但不能同时授予对象权限和角色。
在创建角色时也可以为角色指定密码,带有密码的角色在修改时,必须提供密码,否则系统将拒绝对角色的修改,
CREATE role manager identified by 123456;
GRANT create session,create table to manager;
Oracle 数据库中,数据库管理员通常通过角色来管理系统权限,即将角色授予用户,而不是直接为用户授予系统
权限。在实际的应用中,可以将用户分组,同组用户使用同一角色,这样他们的权限就相同,当需要为用户增加或
减少权限时,只要为角色增加或减少权限即可。
将角色授予用户后,角色信息被存储在用户数据字典USER_ROLE_PRIVS
中,通过查询该数据字典可以了解用户自
己所具有的角色:
select username,granted_role,admin_option from user_role_privs;
SQL> select username,granted_role,admin_option from user_role_privs;
USERNAME GRANTED_ROLE ADM
------------------------------ ------------------------------ ---
HR PLUSTRACE NO
HR RESOURCE NO
查看角色拥有的权限:
select * from role_sys_privs where role='ACCESS_DATABASE'
ROLE |PRIVILEGE |ADMIN_OPTION|
---------------+--------------+------------+
ACCESS_DATABASE|CREATE TABLE |NO |
ACCESS_DATABASE|CREATE VIEW |NO |
ACCESS_DATABASE|CREATE SESSION|NO |
6.1.3 使用 ALTER USER 语句修改用户的默认角色
默认角色是当用户登录到数据库时由Oracle
自动启用的一种角色。当某一角色被授予用户后,该角色即成为该用
户的默认角色。可以使用ALTER USER
语句来修改用户的默认角色。语法格式如下:
ALTER USER useuname [default role[role_name[,role_name,...]] | all [except role_name[,
role_name,...]] | none];
其中,default role
表示默认角色;使用关键字all
可以设置该用户的所有角色;使用except
则可以设置某角
色外其他所有角色生效;none
则设置所有角色为失效状态。
1、设置用户角色失效
要使用户的角色失效,可以使用ALTER USER USER_NAME DEFAULT ROLE NONE
语句。
connect sys/sysroot as sysdba;
alter user user1 default role none;
用户的角色失效后,该用户角色中的权限将全部丢失。用户连接数据库权限CREATE SESSION
存储于ACCESS
DATABASE
中,当该角色失效后,用户user1
将不能再登录到数据库中。
2、设置用户角色生效
用户的默认角色失效后,可以重新设置为生效。设置为生效后,用户的相应权限又可以再次被使用。修改用户的角
色生效语句如下:
ALTER USER USER_NAME DEFAULT ROLE ALL
ALTER USER user1 DEFAULT ROLE ALL
提示:使用ALTER USER USER_NAME DEFAULT ROLE ALL EXCEPT
命令,可以启用除某个角色之外的其他所有角
色。
6.1.4 使用SET ROLE控制角色使用
可以为数据库用户的会话启用或禁用角色。如果数据库管理员没有为用户取消所有默认角色,则该用户的会话将启
用所有已经授予的角色。可以通过查询数据字典视图SESSION_ROLES
,查看当前数据库会话启用了哪些角色。
可以使用SET_ROLE
语句控制角色失效或生效。SET ROLE
语句的语法为:
SET ROLE[role [identified by password][,role[identified by password]...]|ALL[EXCET role[,
role]] | NONE];
其中,使用带ALL
选项的SET ROLE
语句时,将启用用户被授予的所有角色,使用ALL 选项有一个前提条件是该用
户的所有角色不得设置密码。EXCEPT ROLE
表示除指定的角色外,启用其他全部角。NONE
表示使用户的所有角色
失效。
【演示启用/禁用角色】
# step1 使user1用户没有默认角色
connect sys/sysroot as sysdba;
alter user user1 default role none;
grant connect,resource to user1;
alter user user1 default role connect,resource;
select GRANTED_ROLE,ADMIN_OPTION,DEFAULT_ROLE from dba_role_privs where GRANTEE = 'USER1';
GRANTED_ROLE |ADMIN_OPTION|DEFAULT_ROLE|
---------------+------------+------------+
ACCESS_DATABASE|NO |NO |
CONNECT |NO |YES |
RESOURCE |NO |YES |
# step2 以用户user1登录到数据库,查看SESSION ROLES视图确认会话所用的角色
connect user1/123456;
select * from session_roles;
ROLE|
-----------+
CONNECT
RESOURCE
可以看出,ACCESS DATABASE
角色已不再有效,用户当前的会话只启用了CONNECT
和 RESOURCE
角色。
# step3 为当前数据库会话启用ACCESS DATABASE角色
connect user1/123456;
set role access_database;
select * from session_roles;
ROLE
------------------------------
ACCESS_DATABASE
可以看出,SETROLE
强制当前会话使用ACCESS DATABASE
角色。
# step SET ROLE NONE语句强制当前会话禁用所有角色,这样当前用户的会话将失去所有权限
conn user1/123456;
set role none;
select * from session_roles;
------------------------------
未选定行
create table temp (id number,name varchar2(20)) tablespace USERS;
------------------------------
第1行出现错误:
ORA-01031:权限不足
6.2 回收权限
当用户不使用某些权限时,就尽量收回权限,只保留其最小权限。包括回收权限、撤销角色、删除数据库对象和删
除用户。
6.2.1 逐一回收
如果用户的某一权限不使用时,可以使用REVOKE
语句逐一回收的方式收回权限。
1、系统权限的回收
数据库管理员或者具备向其他用户授权的用户都可以使用REVOKE
语句将授予的权限回收。REVOKE
语句格式如
下:
REVOKE 系统权限 FROM {PUBLIC|role|usemame}
CONNECT sys/sysroot AS sysdba
REVOKE select any dictionary FROM scott;
用户的系统权限被回收后,相应的权限传递同时被回收。在回收系统权限时,经过传递获得的权限的用户不受影
响。
2、对象权限的回收
对象的拥有者可以将授出的权限收回,回收对象权限可以使用REVOKE
语句,使用该语句回收对象权限的语法如
下:
REVOKE { object-privilege | ALL [PRIVILEGES]} ON [schema.]object FROM{user|role|
PUBLIC};
回收对象权限时,授权者只能从自己授权的用户那里回收对象权限。如果被授权用户基于一个对象权限创建了过
程、视图,那么当回收该对象权限后,这些过程、视图将变为无效。
CONNECT hr/hrroot
REVOKE select on employees from user1;
CONNECT hr/hrroot
REVOKE all on employees from public;
在回收对象权限时,经过传递获得权限的用户会受到影响。
6.2.2 删除角色
如果不再需要某个角色或者某个角色的设置不太合理时,就可以使用DROP ROLE
来删除角色,使用该角色的用户
的权限同时也被回收。
conn sys/sysroot
DROP ROLE access_database;
6.2.3 删除数据库对象
Oracle
数据库对象中最基本的是表和视图,其他还有约束、序列、函数、存储过程、包、触发器、索引等。删除
数据库对象后,也就删除了用户或角色对该数据库对象的访问权限。
删除数据库表使用DROP TABLE
命令,其语法格式为:
DROP TABLE[schema.]table_name[CASCADE CONSTRAINTS];
删除表后,表上的索引、触发器、权限、完整性约束也同时被删除。如果删除的表涉及引用主键或唯一关键字的完
整性约束时,那么DROP TABLE
语句就必须包含CASCADE CONSTRAINTS
子串。
视图是一个或多个表中的数据的简化描述,用户可以将视图看成一个存储查询或一个虚拟表。删除视图使用
DROP VIEW
命令,其语法格式为:
DROP VIEW view_name;
需要注意的是,将视图定义从数据字典中删除,基于视图的权限也同时被删除,其他涉及到该视图的函数、视图、
程序等都将被视为非法。
6.2.4 删除用户
当删除一个用户时,系统会将该用户账号以及用户模式的信息从数据字典中删除。用户被删除后,用户创建的所有
数据库对象也被全部删除。删除用户可以使用DROP USER
语句。
如果用户当前正连接到数据库,则不能删除该用户,必须等到该用户退出系统后再删除。如果要删除的用户模式中
包含有模式对象,则必须在DROP USER
语句中带上CASCADE
关键字,那么就会在删除用户时也将该用户创建的模
式对象全部删除。
CONNECT sys/sysroot
DROP USER user2;
6.3 不同用户权限管理
Oracle
数据库系统中的用户包括最终用户(即连接、登录和操作数据库的人员)、应用程序开发人员(使用Oracle
数据库进行应用程序开发的人员)、数据库管理员(DBA
)等,其中最高的权限属于SYSDBA
。
SYSDBA
具有控制Oracle
一切行为的特权,如创建、启动、关闭、恢复数据库等。使数据库归档/非归档,备份表
空间等关键性的动作只能通过具有SYSDBA
权限的用户来执行。这些任务即使是普通DBA
角色也不行。
一般对SYSDBA
的管理有操作系统认证
和密码文件认证
两种方式。具体选择哪一种认证方式取决于:是在 Oracle
运行的机器上维护数据库,还是在一台机器上管理分布于不同机器上的所有的Oracle 数据库。若选择在本机维护
数据库,则选择操作系统认证;若有很多数据库想进行集中管理,则可以选择密码文件认证方式。
6.4 管理对数据库对象的访问
Oracle 实现对数据库对象的访问管理,包括使用用户口令、使用权限控制、使用存储过程控制、使用数据库链
接、使用配置文件等。
6.4.1 使用用户口令
CONNECT sys/sysroot as sysdba;
CREATE USER user1 IDENTIFIED BY teacher;;
connect user1/teacher;
6.4.2 使用权限控制
为了执行基本的数据库操作,应该给数据库管理员授予管理权限。这些管理权限是通过两个专用的系统权限来授予
的,即SYSDBA
和SYSOPER
根据所需的授权级别,授予一个管理权限。Oracle 数据库也可以使用权限控制用户对
数据库的操作,保证数据库的安全性。包括使用系统权限和管理权限来进行控制。
6.4.3 使用数据库链接
数据库链接(Database Link)是在分布式环境下,为了访问远程数据库而创建的数据通信链路。数据库链接隐藏了
对远程数据库访问的复杂性。通常将正在登录的数据库称为本地数据库,另外一个数据库称为远程数据库。有了数
据库链接,便可以直接通过数据库链接来访问远程数据库的表。常见的形式是访问远程数据库固定用户的链接,即
链接到指定的用户,创建该形式的数据库链接的语法格式如下:
CREATE DATABASE LINK link_name CONNECT TO user IDENTIFIED BY password USING
'server_name';
-
link_name
:表示要链接的远程数据库名。 -
user
与password
:分别表示账户及对应的账户密码。 -
server name
:远程数据库服务名。
创建数据库链接时,所要连接数据库的用户应具有CREATE DATABASE LINK
系统权限。数据库链接一旦建立并测
试成功,就可以使用表名@数据库链接名
的形式来访问远程用户的表。
6.4.4 使用配置文件
用户配置文件是Oracle
安全策略的重要组成部分,利用用户配置文件可以对数据库用户进行基本的资源限制,并
且可以对用户的密码进行管理。
在安装数据库时,Oracle
会自动建立名为DEFAULT
的默认资源文件。如果没有为新创建的用户指定配置文件,
Oracle将会自动为它指定DEFAULT
资源文件。另外,如果用户在自定义的资源文件中没有指定某项参数,Oracle
也会使用 DEFAULT 资源文件中相应参数设置作为默认值。
1、利用用户配置文件
利用用户配置文件,可以对系统资源进行限制,其具体介绍如表所示。
2、密码限制次数
用户配置文件除了可以用于资源管理外,还可以对用户的密码策略进行控制。使用配置文件可以实现账户的锁定、
密码的过期时间、密码的复杂度三种密码管理。
在资源配置文件中,对用户密码的限制参数如表所示。
3、管理用户配置文件
用户配置文件实际上是对用户使用的资源进行限制的参数集。一般来说,为了有效地节省系统硬件资源,在设置配
置文件中的限制参数时,通常会设置SESSION_PER_USER
和IDLE_TIME
,以防止多个用户使用同一个用户账号连
接,并限制会话的空闲时间,而对于其他限制参数则不进行设置。
此外,还可以通过查询数据字典的DBA_PROFILES
视图来查看配置文件信息。