按部就班學Oracle之索引、權限、角色

1、索引簡介:數據庫

索引是用於加速數據存取的數據對象,合理的使用索引能夠大大下降I/O次數,從而提升數據訪問性能。索引有不少種主要介紹經常使用的幾種:windows

1-單列索引:session

單列索引是基於單個列所創建的索引,語法:oracle

create index 索引名 on 表名(列名)ide

範例1:建立單列索引函數

SQL> create indexnameIndexon customer(name);工具

Index created性能

2-複合索引:spa

複合索引是基於兩列或多列的索引。在同一張表上能夠有多個索引,可是要求列的組合必須不一樣。命令行

範例2:建立複合索引:

SQL> create index emp_idx1 on emp (ename,job);
Index created

SQL> create index emp_idx2 on emp (job,ename);
Index created

SQL>

3-索引使用原則:

(1) 在大表上創建索引纔有意義;

(2) 在where子句或是鏈接條件上常常引用的列上創建索引;

(3) 索引的層次不要超過4層.

4-索引據點分析:

萬事萬物都有兩面性,索引也不例外,有些先天不足之處:

(1) 創建索引,系統佔用大約爲表的1.2倍的硬盤和內存空間來保存索引;

(2) 更新數據時,系統必需要有額外的時間來同時對索引進行更新,以維持數據和索引的一致性;

(3) 創建不恰當的索引,不但於事無補,反而會下降系統性能.因大量的索引在進行插入、修改和刪除操做時比沒有索引花費的系統時間更多。

PS:注意點!以下幾點是不該該創建索引:

(1) 不多或從不引用的字段;

(2) 邏輯型的字段,如:男或女(是或否)等。

由可見,有取就有舍,舍和得有時就涇渭分明。提升查詢效率是以消耗必定的系統資源爲代價的。

5-如何顯示錶的索引:

(1)顯示錶的全部索引;

在同一張表上能夠有多個索引,經過查詢數據字典視圖dba_indexes和user_indexes,能夠顯示索引信息。

* dba_indexes用於顯示數據庫全部的索引信息;

* user_indexes用於顯示當前用戶的索引信息。

範例3:如查看範例1中建立單列索引:

方法1:經過PL/SQL Developer工具查看索引信息:

p_w_picpath

方法2:使用命令行查看:

p_w_picpath


2、權限簡介:

1-Oracle是如何管理權限和角色?權限和角色的區別在哪裏?

當剛剛建立的Oracle用戶時,該用戶沒有任何權限,也不能執行任何操做。

* 若要執行某種特定的數據庫操做,則必須爲其授予權限;

* 若用戶要訪問其它方案的對象時,則必須爲其授予對象的權限;

爲了簡化權限的管理,因而引入了角色。(相似windows中的組,先把權限賦予該組,再把用戶加入到該組,這樣用戶就擁有了該組的權限。)

2-數據庫中的權限分爲: 系統權限和對象權限

(1)系統權限:

a. 什麼是系統權限?

b. 系統權限有哪些?

c. 如何賦給系統權限?

(2)對象權限:

a. 什麼是對象權限?

b. 對象權限有哪些?

c. 怎麼賦給對象權限?

範例:查詢Oracle中全部的系統權限,通常是DBA

SQL> select * from system_privilege_map order by name;

範例:查詢Oracle中全部對象權限,通常是DBA

SQL> select distinct privilege from dba_tab_privs;

範例:查詢Oracle中全部的角色,通常是DBA

SQL> select * from dba_roles;

3-系統權限:

權限是指執行特定類型SQL命令或訪問其它方案對象的權利,包括:系統權限和對象權限。

系統權限:是指執行特定類型SQL命令的權利。它用於控制用戶能夠執行的一個或一組數據庫操做。

如:

* 用戶具備create table權限時,能夠在方案中建表;

* 用戶具備create any table權限時,能夠在任何方案中建表。

經常使用的有以下所示:

(1) create session 鏈接數據庫;

(2) create table 建表;

(3) create view 建視圖;

(4) create public synonym 建同義詞;

(5) create procedure 建過程、函數、包;

(6) create trigger 建觸發器;

(7) create cluster 建簇.

4-如何授予系統權限

