我们知道Oracle的权限划分的很细,所以做很多操作如果没有相应的权限就会出错.只有创建数据库后默认生成的用户sys是权限最高的,也拥有的有的权限.
假如有用户Arwen,我们怎么查找该用户拥有的所有权限呢?我们知道最常见有系统权限和对象权限.不过实际上还有些特殊的权限严格来说不归为这两类.
所谓系统权限指允许用户执行特定的操作.该操作一般不是针对特定的一个对象.比如常见的系统权限有: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';
在上面你通过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的权限,不需要输入密码了.