首先還是先建立測試用的資料
測試用Tablespace demots
測試用User demouser
測試用Table demouser.AAA
## 建立測試用 Tablespace demots ##
Create tablespace DEMOTS datafile '/u2/oradb/oradata/orcl/test1-01.dbf' size 10M;
## 建立測試用user demouser ##
create user DEMOUSER identified by DEMOUSER
default tablespace DEMOTS
temporary tablespace TEMP;
grant create session,create table to DEMOUSER;
grant resource to DEMOUSER;
grant drop any table to DEMOUSER;
## 建立測試用Table AAA ##
conn demouser/demouser
create table AAA (
name char(6),
salary number(6),
note varchar(20));
insert into AAA values('James','60000','HaHa');
insert into AAA values('Peter','50000','HaHa2');
insert into AAA values('Nancy','40000','HaHa3');
insert into AAA values('Mary','30000','HaHa4');
insert into AAA values('Bill','30000','HaHa5');
insert into AAA values('Joe','30000','HaHa6');
一些針對 privileges 常用的 view
The views for Oracle object privileges
USER_TAB_PRIVS
ALL_TAB_PRIVS
ROLE_TAB_PRIVS
DBA_TAB_PRIVS
USER_ROLE_PRIVS
ALL_ROLE_PRIVS
ROLE_ROLE_PRIVS
DBA_ROLE_PRIVS
Additionally there are Oracle object privileges that pertain to the whole system called system privileges.
USER_SYS_PRIVS
ALL_SYS_PRIVS
ROLE_SYS_PRIVS
DBA_SYS_PRIVS
Then the VIEWS that contain information about the users in the database are:
USER_USERS
ALL_USERS
DBA_USERS
系統權限 System Privilege
系統權限包含能建立各種資料庫物件,修改資料庫組態,及大範圍的權力如 drop any table,預設只有DBA可以授予系統權限。
語法
grant provilege [, privilege, ...]
to username [,username]
[with admin option];
物件權限 Object Privilege
明確的授予使用者可以在可以在哪些schema object上做哪些動作,如使用者 B 可以在使用
者A上的物件作select的動作。
語法
grant privilege [,privilege, ...] | ALL [(column[, column, ...])]
on objectname
to user | role | public
[with grant option];
## 查詢所有 System Privileges ##
select DISTINCT PRIVILEGE from DBA_TAB_PRIVS;
## 查詢已經被授 System Privilege 的使用者 ##
select distinct GRANTEE from DBA_SYS_PRIVS order by GRANTEE;
select * from DBA_SYS_PRIVS where GRANTEE='DEMOUSER';
## 查詢已經被授 Object Privilege 的使用者 ##
select distinct GRANTEE from DBA_TAB_PRIVS order by GRANTEE;
select * from DBA_TAB_PRIVS where GRANTEE='DEMOUSER';
以上的查詢可以得知帳號DEMOUSER有被授予 System Privilege 但未被授予 Object Privilege,因為TABLE AAA 是屬於帳號DEMOUSER的Object。
## 建立使用者 testuser,來存取demouser的object ##
create user TESTUSER identified by TESTUSER;
grant connect, create session to TESTUSER; --#授予可以連sqlplus的系統權限。
grant select on DEMOUSER.AAA to TESTUSER; --#授予可以select DEMOUSER.AAA 的物件權限。
測試一下testuser是否可以 select 資料
conn testuser/testuser
SQL> select * from DEMOUSER.AAA;
NAME SALARY NOTE
------ ---------- --------------------
James 60000 HaHa
Peter 50000 HaHa2
Nancy 40000 HaHa3
Mary 30000 HaHa4
再來看一看 testuser 所被授予的物件權限
SQL> conn / as sysdba
SQL> show user;
USER is "SYS"
SQL> select GRANTEE,OWNER,PRIVILEGE from DBA_TAB_PRIVS where GRANTEE='TESTUSER';
GRANTEE OWNER PRIVILEGE
--------------- --------------- ---------------
TESTUSER DEMOUSER SELECT
使用者權限概念差不多了,接下來就是角色了,以下方向為建立一個使用者,給他可以連SQLPLUS的系統權限,但不給她物件權限而是給他角色,讓她達到可以select DEMOUSER.AAA的目的,這次就把系統權限授予給角色,使用者就可以不用建立系統權權限也可以用SQLPLUS囉。
## 建立使用者 ROLEUSER,授予 ROLE_AAA 角色,來存取demouser的object ##
conn / as sysdba
create user ROLEUSER identified by ROLEUSER;
## 建立角色 ROLE_AAA
create role ROLE_AAA not identified;
grant connect, create session to ROLE_AAA; <= 這次就把系統權限授予給角色。
grant select on DEMOUSER.AAA to ROLE_AAA;
## 將角色授予給ROLEUSER
grant ROLE_AAA to ROLEUSER;
## 切換到ROLEUSER 測試 select 的功能。
conn ROLEUSER/ROLEUSER
select * FROM DEMOUSER.AAA;
## 再給一個物件權限,來達到使用者ROLEUSER可以update 表格DEMOUSER.AAA 的目的。
conn / as sysdba
grant update on DEMOUSER.AAA to ROLEUSER;
## 切換到ROLEUSER做測是 update 的功能。
SQL> conn ROLEUSER/ROLEUSER
SQL> update DEMOUSER.AAA set NAME='Man' where NAME='Joe';
1 row updated. <== 有update成功
當然角色也可以授予系統權限,請各看官自己試試看囉。
一些查詢授予權限的範例。
## 查詢所有系統權限 System Privileges ##
select distinct name from system_privilege_map;
SELECT DISTINCT privilege FROM dba_sys_privs;
## 查詢已經被授 System Privileges 的使用者 ##
select distinct GRANTEE from dba_sys_privs order by GRANTEE;
select * from dba_sys_privs where GRANTEE='ROLEUSER';
## 查詢已經被授 Object Privileges 的使用者 ##
select distinct GRANTEE from dba_tab_privs order by GRANTEE;
select * from dba_tab_privs where GRANTEE='ROLEUSER';
## 查詢所有存在的角色 ##
select name from user$ where type#=0 order by name;
## 查詢所有存已經被授與角色的角色 ##
select * from ROLE_ROLE_PRIVS;
## 查詢已經被授予 System Privileges 的的角色 ##
select * from ROLE_SYS_PRIVS where role='ROLE_AAA';
## 查詢已經被授予 Object Privileges 的的角色 ##
select distinct ROLE from ROLE_TAB_PRIVS order by role;
select * from ROLE_TAB_PRIVS where role='ROLE_AAA';
## 查詢已經被授予的角色的使用者 ##
select distinct GRANTEE from dba_role_privs order by GRANTEE;
select * from dba_role_privs where GRANTEE='ROLEUSER';
原文链接http://bloodsucker.pixnet.net/blog/post/38649657-oracle-%E6%AC%8A%E9%99%90-(privileges)