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的权限,不需要输入密码了.

 

 

 

 

你可能感兴趣的:(Oracle权限管理(三):查找用户具有的权限)