1 概述
权限管理是 Oracle 系统的精华
不同用户登录到同一个数据库中,可能看到不同数量的表,拥有不同的权限
授权&回收:
-- 授予 hr 用户 scott.emp 表权限
grant select, insert on scott.emp to hr;
-- 回收 hr 用户 scott.emp 表权限
revoke select, insert on scott.emp from hr;
2 分类
区别:'权限的 颗粒度 不同'
1. 系统权限 'dba_sys_privs' :针对 '用户',如: scott
2. 对象权限 'dba_tab_privs' :针对 '数据库对象',如: table、view、package
3. 角色权限 'dba_role_privs':一组权限的集合
2.1 系统权限
1. 部分系统权限展示(针对 '用户')
(1) CREATE TABLE
(2) ALTER TABLESPACE
(3) DEBUG ANY PROCEDURE
2. 常见系统权限所属的角色
(1) connect : 只能登陆 Oracle,不可以创建实体,不可以创建数据库结构
(2) resource: 只可以创建实体,不可以创建数据库结构
(3) dba : 拥有全部特权,是系统最高权限,只有 DBA 才可以创建数据库结构
select * from dba_roles t where t.role in ('CONNECT', 'RESOURCE', 'DBA');
其中:
(1) 对于普通用户 : grant connect, resource to 普通用户;
(2) 对于DBA用户 : grant dba to DBA用户; -- dba 含所有特权!(包括 connect、resource)
3. 查询语句
select t.* from dba_sys_privs t;
4. 说明
(1) 系统权限只有 DBA 用户才能回收
2.2 对象权限
1. 部分对象权限展示(针对 '数据库对象')
(1) SELECT、INSERT、UPDATE、DELETE
(2) EXECUTE
(3) ALTER
2. 常见对象权限所属的角色
(1) dba : 普通 dba 权限
(2) public: "公共" 权限,任何用户均可访问 -- 创建 public synonym 时,就在此用户下
3. 查询语句
select t.* from dba_tab_privs t;
4. 说明
(1) grantee:受赠人
(2) grantor:授予人
关系:'授予人(grantor)' 将自己的 '权限(privilege)' 给 '受赠人(grantee)'
2.3 角色权限
1. 部分角色权限展示(一组权限的 '集合')
(1) connect, resource, dba
2. 用户也可自定义角色,语法如下:
create role <role_test>;
grant create any table, create procedure to <role_test>;
grant <role_test> to <user_test>;
drop role <role_test>;
3. 查询语句
select t.* from dba_role_privs t;
3 示例
3.1 权限回收
语法:
-- 授权
grant 权限1[, 权限2] on 属主.对象 to 用户 [with grant|admin option];
-- 回收权限
revoke 权限1[, 权限2] on 属主.对象 from 用户;
举例:
-- 授予 hr 用户 scott.emp 表权限
grant select, insert on scott.emp to hr;
-- 回收 hr 用户 scott.emp 表权限
revoke select, insert on scott.emp from hr;
3.2 权限传递
结论:
在 Oracle 授权时,有两个可选项
1. with admin option
(1) 被授权用户可以将所获得的权限 '再次授予' 其它用户或角色
(2) 取消授权时,'不级联'
(3) 用于 "系统权限",可通过 user_sys_privs 等方式进行查询
(4) 被授权的用户 '可以' 自己解除自己的权限
2. with grant option
(1) 同上 '(1)'
(2) 取消授权是,'级联'
(3) 用于 "对象权限",可通过 user_tab_privs 等方式进行查询
(4) 被授权的用户 '不可以' 自己解除自己的权限
with admin option 演示:(‘系统权限’ 传递)
with admin option 演示:('系统权限' 传递)
1. 准备 3 个测试用户
(1) system : grant create table to hr with admin option;
(2) hr : grant create table to odsdata;
(3) odsdata: create table table_test(sno number(3));
-- osdata: select table_test 成功!
2. 回收权限
(1) system : -- revoke create table from hr;
(2) hr : revoke create table from hr;
(3) odsdata: create table table_test2(sno number(3));
-- odsdata: create table table_test2 失败!
-- 但 select table table_test1 仍旧可以!
with grant option 演示:(‘对象权限’ 传递)
with grant option 演示:('对象权限' 传递)
1. 准备 3 个用户测试
(1) system : grant select on scott.emp to hr with grant option;
(2) hr : grant select on scott.emp to odsdata;
(3) odsdata: select * from scott.emp;
-- odsdata 查询成功!
2. 回收权限
(1) system : revoke select on scott.emp from hr;
(2) hr : select * from scott.emp;
(3) odsdata: select * from scott.emp;
-- hr 和 odsdata 均查询失败!