当前位置:数据库 > Oracle >>

Oracle查找用户具有的权限

Oracle查找用户具有的权限
 
我们知道Oracle的权限划分的很细,所以做很多操作如果没有相应的权限就会出错.只有创建数据库后默认生成的用户sys是权限最高的,也拥有的有的权限.
 
假如有用户Arwen,我们怎么查找该用户拥有的所有权限呢?我们知道最常见有系统权限和对象权限.不过实际上还有些特殊的权限严格来说不归为这两类.
 
系统权限(System Privileges)
所谓系统权限指允许用户执行特定的操作.该操作一般不是针对特定的一个对象.比如常见的系统权限有:create table,create view,create session...
 
查看所有系统权限
 
我们可以通过如下语句查找数据库中定义的的所有System privileges.
 
SELECT * FROM SYSTEM_PRIVILEGE_MAP
 
查看用户的所有系统权限
 
可以通过如下语句查找用户Arwen所拥有的所有system privileges
 
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'ARWEN'; 或者
 
SELECT * FROM USER_SYS_PRIVS;或者
 
SELECT * FROM SESSION_PRIVS; //当前session权限.有时一些权限可能只针对当前session.所有该语句结果可能比前两个语句结果多.大部分时候是相等.
 
 
 
 
 
我们看到有一列叫ADMIN_OPTION,该列的值是yes或no.
 
为yes表示该用户还可以把该权限赋予其他用户,为no则不能.例如
 
grant create table to ARWEN with admin option;// admin_option为yes. 用户ARWEN可以这样继承给别的用户赋权.grant create table to weiwenhp.
 
grant create table to ARWEN; //admin_option 为no.
 
 
 
那你可能会问如果某个用户已经有admin option权限,怎么去掉.应该这样
 
revoke create table from arwen; //必须先revoke才行
 
grant create table to arwen;
 
 
 
如果用户有create table权限,但想赋予admin option权限.可以这样
 
--revoke create table from arwen;  //不是必须的
 
grant create table to arwen with admin option
 
 
 
对象权限
对象权限是跟具体的某一个对象相关的,相对system privileges 权限来说细化很多.很多对象权限实际上被包含在某个system privileges中.常见的对象权限有.
 
select on table_tmp; execute on package_tmp; read on directory_tmp..........
 
 
 
SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = 'ARWEN';或者
 
SELECT * FROM USER_TAB_PRIVS WHERE GRANTEE = 'ARWEN';
 
其中有一列叫grantable,跟系统权限里讲到的admin_option基本一样.
 
 
 
 
 
查找用户表空间权限
我们创建表时如果不显式指定表空间,则会使用user的默认表空间.但也可以建表时显式指定表空间.如果对某个表空间没有访问权限则会报错.
 
例如create table tmp(id int) tablespace system; //ORA-01950: no privileges on tablespace 'SYSTEM' 
 
我们可以通过如下语句来赋予权限
 
ALTER USER arwen QUOTA 1K ON SYSTEM; //可以在表空间system中使用1K的空间.
 
ALTER USER arwen QUOTA UNLIMITED ON SYSTEM; //可以无限制使用
 
 
 
把表移到另一个表空间
 
假如某个表已经放在某个表空间中了,现在想移到另外一个表空间咋整呢?如果只是普通表,没有像lob类型的列,也没有索引.
 
则ALTER TABLE tab_tmp MOVE TABLESPACE  system; //把表tab_tmp移到表空间system
 
假如有列txt是lob类型的.则ALTER TABLE tab_tmp MOVE LOB (txt) STORE AS (tablespace system);
 
如果有索引.得先通过select index_name from ind where table_name = 'TAB_TMP' and index_type = 'NORMAL';查找得到索引名,假如为ind1
 
  ALTER INDEX ind1 REBUILD TABLESPACE system;
 
 
 
可以通过如下语句查找到用户有权限使用的表空间
 
SELECT * FROM USER_TABLESPACES;
 
 
 
用户默认的表空间
 
SELECT DEFAULT_TABLESPACE FROM USER_USERS WHERE USERNAME
 
 
 
JAVA权限
 
如果要使用java相关的资源.可以用下面语句查找是否有相关权限
 
SELECT * FROM USER_JAVA_POLICY;或者
 
SELECT * FROM DBA_JAVA_POLICY where grantee = 'ARWEN';
 
 
 
 
 
通过角色(role)间接得到的权限
在上面你通过dba_sys_privs查询权限可能返回结果为空.但实际上该用户却有很多权限.这样因为该用户通过role间接得到有很多权限.所有我们得先查到该用户拥有哪些角色,再看该角色有哪些权限.
 
查看用户拥有哪些role权限
 
SELECT GRANTED_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'ARWEN';
 
 
 
查看role对应有哪些权限
 
SELECT privilege FROM ROLE_SYS_PRIVS where role = 'ROLE1';
 
 
 
 
 
但假如有传递作用的role咋整呢,比如把role one给role two,再把role two赋予给role three. 此时three就同时拥有one和two的.
 
这时得用个start with去遍历下把所有role都找出来就行.
 
 
 
角色的密码
我们创建登陆用户时会指定用户名密码,这是比较好理解.但是创建角色时也可以指定密码.(平时貌似很少用到).我们也可以简单的理解成为了安全起见,开了个双重密码.就像你在保险箱中还放有一个保险箱,需要另外再输入一个啥密码才能打开.
 
 
 
假如创建角色role1
 
create role1 identified by pwd;
 
grant select any table to role1;
 
grant role1 to arwen;
 
/////////用arwen连接一个session//////
 
实际上此时arwen并没拥有了role1的权限.需要在此session中执行如下语句
 
set role role1 identified by pwd; //如果密码为空就是set role role1 identified by null;
 
此时该session需要有了role1的权限.但如果重新连接一个session仍然没有role1的权限.
 
 
 
如果要想让用户不用这么麻烦老输密码咋办.可以把role1设为default role就不再需要每次输入密码了.
 
alter user arwen default role 'ROLE1'; //这样每次arwen登陆都拥有role1的权限,不需要输入密码了.
 
 
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,