範例:

(1)建立2個用戶tom和ken ,密碼均爲oracle

SQL> create user tom identified by oracle;

SQL> create user ken identified by oracle;

PS: 擴展知識點:

SQL> select * from dba_role_privs where grantee='KEN';

GRANTEE GRANTED_ROLE

------------------------------------------------------------

KEN CONNECT

SQL> revoke connect from ken; --回收賦予用戶ken的connect權限。

撤銷成功。

(2) 給用戶ken受權create session(會話)、create table(建立表)和create view(建立視圖)的權限

SQL> grant create session,create table to ken with admin option;

受權成功。

SQL> grant create view to ken;

受權成功。

SQL> conn ken/oracle@jiagulun; --檢驗ken可否登陸!

已鏈接。

SQL>

(3)檢驗ken可否爲tom分配權限

SQL> show user;

USER 爲 "KEN"

SQL> grant create session,create table to tom with admin option;

受權成功。

SQL> grant create view to tom; --用戶ken沒有賦予tom的create view的權限!

grant create view to tom

*

第 1 行出現錯誤:

ORA-01031: 權限不足

(4) 如何回收系統權限:

範例:

回收賦予ken的create session的權限,ken還能登陸嗎?(No)用戶tom還能登陸嗎?(Yes)

SQL> conn ken/oracle@jiagulun;

ERROR:

ORA-01045: user KEN lacks CREATE SESSION privilege; logon denied

警告: 您再也不鏈接到 ORACLE

SQL> conn tom/oracle@jiagulun;

已鏈接。

SQL>

5-對象權限:

對象權限是指訪問其它方案對象的權利,用戶能夠直接訪問本身方案的對象,可是若要訪問別的方案的對象,則必須具備對象的權限。

經常使用的有以下所示:

(1) alter 修改; (主要是修改表的結構)

(2) delete 刪除;

(3) select 查詢;

(4) insert 添加;

(5) update 修改; (主要是修改表的數據)

(6) index 索引;

(7) references 引用;

(8) execute 執行.

範例: grant 權限名 on 方案名.表名 to 用戶名

(1)但願monkey能夠查詢scott.emp的表數據,怎樣操做?

SQL> create user monkey identified by oracle; --建立用戶monkey

用戶已建立。

SQL> grant create session to monkey; --此時用戶monkey還不能登陸Oracle的權限,故給它!

受權成功。

SQL> show user;

USER 爲 "MONKEY"

SQL> select * from scott.emp;

select * from scott.emp

*

第 1 行出現錯誤:

ORA-00942: 表或視圖不存在

//以用戶system登陸給monkey受權

SQL> show user;

USER 爲 "SYSTEM"

SQL> grant create session to monkey;

受權成功。

SQL> grant select on scott.emp to monkey; --將scott方案中的emp表的查詢權限賦予monkey

受權成功。

clip_p_w_picpath002

//如何回收monkey對scott方案中的emp表的select權限?

SQL>revokeselecton scott.emp from monkey;

撤銷成功。

(2)但願monkey能夠修改scott.emp的表數據,怎樣操做?

SQL> grant updata on scott.emp from monkey;

(3)但願monkey能夠刪除scott.emp的表數據,怎樣操做?

SQL>grant delete on scott.emp from monkey;

(4)但願monkey能夠查詢、修改、刪除scott.emp的表數據,怎樣操做?

SQL>grant all on scott.emp from monkey;

範例:用戶scott將select查詢賦予給blake用戶,而blake用戶又把select查詢賦予jones用戶,

問:若是scott將回收賦予給blake用戶的 select查詢權限,jones的select查詢權限還在有嗎?

(1)用戶scott將select查詢賦予給blake用戶;

SQL> show user;

USER 爲 "SYSTEM"

SQL> create user blake identified by oracle;

用戶已建立。

SQL> conn scott/oracle@jiagulun;

已鏈接。

SQL> grant select on emp to blake with grant option;--grant對象權限admin系統權限

受權成功。

SQL>

(2)blanke用戶又把select查詢賦予jones用戶;

SQL> show user;

USER 爲 "BLAKE"

SQL> grant select on scott.emp to jones;

受權成功。

