转:Oracle 權限 (privileges)

首先還是先建立測試用的資料
測試用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)

原文地址:https://www.cnblogs.com/weaver1/p/2746300.html