Oracle 权限介绍及管理

 Oracle权限分为两种:
分别是
系统权限(system privileges):  包括创建/删除表 , 创建删除用户等.
对象权限(object privileges)操控数据库特定对象的 内容,例如select某张表,插入数据到某张表等.

另外介绍个概念:
方案(schema): is a collection of database objects (used by a user.).
就是对象的集合啦,例如表,试图,,索引的集合.


1.系统权限(system privileges)
对用户和角色来讲,oracle大概有100多个不同的系统权限,系统权限一般由dba提供.
典型的系统权限如下表:


1.1 创建用户
语法如下:
CREATE USER username
IDENTIFIED BY passwd;

前提系你必须具有CREATE USER的权限, 一般只有DBA才有这个权限啦~
如下图,创建1个用户Bill

 
1.2 使用系统权限
一旦1个用户被创建,DBA就能指定系统权限给这个用户.
语法如下:
GRANT PRIVILEGE [privilege,.....]
TO  [user1,user2...| role, PUBLIC];

其中role就是角色啦, 至于PUBLIC就是之所有用户啦,慎用啊.
一般来讲1个程序员帐号需要如下权限:
CREATE SESSION (连接数据库啊必要啊)/ CREATE TABLE/ CREATE SEQUENCE /CREATE VIEW/ CREATE PROCEDURE

下图给用户BILL分配这些权限:

 
一旦dba分配权限给用户,用户就立即可使用它们.
如下图oracle这时已经可以用BILL账户登陆了:

 
1.2.1 查看用户默认表空间和临时表空间
可以查看user_users 视图来查看用户的默认表空间和临时表空间:

 
可看出BILL账户的默认表空间是USERS, 临时表空间是TEMP啦

1.2.2 修改用户默认表空间和临时表空间
注意这个动作一般只有DBA可以执行, ALTER USER的权限. 下图把BILL账户的默认表空间改成了TS_EXAMPLE



这时我们用BILL账户尝试建几张表,
如下图, 当建表语句没有制定表空间时,那张表默认就存放在TS_EXAMPLE.
1003213

那么如果在建表时指定表空间呢,例如想在SYSTEM表空间建1张表,允吴允许咧?
答案是肯定的,1个具有CREATE TABLE权限的用户可以在任何表空间建立新表. 如下图

 

  1.2.3 表空间配额 quota

那么就是否1个居有CREATE table的user就可以无限制的使用任何表空间呢? 答案是否定的.
BILL虽然可以无限制地建新表,但他甚至无法插入数据到自己的默认表空间..


如上图呢个悲剧,系统表示BILL账户没有权限使用TS_EXAMPLE, 其实也就是说BILL在TS_EXAMPLE的配额空间为0;
这时是无法插入新数据的.(查询另说)
可以查看user_tablespaces可以知道账户具有那些表空间的权限(插入数据的权限),如下图,BILL没有任何表空间的配额



 这时就需要给BILL分配表空间配额,语法如下:
alter user username quota xxx on tablespace_name;

或者在创建用户时同时指定表空间配额:
CREATE USER username
IDENTIFIED BY passwd
DEFAULT TABLESPACE tp_name1
TEMPORARY TABLESPACE tmp_tp_name
QUOTA 100M on tp_name1
QUOTA 200M on tp_name2
PROFILE profilename;(PRO FILE 在这里暂不讨论)

又或者:
grant unlimited tablespace to username;
这样的话所有表空间都无限制使用了,慎用啊

如下图 我用SYS账户分配给BILL 100M表空间配额在TS_EXAMPLE, 和10M表空间配额在USER:


注意上图的100m是指设定在100m 而不是增加100m哦

还有,ORACLE 吾允许分配临时表空间的配额...临时表空间自动供大家使用..

 

依家再用BILL查看user_tablespaces视图,就可以见到bill有权限使用上面的两个表空间了

 
至于要查看每个表空间具体有几多配额,就需要查看user_ts_qaotas视图,如下图:


