在開發系統的過程中,不可避免的需要和其他的系統進行交互,這里一般采用接口的方式來進行交互,但是也有很多時候需要我們去創建用戶和視圖來供對方通過dblink的方式查詢我們系統中的數據。這里就牽扯到了授權問題,應該給創建給對方使用的用戶多大的權限呢。
Oracle權限允許用戶訪問屬於其它用戶的對象或執行程序,Oracle系統提供三種權限:Object 對象級、System 系統級、Role 角色級。這些權限可以授予給用戶、特殊用戶public或角色,如果授予一個權限給特殊用戶"Public"(用戶public是oracle預定義的,每個用戶享有這個用戶享有的權限),那么就意味作將該權限授予了該數據庫的所有用戶。
對管理權限而言,角色是一個工具,權限能夠被授予給一個角色,角色也能被授予給另一個角色或用戶。用戶可以通過角色繼承權限,除了管理權限外角色服務沒有其它目的。權限可以被授予,也可以用同樣的方式撤銷。
權限分類
1、系統權限:系統規定用戶使用數據庫的權限。(系統權限是對用戶而言)。
2、實體權限:某種權限用戶對其它用戶的表或視圖的存取權限。(是針對表或視圖而言的)。
系統權限:
DBA: 擁有全部特權,是系統最高權限,只有DBA才可以創建數據庫結構。
RESOURCE:擁有Resource權限的用戶只可以創建實體,不可以創建數據庫結構。
CONNECT:擁有Connect權限的用戶只可以登錄Oracle,不可以創建實體,不可以創建數據庫結構。
對於普通用戶:授予connect, resource權限。
對於DBA管理用戶:授予connect,resource, dba權限。
系統權限授權命令:
系統權限只能由DBA用戶授出:sys, system(最開始只能是這兩個用戶)
授權命令:SQL> grant connect, resource, dba to 用戶名1 [,用戶名2]...;
注:普通用戶通過授權可以具有與system相同的用戶權限,但永遠不能達到與sys用戶相同的權限,system用戶的權限也可以被回收。
例:
SQL> connect system/manager
SQL> Create user user50 identified by user50;
SQL> grant connect, resource to user50;
查詢用戶擁有哪里權限:
SQL> select * from dba_role_privs;
SQL> select * from dba_sys_privs;
SQL> select * from role_sys_privs;
查自己擁有哪些系統權限
SQL> select * from session_privs;
刪除用戶
SQL> drop user 用戶名 cascade; //加上cascade則將用戶連同其創建的東西全部刪除
系統權限傳遞:
增加WITH ADMIN OPTION選項,則得到的權限可以傳遞。
SQL> grant connect, resorce to user50 with admin option; //可以傳遞所獲權限。
系統權限回收:系統權限只能由DBA用戶回收
SQL> Revoke connect, resource from user50;
說明:
1)如果使用WITH ADMIN OPTION為某個用戶授予系統權限,那么對於被這個用戶授予相同權限的所有用戶來說,取消該用戶的系統權限並不會級聯取消這些用戶的相同權限。
2)系統權限無級聯,即A授予B權限,B授予C權限,如果A收回B的權限,C的權限不受影響;系統權限可以跨用戶回收,即A可以直接收回C用戶的權限。
實體權限:
select, update, insert, alter, index, delete, all //all包括所有權限
execute //執行存儲過程權限
user01:
SQL> grant select, update, insert on product to user02;
SQL> grant all on product to user02;
user02:
SQL> select * from user01.product;
// 此時user02查user_tables,不包括user01.product這個表,但如果查all_tables則可以查到,因為他可以訪問。
將表的操作權限授予全體用戶:
SQL> grant all on product to public; // public表示是所有的用戶,這里的all權限不包括drop。
實體權限數據字典
SQL> select owner, table_name from all_tables; // 用戶可以查詢的表
SQL> select table_name from user_tables; // 用戶創建的表
SQL> select grantor, table_schema, table_name, privilege from all_tab_privs; // 獲權可以存取的表(被授權的)
SQL> select grantee, owner, table_name, privilege from user_tab_privs; // 授出權限的表(授出的權限)
DBA用戶可以操作全體用戶的任意基表(無需授權,包括刪除)
下面就是oracle的權限一覽表:
權限 | 所能實現的操作 |
分析 | |
ANALYZE ANY | 分析數據庫中的任何表、簇或索引 |
審計 | |
AUDIT ANY | 審計數據庫中的任何模式對象 |
AUDIT SYSTEM | 啟用與停用語句和特權的審計選項 |
簇 | |
CREATE CLUSTER | 在自有的模式中創建一個簇 |
CREATE ANY CLUSTER | 在任何一個模式中創建一個簇;操作類似於CREATE ANY TABLE |
ALTER ANY CLUSTER | 改變數據庫中的任何一個簇 |
DROP ANY CLUSTER | 刪除數據庫中的任何一個簇 |
數據庫 | |
ALTER DATA BASE | 改變數據庫;不管操作系統的特權,經由Oracle把文件添加到操作系統中 |
數據庫鏈接 | |
CREATE DATABASE LINK | 在自有模式中創建專用數據庫鏈接 |
索引 | |
CREATE ANY INDEX | 在任何表的任何模式中創建一條索引 |
ALTER ANY INDEX | 改變數據庫中的任何索引 |
DROP ANY INDEX | 刪除數據庫中的任何索引 |
庫 | |
CREATE LIBRARY | 在自有模式中創建調出庫 |
CREATE ANY LIBRARY | 在任何模式中創建調出庫 |
DROP LIBRARY | 刪除自有模式中的調出庫 |
DROP ANY LIBRARY | 刪除任何模式中的調出庫 |
特權 | |
GRANT ANY PRIVILEGE | 授予任何系統特權(不包括對象特權) |
過程 | |
CREATE PROCEDURE | 在自有模式中創建存儲的過程、函數和包 |
CREATE ANY PROCEDURE | 在任何模式中創建存儲的過程、函數和包(這要求用戶還要有ALTER ANY TABLE 、BACKUP ANY TA B LE 、DROP ANY TABLE 、SELECT ANY TABLE 、INSERT ANY TABLE 、UPDATE ANY TABLE 、DELETE ANY TABLE 或GRANT ANY TABLE 特權 |
ALTER ANY PROCEDURE | 編譯任何模式中的任何存儲的過程、函數或包 |
DROP ANY PROCEDURE | 刪除任何模式中的任何存儲的過程、函數或包 |
EXECUTE ANY PROCEDURE | 執行任何過程或函數(獨立的或成組的),或在任何模式中引用任何包變量 |
環境資源文件 | |
CREATE PROFILE | 創建環境資源文件 |
ALTER PROFILE | 改變數據庫中的任何環境資源文件 |
DROP PROFILE | 刪除數據庫中的任何環境資源文件 |
ALTER RESOURCE COST | 設置所有的用戶會話中使用的資源開銷 |
特權 | 所能實現的操作 |
公共數據庫鏈接 | |
CREATE PUBLIC DATABASE LINK | 創建公共數據庫鏈接 |
DROP PUBLIC DATABASE LINK | 刪除公共數據庫鏈接 |
公共同義詞 | |
CREATE PUBLIC SYNONYM | 創建公共同義詞 |
DROP PUBLIC SYNONYM | 刪除公共同義詞 |
角色 | |
CREATE ROLE | 創建角色 |
ALTER ANY ROLE | 改變數據庫中的任何一個角色 |
DROP ANY ROLE | 刪除數據庫中的任何一個角色 |
GRANT ANY ROLE | 授權數據庫中的任何一個角色 |
回滾段 | |
CREATE ROLLBACK SEGMENT | 創建回滾段 |
ALTER ROLLBACK SEGMENT | 改變回滾段 |
DROP ROLLBACK SEGMENT | 刪除回滾段 |
會話 | |
CREATE SESSION | 連接到數據庫 |
ALTER SESSION | 發出A LTER SESSION 語句 |
RESTRICTED SESSION | 當數據庫利用STARTUP RESTRICT 啟動時進行連接(OSOPER與 OSDBA角色包含此特權) |
序列 | |
CREATE SEQUENCE | 在自有模式中創建序列 |
CREATE ANY SEQUENCE | 在任何模式中創建任何序列 |
ALTER ANY SEQUENCE | 在任何模式中改變任何序列 |
DROP ANY SEQUENCE | 在任何模式中刪除任何序列 |
SELECT ANY SEQUENCE | 在任何模式中引用任何序列 |
快照 | |
CREATE SNAPSHOT | 在自有模式中創建快照(用戶還必須具有C R E ATE TA B L E 特權) |
CREATE ANY SNAPSHOT | 在任何模式中創建快照(用戶還必須具有CREATE ANY TABLE特權) |
ALTER SNAPSHOT | 改變任何模式中的任何快照 |
DROP ANY SNAPSHOT | 刪除任何模式中的任何快照 |
同義詞 | |
CREATE SYNONYM | 在自有模式中創建同義詞 |
CREATE ANY SYNONYM | 在任何模式中創建任何同義詞 |
DROP ANY SYNONYM | 在任何模式中刪除任何同義詞 |
系統 | |
ALTER SYSTEM | 發出ALTER SYSTEM 語句 |
表 | |
CREATE TABLE | 在自有模式中創建表。還使被授權者能在自有模式下的表中創建索引,包 括那些用於完整性約束的索引(被授權者必須有表空間的定額或UNLIMITED TABLESPACE 特權) |
CREATE ANY TABLE | 在任何模式中創建表(假如被授權者有CREATE ANY TABLE 特權並在 另一個用戶模式中創建了一張表,那么擁有者必須在那個表空間上有空間定額。表的擁有者不必具有CREAT [ANY] TABLE 特權) |
ALTER ANY TABLE | 改變任何模式中的任何表並編譯任何模式中的任何視圖 |
BACKUP ANY TABLE | 在任何模式中使用表的導出工具執行一個增量導出操作 |
DROP ANY TABLE | 刪除或截斷任何模式中的任何表 |
LOCK ANY TABLE | 鎖定任何模式中的任何表或視圖 |
特權 | 所能實現的操作 |
COMMENT ANY TABLE | 對任何模式中的任何表、視圖或列進行注釋 |
SELECT ANY TABLE | 對任何模式中的任何表、視圖或快照進行查詢 |
INSERT ANY TABLE | 把行插入到任何模式中的任何表或視圖中 |
UPDATE ANY TABLE | 修改任何模式中的任何表或視圖中的行 |
DELETE ANY TABLE | 刪除任何模式中的任何表或視圖中的行 |
表空間 | |
CREATE TABLESPACE | 創建表空間;不管用戶有何操作系統特權,經由Oracle把文件添加到操 作系統中 |
ALTER TABLESPACE | 改變表空間;不管用戶有何操作系統特權,經由Oracle把文件添加到操 作系統中 |
MANAGE TABLESPACE | 使任何表空間脫機,使任何表空間聯機,開始和結束對任何表空間的備份 |
DROP TABLESPACE | 刪除表空間 |
UNLIMITED TABLESPACE | 使用任何沒有數量限制的表空間。此特權忽略了所分配的任何具體定額。 假如被取消的話,被授權者的模式對象仍然保留,但是進一步的表空間分配被拒絕,除非這一分配是具體的表空間定額允許的。此系統特權僅可以授予用戶,而不授予角色。一般而言,應分配具體的表空間定額,而不授予此系統特權 |
事務 | |
FORCE TRANSACTION | 強迫提交或回滾本地數據庫中懸而未決的自有的分布式事務 |
FORCE ANY TRANSACTION | 強迫提交或回滾本地數據庫中懸而未決的任何分布式事務 |
觸發器 | |
CREATE TRIGGER | 在自有模式中創建觸發器 |
CREATE ANY TRIGGER | 在任何模式中創建與任何模式的任何表相關的任何觸發器 |
ALTER ANY TRIGGER | 啟用、停用或編譯任何模式中的任何觸發器 |
DROP ANY TRIGGER | 刪除任何模式中的任何觸發器 |
用戶 | |
CREATE ANY USER | 創建用戶;分配任意表空間上的定額,設置缺省和臨時表空間,指定一個 環境資源文件(在CREATE USER 語句中) |
BECOME ANY USER | 成為另一個用戶(這是任何一個執行完全數據庫導入的用戶所需要的) |
ALTER USER | 改變其他用戶:修改任意用戶的口令或驗證方法,分配表空間定額,設置 缺省或臨時表空間,在ALTER USER 語句中指定環境資源文件與缺省角色(不必改變自有口令) |
DROP USER | 刪除另一個用戶 |
視圖 | |
CREATE VIEW | 在自有模式中創建視圖 |
CREATE ANY VIEW | 在任意模式中創建視圖。要在另一個用戶模式中創建視圖,你必須具有 CREATE ANY VIEW 特權,擁用者必須在該視圖引用的對象上具有所需的特權 |