Oracle学习 第11天
—— 权限和角色详解
之前安装Oracle数据库时,也有提到过一点关于SCOTT用户的权限分配。
我们知道,当用户刚刚建立时,是没有任何权限的,也无法执行任何的操作。
如果想要执行某种特定的数据库操作,则必须为其授予系统权限;如果想要访问其他方案的对象,则必须为其授予对象权限。
为了简化权限的管理,可以使用角色。角色是一种可以自定义包含一系列的权限的集合。
基本概念
权限分为系统权限和对象权限两种。系统权限总计 160+ 种(新版本Oracle中200+种),对象权限总计 17 +种。
系统权限即对数据库本身的操作和对数据对象本身的增删改操作的权限。
比如: CREATE TABLE 权限允许用户在自己的方案中创建表;
CREATE ANY TABLE 权限允许用户在任何方案中创建表;
对象权限是指对数据对象的信息的增删改查操作的权限。
方案是Oracle管理数据对象的方式,当一个用户创建了任意一个数据对象后,DBMS就会创建一个与用户名同名的方案,该用户所创建的所有数据对象就默认的保存在该方案中;
角色也分为预定义角色和自定义角色两种。
预定义角色即系统本身已经定义完成的权限集合。
自定义角色即用户自己定义角色并赋予一系列的权限集合。
系统权限
查看系统权限可以使用如下SQL语句:
SELECT * FROM System_Privilege_Map ORDER BY NAME;
常用的系统权限主要有:
CREATE SESSION --- 连接数据库
CREATE TABLE --- 创建表
CREATE VIEW --- 创建视图
CREATE PUBLIC SYNONYM --- 创建同义词
CREATE PROCEDURE --- 创建过程、函数、包
CREATE TRIGGER --- 创建触发器
CREATE CLUSTER --- 创建簇
授予系统权限
一般,授予系统权限的操作是由 DBA 完成的。 DBA 是预定义角色中的一种。具有比较高的权限。
如果是非 DBA 角色的用户,想要对其它用户授予系统权限,则需要具有 GRANT ANY PRIVILEGE 的系统权限。
可以带 with admin option 选项。意为:被授予权限的用户可以将刚才授予的权限继续转授向其它用户。
CREATE USER jack IDENTIFIED BY userpwd; -- 创建用户。该操作一般由SYSTEM用户来完成
GRANT CREATE SESSION TO jack WITH ADMIN OPTION; -- 对用户jack赋予create session(连接数据库)的权限,并允许jack用户继续向其他用户转授该权限
GRANT CREATE TABLE, CREATE VIEW TO jack; -- 对用户jack赋予create table(创建表)的权限,但不允许jack用户向其他用户转授该权限
回收系统权限
一般,回收系统权限的操作也是由 DBA 完成的。
如果是非 DBA 角色的用户,想要对其它用户进行回收系统该权限操作。则需要具有相应的系统权限。或者由转授该全选的用户亲自回收。
REVOKE CREATE TABLE FROM jack; -- 回收jack的create table权限
★ 注意:Oracle的系统权限回收不是级联回收。
即 dba 角色对 user1 赋予权限1,并允许其转授,user1 将权限1 转授与 user2 ,此时,如果 dba 回收 user1 的权限,user2 的权限依旧可以使用。
对象权限
指的是访问其他方案对象的权利。
用户默认可以访问自己方案的对象,无需特意授权。
但是,如果想要访问其他方案的对象,就必须具有访问的对象权限。
查看对象权限可以使用如下SQL语句:
SELECT DISTINCT PRIVILEGE FROM dba_tab_privs; -- 只能在 dba 用户下查询
常用的对象权限主要有:
ALTER --- 修改
DELETE --- 删除
SELECT --- 查询
INSERT --- 添加
UPDATE --- 修改
INDEX --- 索引
REFERENCES --- 引用
EXECUTE --- 执行
授予对象权限
授予对象权限的操作一般是由对象的所有者来操作完成。如果用其他用户操作,则需要具有相应的权限。
从Oracle9i开始, SYS和SYSTEM用户可以将任何对象上的对象权限赋予其他用户。
GRANT 对象权限 ON 数据库对象 TO 用户名 [WITH GRANT OPTION]; --基本语法
GRANT 对象权限 ON 数据库对象 TO 角色名; --对象权限可以直接赋给角色
GRANT UPDATE ON scott.emp TO jack; -- 赋予jack用户修改 scott 方案下的 emp 表的权限
GRANT ALL ON scott.emp TO jack; -- 赋予jack用户操作 scott 方案下的 emp 表的所有权限
回收对象权限
回收对象权限的操作一般也是由对象的所有者来操作完成。在9i以上版本中,也可以使用 DBA 用户完成。
REVOKE 对象权限 ON 数据库对象 FROM 用户名[角色名] -- 基本语法
REVOKE UPDATE ON scott.emp FROM jack; -- 回收jack用户修改 scott 方案下的 emp 表的权限
REVOKE ALL ON scott.emp FROM jack; -- 回收jack用户操作 scott 方案下的 emp 表的所有权限
★ 注意:Oracle的对象权限回收是级联回收。
角色管理
角色是一组权限的集合。存在的目的就是简化对权限的管理。
当多个用户需要使用相同的一组权限时,就可以将这组权限赋给角色,然后将角色赋给这些用户。
预定义角色
预定义角色指数据库本身提供的角色。每种角色都用于执行一些特定的管理任务。
角色中可以包含对象权限,也可以包含系统权限。
查看预定义角色(50+种):
SELECT * FROM dba_roles
常见的预定义角色:
CONNECT -- 仅包含了CREATE SESSION权限。该角色的用户具有连接数据库的权限
RESOURCE -- 包含了常见的创建表、视图、序列等权限(见“查看角色对应权限”示例)
★ 需要注意的是:除了查询到的 8 中权限外。RESOURCE 实际上还有一个隐藏权限 UNLIMITED TABLESPACE
DBA -- 具有所有的系统权限,以及with admin option选项。即所有的 dba 角色的用户都可以将任何系统权限授予其他用户,并且允许转授权限。默认的 dba 用户只有 SYS 和 SYSTEM 两个。
★ 需要注意的是:DBA 角色不具备启动和关闭数据库的权限。
查看角色对应的权限:
SELECT * FROM dba_sys_privs WHERE grantee = 'RESOURCE'; -- 切记权限名区分大小写,Oracle中的权限都是大写
为用户赋予角色:
GRANT RESOURCE TO jack; -- 对jack用户赋予 RESOURCE 角色
查看用户对应的角色:
SELECT * FROM dba_role_privs WHERE grantee = 'SYS'; -- 查看 SYS 用户拥有的角色
自定义角色
自定义角色由使用者自己定义需要包含的权限。
创建自定义角色
一般该操作由 DBA 来完成。如果其他用户想创建自定义角色,需要具有 CREATE ROLE 的系统权限。
CREATE ROLE 角色名 NOT IDENTIFIED; --创建公用角色。不验证
CREATE ROLE 角色名 IDENTIFIED BY rolepassword; -- 创建验证角色。激活该角色时,必须提供口令
删除角色
一般该操作由 DBA 来完成。如果其他用户想删除角色,需要具有 DROP ANY ROLE 的系统权限。
DROP ROLE 角色名;