这时就应该可以往tb_bill_test插入数据了,重新执行一次insert 语句. 成功!

 
而且见到已经使用了8个block,  64kb..
 
1.3 查看系统权限
用户可以 利用user_sys_privs视图来查看自己有什么权限


 
 
可以见到 BILL的5个系统权限, 都是上面SYS分配给他的啊
 至于最后面那个ADMIN_OPTION 要注意,
这里的ADMIN_OPTION都是NO, 也就是说这些系统权限BILL都只能自己用啦,不能分配给别人用啦~

如果SYS分配这些权限给BILL同时带上with admin option 这条语句, 那么BILL就有不但只可以使用这些权限,还可以分配给他人使用.
GRANT PRIVILEGE [privilege,.....]
TO  [user1,user2...| role, PUBLIC]
WITH ADMIN OPTION


1.4 回收系统权限
对应GRANT,回收的关键字是REVOKE啦,语法如下:
REVOKE PRIVILEGE [privilege,.....]
from  [user1,user2...| role, PUBLIC]

如下图,我用SYS帐号回收了BILL的Create view的系统权限,那么bill就不能创建视图了.

 

1.5 修改自己的密码
BILL 是可以通过
Alter user BILL identified by xxxxxxx

来修改自己的密码的,即使BILL没有Alter USER的权限, 但是要修改其他选项的话,就必须要有ALTER USER权限了.
其他选项一般由DBA执行修改的啦~

2. 角色(Role)

      角色是命名的可以授予用户的相关权限的组,该方法使权限的授予,撤回更加容易管理.

2.1 创建角色:
  语法:
    CREATE ROLE rolename;

当然前提是有CREATE ROLE的权限啦,一般都是由DBA去执行啦~
而且角色名不能与 存在的用户名相同啊, oracle提示创建失败的, 想想也是,不然分配权限时就会混绕了.

下图我创建了1个角色manager:


2.2 分配权限给角色

 语法跟分配权限给用户是一样的,只不过用角色名去取代用户名啦:
下图: 我将create view, select any table 分给manager,
那么manager这个角色就可以创建试图,和select任何模式(任何用户)下的表了.



 

2.3 分配角色给用户

到最后, 要将角色分给用户,那么用户就有了这个角色的权限.
语法:
grant rolename to username;

如下图: 我将manager 角色分给BILL, 那么bill就拥有了manager角色的权限(create view, select any table)

 
可以见到,BILL虽然拥有了manager,BILL的系统权限并没有增加.
因为角色权限视图要联合另外的试图: user_role_privs ,来查看:



 
或者直接查看role_sys_privs视图:


 
注意亲测过:
在11g中用户需要重新登陆才能使用新分配角色的权限..

如下图,BILL已经可以查看scott用户下的表了.


 

  2.4 回收角色.

这个一样啦,语法
REVOKE rolename from username;


3. 对象权限(object privileges)

         对象权限是 指在指定的表,视图,序列或过程上执行制定动作的权限或权利, 每1个对象都有1个特殊的可以授予的权限集. 下图列出了各种对象的权限集合.

 
      用户序列的权限只有select 和 alter. update, references和insert 权限可以通过指定1个可更新列的的子集被限制.
      select的权限可以通过创建带1个列子集的视图并且只授予select权限来限制.
      1个同义词上被授予的权限将转换为由同义词引用的基表的权限.

3.1 分配和查看对象权限

语法:
GRANT    object_priv[(columns)]   /  ALL
ON          object
to           {user|role|PUBLIC}
[WITH GRANT OPTION]


其中
object_prive    是指被授予的对象权限,注意不带对象名哦
ALL                指定对象所有的对象权限
columns           从1个表或视图中指定被授予权限的列
ON object       是被授予权限所属于的对象
TO                  指定权限被授予谁
PUBLIC            授予权限给所有用户
WITH GRANT OPTION    允许被授予权限的人再授予这个权限给其他用户或角色.


  3.1.1 表对象的权限
如下图,首先我撤销BILL的manager角色,这样他是不能select SCOTT的表的

 