(3)若是scott將回收賦予給blanke用戶的 select查詢權限,jones的select查詢權限還在有嗎?

SQL> conn scott/oracle@jiagulun;

已鏈接。

SQL> show user;

USER 爲 "SCOTT"

SQL> revokeselect on emp from blake;

撤銷成功。

SQL> conn blake/oracle@jiagulun;

已鏈接。

SQL> select * from scott.emp;

select * from scott.emp

*

第 1 行出現錯誤:

ORA-00942: 表或視圖不存在

SQL> conn jones/oracle@jiagulun;

已鏈接。

SQL> show user;

USER 爲 "JONES"

SQL> select * from scott.emp;

select * from scott.emp

*

第 1 行出現錯誤:

ORA-00942: 表或視圖不存在

SQL>

由案例可知:回收對象權限後,級聯也會回收!

3、角色簡介:

角色是相關權限的命令集合,使用角色的目的主要是簡化權限的管理。

角色分爲2種:預約角色和自定義角色

1-預約義角色是指Oracle所提供的角色,每種角色都用於執行一些特定珠管理任務。

如:connect、resource、dba等,就是預約義角色。

2. connect角色具備通常應用開發人員須要的大部分權限,創建了一個用戶後,多數狀況下,只要給用戶授予connect和resource角色就夠了!

(一) connect角色具備以下幾種系統權限:

(1) alter session

(2) create cluster

(3) create database link

(4) create session

(5) create table

(6) create view

(7) create sequence

3. resource角色具備應用開發人員所須要的其它權限,如:存儲過程、觸發器等。注意:resource角色隱含了unlimited tablespace系統權限!

(二) resource角色包含以下幾種系統權限:

(1) create cluster

(2) create indextype

(3) create table

(4) create sequence

(5) create type

(6) create procedure

(7) create trigger

3. dba角色具備全部的系統權限,及with admin option選項,默認的dba用戶爲sys和system。他們可將任何系統權限授予其它用戶。可是dba角色不具有sysdba和sysoper的特權(啓動和關閉數據庫)!

2-自定義角色是指本身定義的角色,根據須要而定義。

通常是dba來創建,若是用的別的用戶來創建,則該用戶應具備create role的系統權限。創建角色時,能夠指定驗證方式(不驗證數據庫驗證等)

(一) 創建角色且受權(不驗證)

範例:

1)創建一個角色myrole1不驗證且賦予create session(鏈接數據庫的權限);

SQL> show user;

USER 爲 "SYSTEM"

SQL> create role myrole1 not identified;

角色已建立。

SQL> grant create session to myrole1 with admin option;

受權成功。

SQL>

2)用戶scottselectupdatedelete賦予myrole1角色;

SQL> conn scott/oracle@jiagulun;

已鏈接。

SQL> grant select on emp to myrole1;

受權成功。

SQL> grant update on emp to myrole1;

受權成功。

SQL> grant delete on emp to myrole1;

受權成功。

由上可知:角色myrole1如今擁有4個權限:create sessionselectupdatedelete權限!

(二) 分配角色給用戶:

範例:用戶system將角色myrole1賦予用戶tony,檢驗角色是否真的擁有的create session、select、update、delete權限

SQL> conn system/oracle@jiagulun;

已鏈接。

SQL> grant myrole1 to tony;

受權成功。

SQL> conn tony/oracle@jiagulun;

已鏈接。

SQL> select * from scott.emp;

(三) 刪除角色:

使用drop role刪除角色,通常由dba來執行,如其它用戶,則應具備drop any role系統權限。

範例: 若是將角色 myrole1刪除了,剛纔賦予tony的權限還存在嗎?(皮之不存,毛將焉附?

SQL> conn system/oracle@jiagulun;

已鏈接。

SQL> show user;

USER 爲 "SYSTEM"

SQL> drop role myrole1;

角色已刪除。

SQL> conn tony/oracle@jiagulun;

ERROR:

ORA-01045: user TONY lacks CREATE SESSION privilege; logon denied

警告: 您再也不鏈接到 ORACLE

SQL>

由上可知:若是將角色 myrole1刪除了,剛纔賦予tony的權限存在

相關文章
相關標籤/搜索