Oracle之索引、权限
索引:
用于加速數據存取的數據對象。合理的使用索引可以大大降低i/o次數,從而提高數據訪問性。
?為什么添加索引后可以提高查詢速度
單列索引:
單列索引是基于單個列所建立的索引,比如:create ? index ?索引名 ? on ? 表名(列名)
復合索引
復合索引是基于兩列或是多列的索引。同一張表上可以有多個索引,但是要求列的組合必須 不同,比如:
create ? index ? emp_idx1 ?on ?emp ? (ename,job);
create index emp_idx2 ?on ?emp ?(job,ename);
建立索引的原則:
(1)在大表建立索引才有意義
(2)在where子句或是連接條件上經常引用在列上建立索引
(3)索引的層次不要超過4層
索引缺點分析:
?1、建立索引,系統要占用大約為表的1.2倍的硬盤和內存空間來保存索引。
2、更新數據時候,系統必須要有額外的時間來同時對索引進行更新,以維持數據和索引的一致性。
【注意】:在實際中,不恰當的索引不但于事無補,反而會降低系統的性能。因為大量的索引在進行插入、修改、和刪除操作時比沒有索引花費更多的系統時間。
比如:
1、在很少用或者從來不用的字段;
2、邏輯型的字段,如男或者女
索引的種類:
按照數據存儲的方式:可以分為B*數、反向索引,位圖索引;(B*數索引建立在重復值很少的列,而位圖索引則建立重復值很多,不同值相對固定的列上)
按照索引的個數分類,可以分為單列索引和復合索引;
按照索引列值的唯一性,可以分為唯一索引和非唯一索引。
此外還有函數索引,全局索引,分局索引。
顯示表的所有索引
在同一張表上可以有多個索引,通過查詢索引信息。其中dba_indexs用于顯示數據庫所有的索引信息。而user_indexs用于顯示當前用戶索引信息。
SQL> select index_name ,index_type ?from ?user_indexes ?where ?table_name='customer';
顯示索引列
通過查詢數據字段視圖user_ind_columns,可以顯示索引對應的列的信息
SQL> select ?table_name,column_name ?from ?user_ind_columns ?where ?index_name ='IND_ENAME';
管理權限和角色
?當用戶建立起來的,用戶沒有任何權限,也不能執行任何操作。如果要執行某種特定的數據庫操作,則必須為其授權系統的權限;如果要執行某種特定的數據庫操作,如果用戶要訪問其他方案的對象,則必須為其授予對象權限,為了簡化權限的管理,可以使用角色。
查詢oracle中所有的系統權限:【一般是system用戶,親測scott也可以?????】
select ?* from ? system_privilege_map ? order ?by ?name;
PRIVILEGE NAME PROPERTY ---------- ---------------------------------------- -----------278 READ ANY FILE GROUP 1-7 RESTRICTED SESSION 0-236 RESUMABLE 0-312 SELECT ANY CUBE 0-307 SELECT ANY CUBE DIMENSION 0-237 SELECT ANY DICTIONARY 0-293 SELECT ANY MINING MODEL 0-109 SELECT ANY SEQUENCE 0-47 SELECT ANY TABLE 0-269 SELECT ANY TRANSACTION 0-83 SYSDBA 0-84 SYSOPER 0-213 UNDER ANY TABLE 0-186 UNDER ANY TYPE 0-209 UNDER ANY VIEW 0-15 UNLIMITED TABLESPACE 0-313 UPDATE ANY CUBE 0-322 UPDATE ANY CUBE BUILD PROCESS 0-326 UPDATE ANY CUBE DIMENSION 0-49 UPDATE ANY TABLE 0208 rows selected查詢oracle中所有的對象權限:【一般是system用戶】
SQL> select distinct privilege from dba_tab_privs;PRIVILEGE ---------------------------------------- EXECUTE FLASHBACK DEQUEUE ON COMMIT REFRESH ALTER DELETE UPDATE DEBUG QUERY REWRITE SELECT READ USE WRITE INSERT INDEX REFERENCES MERGE VIEW17 rows selected
查詢orcale中有多少角色?55
SQL> select * from dba_roles;
SQL> select * from dba_roles;ROLE PASSWORD_REQUIRED AUTHENTICATION_TYPE ------------------------------ ----------------- ------------------- CONNECT NO NONE RESOURCE NO NONE DBA NO NONE SELECT_CATALOG_ROLE NO NONE EXECUTE_CATALOG_ROLE NO NONE DELETE_CATALOG_ROLE NO NONE EXP_FULL_DATABASE NO NONE IMP_FULL_DATABASE NO NONE LOGSTDBY_ADMINISTRATOR NO NONE DBFS_ROLE NO NONE AQ_ADMINISTRATOR_ROLE NO NONE AQ_USER_ROLE NO NONE DATAPUMP_EXP_FULL_DATABASE NO NONE DATAPUMP_IMP_FULL_DATABASE NO NONE ADM_PARALLEL_EXECUTE_TASK NO NONE GATHER_SYSTEM_STATISTICS NO NONE JAVA_DEPLOY NO NONE 權限:
權限是執行特定類型sql命令或是訪問其他方案對象的權利,包括系統權限和對象權限兩種;
圖1
授予系統權限:
一般情況下,授予系統權限是有dba完成的,如果其他用戶來授予系統權限,則要求該用戶必須grant ? ?any ? privilege ?的系統權限在授予權限時,可以帶有with ?admin ? option 選項,被授予權限的用戶或是角色還可以將系統權限授予其它的用戶或是角色。
1、創建兩個用戶ken ,tom。初始階段他們沒有權限,如果登錄就會給出錯誤的信息。
2、給用戶ken授權
grant ? create ? session ,create ?table ?to ? ken ?with ? admin ?option;
grant ?create ?view ?to ?ken ;
3、給用戶tom授權
可以通過ken給tom授權,因為with ?admin ?option ?是加上的。當然也可以通過dba給tom授權,我們就用ken ?給授權:
grant ?create ?session ?,creatre ?table ?to ?tom ;
grant create view ?to ?tom ;→錯誤
回收系統權限:
一般由DBA來完成,若其他的用戶來回收系統權限,要求該用戶必須要有的相應系統權限及傳授系統權限的選項(with ? admin ?option )。回收系統權限使用revoke來完成。當系統權限回收了用戶就無法執行了。
注意:
系統權限回收后,用戶就不能執行相應的操作了,但是注意,系統權限級聯回收的問題?【不是級聯回收的!:ken的權限被回收了,則tom的權限還存在】
system →ken→tom
用system執行以下操作
revoke ?create ?session ?from ?ken;(此時tom也無法登錄了)
對象權限的介紹
指的是訪問其他方案對象的權利,用戶可以直接訪問自己的對象但是要訪問其他方案的對象,則必須要具有對象的權限。比如:smith用戶要訪問scott。emp表(scott:方案)則必須在scott.表上具有對象權限。
常用的有:
alter 修改 ? Delete 刪除? select ?查詢 insert 插入 ? ? ?update ? ?,index索引 ? ?reference ?引用 ? ? execute執行
all(所有權限)
顯示對象
通過數據字段視圖可以顯示用戶或者角色所具有的對象權限,視圖為dba_tab_privs
SQL> select distinct privilege from dba_tab_privs;
SQL> select grantor,owner,table_name,privilege from dba_tab_privs ?where ?grantee ='BLAKE';
授予對象權限
在oracle9i之前授予對象權限是對象所有者完成的,若用其他用戶來操作,則需要用戶具有相應的(with ?grant ? option)權限,之后dba用戶(sys,system)可以將任何對象權限授予其他用戶,授權對象權限使用grant 命令來完成。
1、對象權限可以授予用戶,角色,和public。授予權限時,如果帶有with ?grant ?option 選項,則可以將該權限轉授其他用戶,但注意with ?grant option選項不能授予角色。
①希望monkey可以查詢scott.emp表數據,怎么操作?
grant ?select ?on emp ? to ? monkey
②希望monkey可以修改scott.emp表數據,怎么樣操作?
grant ?select ?on ?emp ?to ?monkey;
?2、能否對monkey訪問更加精細控制(授權到列)
①希望monkey只可以查詢scott.emp 的表sal字段,怎么操作?
grant ?update ?on ?emp(sal) to monkey ;
②希望monkey只可以查詢scott.emp的表ename,sal數據,怎么操作?
grant ?select ?on ?emp(ename,sal) ? ?to ?monkey;
3、授予alter權限
如果black用戶要修改scott.emp表結構,則必須授予alter對象權限
grant ?alter ?on ?emp ? to ?balke ;
4、授予execute權限
如果用戶想要執行其他方案的包/過程/函數,則必須有execute權限。比如為了讓ken可以執行dbms_transaction,可以授予execute權限
? grant ?execute ?on ?dbms_transaction ?to ?ken;
5、授予index權限
讓用戶在別的方案上建立索引,必須有index權限。讓black在在scott.emp上建立索引,就給其index的對象權限
grant ?index ?on ?scott.emp ? to ?blake;
6,使用with ?grant ? option?
該選項用于轉授對象權限,但是該選項只能被授予用戶,而不能授予角色。
回收對象權限:
在oracle9i中,收回對象權限可以由對象的所有者來完成,也可以由dba來完成。但是,收回對象后,用戶就不能執行相應的sql命令,注意對象的權限是否級聯收回?【級聯回收:blake的權限被收回,則jones的權限也就消失了】
如:scott →blake→jones
drop user hfut ? cascade;
總結
以上是生活随笔為你收集整理的Oracle之索引、权限的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言 · 交换Easy
- 下一篇: 网络基础知识及计算机基础,OSI7层