接下来我用SCOTT帐号分配emp表的select 权限给BILL

 
再分配update ename, deptno的权限给bill

 
这样bill 能查看emp表内容,而且能update ename,deptno列,但是update sal列是失败的

 
表的对象权限可以通过查看如下视图.
作为GRANTEE
BILL 可以通过查看 USER_TAB_PRIVS_RECDUSER_TAB_PRIVS来查看分配了给自己的对象权限:
              通过查看 USER_COL_PRIVS_RECD 来查看分配了给自己的对象的 的权限.

 
还可以通过查看 ROLE_TAB_PRIVS 来查看自己的 角色所拥有的 对象权限和对象列的权限:

 

而作为GRANTOR
SCOTT可以通过 USER_TAB_PRIVS_MADE   来查看自己分配了什么表对象权限给了什么用户或角色.
         可以通过 USER_COL_PRIVS_MADE   来查看自己分配了什么列对象权限给了什么用户或角色.

 
注意上图TL是角色名

  3.1.2 PROCEDURE对象的权限

执行权限:
有上面的表格可见到, 对于PROCEDURE来讲, 只有1个EXECUTE的权限..
例如BILL这时是无法执行scott的stored proc  USP_EMP_LIST的:

 
接下来我用scott帐号分配execute权限给BILL:

 
此时BILL就可以执行usp_emp_list 了, 而且也可以从user_tab_privs_recd里查看到相关信息.

 
 
查看代码权限:
但是BILL要查看该stored proc的代码要什么权限呢?
我们知道, 如果scott要查看自己的存储过程代码, 就要查看视图usr_source.

然而如果BILL要查看scott的存储过程,就必须要查看视图 dba_source了.
用dba分配这个视图查看权限比BILL:

 
这样的话, bill就可以查看scott的所有PROCEDURE代码了,  谁知道怎么分配指定1个存储过程代码查看权限的可告诉我~

 

那为什么不是只把scott的视图user_source分配给BILL就可以了吗?  因为dba_source包括了其他人的信息.
答案是 user_, dba_, all_ 开头的数据字典并不适用模式前序.
user_ 开头的数据字典只适用于当前session查看当前用户的信息. 不能share给其他用户.
参考
https://forums.oracle.com/forums/thread.jspa?threadID=295697&messageID=3482583
即使scott能无错执行分配user_source给bill:

 
但是BILL并不能查看scott.user_source...

 

修改权限:
我打算用BILL去修改scott的这个存储过程USP_EMP_LIST;

 
当我执行这个脚本时, 提示我无权限了..

 
尝试用scott分配alter权限给bill?


提示procedure只有execute 和 debug这个两个对象权限..

亲自测试过,  修改他人的存储过程需要的是 CREATE ANY PROCEDURE
用sys帐号分配这个权限给BILL

 
bill就可以执行修改脚本了:


测试下 修改成功:



不过这个权限貌似很不安全 慎用啊~


  3.2 回收对象权限

呢个简单啦:
Revoke   object_priv[(columns)]   /  ALL
ON          object
from           {user|role|PUBLIC}


4.关于with grant option和 with admin option字句.
           关于呢两个字句的作用上面已经介绍过了, 这里只不过做个实验.
           若SCOTT将自己的表dept 的select权限分配给bill, 并且带上with grant option字句.
     这时bill再将这个权限分配给Calvin, 这样bill 和 Calvin都有权限查看这张表.
     但是当scott从bill回收这个权限时, calvin还有没有这个权限呢?

1. scott 分配 select on dept 给bill:

 

 2.这时bill查看自己的对象权限,

 
 
3.BIll 再分给Calvin

 
4.Calvin 这时查看自己的权限:

 
可以见到 GRANTOR 系BILL啊, 分配的人是BILL啦

5. 这时Scott 回收bill的这个权限..


6.这时再查看calvin的权限:

 没了...


也就是说,在Oracle里 A回收了B的某个权限,  会同时回收B分配给其他用户角色的对应权限...
 



















 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nvd11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值