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工具查看索引信息:
方法2:使用命令行查看:
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
受權成功。
//如何回收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)用戶scott將select、update、delete賦予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 session、select、update、delete權限!
(二) 分配角色給用戶:
範例:用戶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的權限不存在!