第四章字典Oracle通過來管理和展現數據庫信息通常存_第1頁
第四章字典Oracle通過來管理和展現數據庫信息通常存_第2頁
第四章字典Oracle通過來管理和展現數據庫信息通常存_第3頁
第四章字典Oracle通過來管理和展現數據庫信息通常存_第4頁
第四章字典Oracle通過來管理和展現數據庫信息通常存_第5頁
免費預覽已結束,剩余30頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

4章數據字Oracle通過數據字典來管理和展現數據庫信息,數據字典通常數據庫的元數據,是數據的認知,加強習能力。本章對Oracle的數據字典進行探討。數據字典概數據字典(DataDictionary)是Oracle數據庫的一個重要組成部分,是元數據(Metadata)的地點。OracleRDBMS使用數據字典記錄和管理對象信息和安全信息等,用戶和數據庫 所有數據Schema對象的定義(表、視圖、索引、聚簇、同義詞、序列、過程、數據庫的空間分配和字段的缺省完整性Oracle審計其他數總,字是庫過據,Orale數據基可實解。新或改動,對于數據字典的修改很容易就會導致數據庫紊亂,造成無法恢復的,而且Oracle公司不對此類操作帶來的負責。通常所說的數據字典由四部分組成:內部RDBMS(X$)表、數據字典表、動態性能內部RDBMS(X$)X$表是Oracle數據庫的部分,這些表用于內部數據庫信息,維持數據庫的正常運行。X$表是加密命名的,而且Oracle不作文檔說明,這部分知識是Oracle公司的技術,Oracle通過這些X$建立起其他大量視圖提供用戶查詢管理由于X$表記錄了大量有用的信息,所以也不停的被全球DBA不懈的探索著,最為人所熟知的有X$KSMSP等X$表的本質上是一系列的C結構體,是Oracle數據庫的運行基礎,在數據庫啟動時由OracleOracleSYSDBA之外SQL>grantselectonx$ksppitoSQL>grantselectonx$ksppitoeygle;grantselectonx$ksppitoeygle*ERRORatlineORA-02030:canonlyselectfromfixedOracle的解釋是ORA-ORA-02030canonlyselectfromfixedCause:AnattemptisbeingmadetoperformanoperationotherthanaretrievalfromafixedAction:YoumayonlyselectrowsfromfixedX$OracleAUTOTRACE功能,當我們查詢一些常用視圖的時候,我們可以通過AUTOTRACE功能發現這些View的底層表。以下是Oracle10gR2SQL>setautotracetraceexSQL>select*fromExecutionnhash|Id| | |Rows|Bytes|Cost(%CPU)| 0|SELECTSTATEMENT 1 926 1(100)|00:00:01|*1|HASH 1 926 1(100)|00:00:01|*2 FIXEDTABLEFULL|X$KSPPI 1 249 (0)| 3 FIXEDTABLEFULL|X$KSPPCV 100|67700 (0)|||PredicateInformation(identifiedbyoperation1-filter(TRANSLATE("KSPPINM",'_','#')NOTLIKE'#%'"KSPPSTDF"='FALSE'ORTRANSLATE("KSPPINM",'_','#')NOTLIKEX$表,也許你曾經關注過:X$KVIT。X$KVIT-[K]ernelLayerPerformanceLayer[V][I]nformationtables[T]ransitoryInstanceparametersSQL>select*fromv$versionwhererownum<2;OracleDatabase10gEnterpriseEditionRelease.0-ProdSQL>selectkvittag,kvitval,kvitdscfromx$kvit; KVITVALksbcpu17rows4numberoflogicalCPUsinthesystemusedby0numberofphysicalCPUcoresinthesystemusedby2numberofphysicalCPUsocketsinthesystemusedbyOracle4highwatermarkofnumberofCPUsusedbyOracle0highwatermarkofnumberofCPUcoreson2highwatermarkofnumberofCPUsocketsonsystem4numberofavailableCPUsinthesystem1CPUdynamicreconfigurationsupported238518numberofbuffers25largedirtyqueueifkcbclwreaches40MaxpercentageofLRUlistforegroundcanscanfor2InitialpercentageofLRUlisttokeepclean750numberbufferobjects0Flagthatindicatesrecoveryordb0ErrorLogNumberforthread0SGA:opcodeforcheckpointcross-instance0SGA:opcodeforpqcheckpointcross-instance不知道大家是否還記得,觸發進程DBWR寫動作的條件包含這樣兩個臟緩沖 SQL>Entervalueforpar: 25SQL>Entervalueforpar: 25largedirtyqueueifkcbclwreaches ANDPercentageofLRUbuffersfordbwrtoscanwhenlookingfor Buffer-LRUBlock之后,如果還找不到足夠的空間,則觸發DBWR執行寫出。通過這些內容,我們可以把很多數據庫抽象的概念的,大家可以繼續 40MaxpercentageofLRUlistforegroundcan通過這些內容,我們可以把很多數據庫抽象的概念的,大家可以繼續 40MaxpercentageofLRUlistforegroundcanscanSQL>Entervalueforpar:ANDx.ksppinmLIKEANDx.ksppinmLIKEVALUE_db_block_max_scan_pct Percentageof索。在第五章對這些內容作一點進一步的說明數據字典數據字典表(Datadictionarytable)用以表、索引、約束以及其他數據庫結構的信息。這些對象通常以“$”結尾(TAB$、OBJ$、TS$等),在創建數據庫的時候通過運sql.bsq腳sql.bsq是非常重要的一個文件,其中包含了數據字典表的定義及注釋說明,每個試圖深入學習Orace數據庫的人都應該仔細閱讀一下該文件。該文件位于$ORACLE_HOME/rdbms/admn下. remWhenevernewcolumniscreatedtostoreinternal,userorkernelcolumnremnumber,besuretoupdatethestructureadtDTinatb.csothat remWhenevernewcolumniscreatedtostoreinternal,userorkernelcolumnremnumber,besuretoupdatethestructureadtDTinatb.csothatthoseremcolumnswillbeupdatedproperlyduringdropcolumn. 拆分方便了管理和,也方便了我們的研究和學習,下面通過一些BSQ對象了解一以下是我們曾經提到過的bootstrap$/*DO/*DONOTCREATEINDEXON*TRANSACTIONDURINGTRUNCATE varchar2("M_IDEN")notnull, /*objectname*/ numbernot /*namespaceofobject(seeKQD.H):/*1=TABLE/PROCEDURE/TYPE,2=BODY,3=TRIGGER,4=INDEX,5=CLUSTER,/*8=LOB,9=DIRECTORY,/*10=QUEUE,11=REPLICATIONOBJECTGROUP,12=REPLICATIONPROPAGATOR,/*13=JAVASOURCE,14=JAVARESOURCE/*58=(DataMining)MODEL/*subordinatetothenamenumbernot/*objecttype(seeKQD.H):/*1=INDEX,2=TABLE,3=CLUSTER,4=VIEW,5=SYNONYM,6=SEQUENCE,/*7=PROCEDURE,8=FUNCTION,9=PACKAGE,10=NO-EXISTENT,/*11=PACKAGEBODY,12=TRIGGER,13=TYPE,14=TYPEBODY,/*19=TABLEPARTITION,20=INDEXPARTITION,21=LOB,22=LIBRARY,/*23=DIRECTORY,24=QUEUE,/*25=IOT,26=REPLICATIONOBJECTGROUP,27=REPLICATIONPROPAGATOR,/*28=JAVASOURCE,29=JAVACLASS,30=JAVARESOURCE,31=JAVAJAR,/*32=INDEXTYPE,33=OPERATOR,34=TABLESUBPARTITION,/*35=INDEXSUBPARTITION/*82=(DataMining)MODEL)storage(initial10knext100kmaxextentsunlimitedpctincrease/注意通常大家習慣查詢的DBA_OBJECTS字典視圖就是基于OBJ$數據字典表創建的,DBA_OBJECTS中有兩個字段經常使人誤解:OBJECT_ID和DATA_OBJECT_ID。這兩個字段分別來自OBJ$中的OBJ#和DATAOBJ#,其中OBJ#(也即OBJECT_ID)可以被看作是對象的邏輯號(類似序列號一樣分配,該序號一旦分配之后就不會發生改變;而DATAOBJ#/*DONOTCREATEINDEXON*TRANSACTIONDURINGTRUNCATE(也即DATA_OBJECT_ID)則是和物理關聯的編號,通常被認為是對象的物理號,這個編號會隨著對象物理結構的改變而發生改變。注意下面的注釋中已經清晰的了這一點,Orace提示“不要在DATAOBJ#上創建索引,因為在空間事務如/*DONOTCREATEINDEXON*TRANSACTIONDURINGTRUNCATESQL>createtableSQL>createtabletestasselect*fromdba_users;Tablecreated.SQL>selectobject_id,data_object_idfrom22whereowner='EYGLE'andOBJECT_IDSQL>truncatetableTableSQL>selectobject_id,data_object_idfrom2whereowner='EYGLE'andobject_name='TEST';OBJECT_IDDATA_OBJECT_ID實際上這也暗TRUNCATE作為DDL可以快速回收空間的本質,在執行TRUNCATE操將對象的數據對象重新定位,完成空間回收。那么實際上,雖然Oracle并未提供直接的辦法,在原對象位置被重新寫入數據之前,TRUNCATE數據仍然是有辦法恢復的(就如同在Windows上誤刪除的文件,在覆蓋之前,是可以通過軟件進行恢復的。由于數據字典表對于數據庫的穩定運行生死攸關,所以通常Oracle不允許直接對數據字典進行操作,當用戶執行DDL操作或者某些DML操作時,在Oracle將這些操作解析為例如當用戶創建一張數據表時,Oracle將會在執行一系列的內部操作,比如向obj$表中插入數據、向tab$表中記錄表數據、向col$表中記錄字段信息、向con$記錄約束信息、向seg$中記錄數據段信息等,以下測試來自OracleDatabase11g,通過我們可以獲得這些內SQL>select*fromv$versionwhererownum<2;OracleDatabase11gEnterpriseEditionRelease.0-ProductionSQL>altersessionsetevents'10046tracenamecontextforever,level12';Sessionaltered.SQL>createtableeygleasselect*fromdba_users;Tablecreated.SQL>SELECTVALUEFROMV$DIAG_INFOWHERENAME='DefaultTraceFile';注意,以上查詢文件的視圖V$DIAG_INFO是11g中引入的,其他版本中并不存在。摘錄一點文件中的數據,從中可以清晰的看到前臺的一個DDL語句在是怎樣被createtablecreatetableeygleasselect*fromdba_usersENDOFSTMT的分解操作,向obj$中增加記錄的DMLinsertintoENDOFupdatecon$updatecon$setcon#=:3,spare1=:4whereowner#=:1and增加段信息,向seg$insertintoseg$,groups,cachehint,hwmincr,spare1,scanhint,bitmapranges)valuesinsertinsert 向col$insertintodecode(:5,2,decode(:8,-ENDOFSTMTOracle通過將DDL解析為DML些信息反向解析以得到原始的創建語句,從Oracle9i開始,一個工具包 SQL>setpagesizeSQL>setlongSQL>selectdbms_metadata.get_ddl('TABLE','EYGLE')fromCREATETABLE "USERNAME"VARCHAR2(30)NOTNULL"USER_ID"NUMBERNOTNULL"PASSWORD""ACCOUNT_STATUS"VARCHAR2(32)NOTNULL"LOCK_DATE""EXPIRY_DATE""DEFAULT_TABLESPACE"VARCHAR2(30)NOTNULL"TEMPORARY_TABLESPACE"VARCHAR2(30)NOTNULL"CREATED"DATENOTNULL"PROFILE"VARCHAR2(30)NOTNULL"INITIAL_RSRC_CONSUMER_GROUP""EXTERNAL_NAME""PASSWORD_VERSIONS""EDITIONS_ENABLED")PCT10PCTUSED40INITRANS1MAXTRANS PRESSSTORAGE(INITIAL65536 MINEXTENTS1PCTINCREASE0LISTS1LISTGROUPS1BUFFER_POOLTABLESPACE靜態數據字典視由于X$表和數據字典表通常不能直接,Orace創建了靜態數據字典視圖來提供用戶據字典視圖。數據字典視圖在創建數據庫時由caaogsql(該位于 靜態數據字典 類視圖包含了用戶限的所有對象的信息DBA_SELECTANYTABLE權通過三類視圖在本質上是為了實現權限的控制。在Oracle(Schema)是對應的,SchemaSchema將不同用戶的對象開來,用戶可以自由自己Schema的對象,但是對于其他Schema對象的則需要獲得。 SQL>connectSQL>connect獲獲 之后,用戶就能夠通過ALL_TABLES視圖獲得這些表的信息SQL>grantselectonsalestoGrant而DBA_TABLES則是一個超級集合,包含了數據庫所有的表對象,查詢這個視圖需要DBA的權限或者SELECTANYTABLE的系統權限。通過以下查詢可以簡要統計不同用戶擁 selectowner,count(*)fromdba_tablesgroupbyownerorderby2; 1123rows靜態數據字典視圖的內既然以上提到的這三類字典都是視圖(VIEW,那這些視圖是怎樣建立起來的?又是如何實現的權限控制呢?我們一起來探索一下Orace的實現。通常USER_類視圖不包含 createorcreateor ceview(TABLE_NAME,TABLESPACE_NAME,CLUSTER_NAME,IOT_NAME, ,PCT_USED,DEGREE,INSTANCES,CACHE,TABLE_LOCK,SAMPLE_SIZE,LAST_ YZED,PARTITIONED,IOT_TYPE,TEMPORARY,SECONDARY,NESTED,BUFFER_POOL,ROW_MOVEMENT,GLOBAL_STATS,USER_STATS,DURATION,SKIP_CORRUPT,MONITORING,CLUSTER_OWNER,DEPENDENCIES,COMPRESSION), ),0,,decode(bitand(perty,decode(bitand(perty,1024),0,null,fromsys.ts$ts,sys.seg$s,sys.obj$co,sys.tab$t,sys.obj$o,sys.obj$cx,sys.user$cuwhereo.owner#=userenv('SCHEMAID')ando.obj#=andt.dataobj#=cx.obj#(+)andcx.owner#=cu.user#/whereo.owner#=whereo.owner#=這就限制了當前查詢只返回當前用戶的SCHEMAand(o.owner#=userenv('SCHEMAID')oro.obj#inand(o.owner#=userenv('SCHEMAID')oro.obj#in(selectfromsys.objauth$wheregrantee#in(selectfrom))or/*userhassystemprivileges*/exists(selectnullfromv$enabledprivswherepriv_numberin(-45/*LOCKANYTABLE-47/*SELECTANYTABLE-48/*INSERTANYTABLE-49/*UPDATEANYTABLE-50/*DELETEANYTABLE))這個條件擴展了關于用戶限的對象信息,所以實際上 ALL_TABLESwhereo.owner#=u.user#ando.obj#=t.obj#andbitand(perty,1)=whereo.owner#=u.user#ando.obj#=t.obj#andbitand(perty,1)=andt.bobj#=co.obj#andandt.ts#=andt.file#=s.file#(+)andt.block#=s.block#(+)andt.ts#=s.ts#(+)andt.dataobj#=cx.obj#(+)andcx.owner#=cu.user#/這就是這幾類數據字典視圖的區別所在,也就是Oracle實現權限的方式同義詞(synonym)也是數據庫中的常見對象,可以看作是為表、視圖、物化視圖(typeobject(user-definedobjecttype)或是另一個同義詞所創建的別中外。使用同義詞是出于方便或安全上的考慮。例如,可以使用同義詞進行以下工作隱藏一個數據庫對象的名字和擁有者(owner)隱藏分布式環境(distributeddatabase)中對象(remoteobject)的位置簡化數據庫用戶的SQL語句和視圖類似能夠限制,用于實現更精細的控制(fine-grainedaccesscontrol)用戶可以創建公(public或私有(private的同義詞共同義詞由特殊的用PUBLIC同義詞在分布式和布式環境中都有很大用處,因為同義詞隱藏了相關對象的具體信息包括對象在分布式環境中的位置信息這樣做的好處是如果相關對象必須重命名或移動位置的話,只需重新定義同義詞,而使用同義詞的應用程序不會受這類數據庫修改的影響。義詞還簡庫環戶的SQL語顯示了數據庫管理員為什么以及如何使用公共同義詞publicsynonym)隱庫對SQL句SALES_DATA表位于EYGLE用戶的方案中PUBLIC用戶組對SALES_DATA表的SELECT權限。此時,用戶可以使用以下SQL語句查詢SALES_DATA表: SELECT*FROM 注意用戶必須在語句中指定表名,及此表所屬的方案(schema如果數據庫管理員使用如下SQL CREATEPUBLICSYNONYMsalesFOR 創建了公共同義詞后,用戶可以使用更簡單的SQL語句來查詢SALES_DATACREATECREATEOR VIEWSYS.DICTIONARY(table_name,comments)SELECT ment$FROMSYS.obj$ $WHEREo.obj#=c.obj#(+)ANDc.col#ISNULLANDo.owner#=0ANDo.type#=/*這里owner#=0為SYS用戶,o.type#=4為VIEW類型,可以參考user$、obj$表*/AND( o.NAMELIKE'USER%'ORo.NAMELIKE'ALL%'SELECTSELECT*FROMDROPPUBLICSYNONYM注意公共同SALES隱SALES_DATAEYGLE。如果要刪除不再使用的同義詞,可使用如下DROPPUBLICSYNONYMALL_SYNONYMS:描述當前用戶可的全部同義詞DBA_SYNONYMS:描述數據庫中的全部同義詞常用數據字典視圖舉在DBA進行數據庫管理和過程中,經常需要查詢一些數據字典視圖獲得相關的數據DICT/為了方便檢索,Oracle(DICTIONARY)Oracle又創建了兩個名為DICT和DICTIONARY的同義詞:SQL>SQL>select2fromdba_objectswhereobject_namein('DICT','DICTIONARY'); SQL>descSQL>desc 不要被TABLE_NAME這個描述迷惑,這里應該用OBJECT_NAME更符合實際,DICTIONARY視圖包含的是當前用戶可以的所有數據字典視圖。通過DICTIONARY的:OROR(o.NAMELIKEANDEXISTS(SELECTNULLFROMWHEREpriv_number=-47/*SELECTANYTABLE*/)) 所有用戶都能 USER和ALL類別的視圖,但 DBA類視圖則需要判斷是否具SELECTANYTABLEUNIONSELECTo.NAME, ment$FROMSYS.obj$o, $cWHEREo.obj#=c.obj#(+)ANDo.owner#=0ANDo.NAMEIN('AUDIT_ACTIONS','COLUMN_PRIVILEGES','DICTIONARY','DICT_COLUMNS','DUAL','GLOBAL_NAME','INDEX_HISTOGRAM','INDEX_STATS','RESOURCE_COST','ROLE_ROLE_PRIVS','ROLE_SYS_PRIVS','ROLE_TAB_PRIVS','SESSION_PRIVS','SESSION_ROLES','TABLE_PRIVILEGES','NLS_SESSION_PARAMETERS', 'DBMS_ALERT_INFO','DBMS_LOCK_ALLOCATED')ANDc.col#IS/*這里一個UNIONALL引入一系列所有用戶都可 的視圖UNIONSELECTso.NAME,'Synonymfor'||sy.NAMEFROMSYS.obj$ro,SYS.syn$sy,SYS.obj$WHEREso.type#=5ANDro.linknameISNULLANDso.owner#=1ANDso.obj#=sy.obj#ANDso.NAME<>sy.NAMEANDsy.owner='SYS'ANDsy.NAME=ro.NAMEANDro.owner#=0ANDro.type#=/*這里type#=5為SYNONYM,owner#=1為PUBLIC,這個查詢是找出為視圖建立的共用同義詞*/AND( ro.owner#=USERENV('SCHEMAID')/*根據用戶SCHEMA進行權 ORro.obj#IN(SELECToa.obj#FROMSYS.objauth$WHEREgrantee#IN(SELECTkzsrorolFROMOREXISTS(SELECTNULLFROMv$enabledprivsWHEREpriv_numberIN(-45/*LOCKANYTABLE*/,-47/*SELECTANYTABLE-48/*INSERTANYTABLE-49/*UPDATEANYTABLE-50/*DELETEANYTABLE*/CREATEPUBLICSYNONYMDICTIONARYFORCREATECREATEPUBLICSYNONYMDICTIONARYFORCREATEPUBLICSYNONYMDICTFOR有了這個字典表之后,我們可以通過它查詢我們感的內容,比如以下查詢返回TABLESselecttable_namefromdictwheretable_namelike 2wheretable_name同DICT類似,2wheretable_name通過這個視圖我們可以快速獲得很多有用的信息,比如找到具有較多字段的Top10字典SQL>SELECTFROM table_name,COUNTFROMGROUPBYORDERBY2WHEREROWNUM< COLUMNDICT視圖可以很快速的找到這些視圖,DBA_TAB_COLUMNS視圖記錄了所有表、視圖和ClusterDBA_IND_COLUMNS視圖記錄了所有表和Cluster通過這些字典表,很容易可以實現類似之前題:獲得數據庫中字段最多的表和索OBJ$是一個底層的字典表,其中記錄了數據庫中所有對象的信息,DBA_OBJECTS視圖基于OBJ$建立,一脈相承的,ALL_OBJECTS和USER_OBJECTS視圖也隨之建立。OBJ是一個對于USER_OBJECTSCREATECREATEPUBLICSYNONYMOBJFOR類似的字典表還有IND$/DBA_INDEXES/IND等,掌握了這一規律之后,對于很多類的*_SOURCE視圖SQL>desc DBA_SOURCE/USER_SOUCE/ALL_SOURCE用于保存對象(StoredObject)的源碼。這類視圖的對象類型包括FUNCTION,SQL>desc 通過TEXT動態性能視動態性能(V$)視圖(DynamicPerformanceView)記錄了數據庫運行時信息和統計數據,Oraceraclele對V$GV$V$視在數據庫啟動時,OracleX$表,在此基礎之上,OracleGV$V$視圖。從Oracle8開始,GV$視圖開始被引入,其含義為GlobalV$。除了一些特例以外,每個V$視圖都有一個對應的GV$GV$OPS/RACOPS/RACGV$視圖返V$GV$INST_IDWHERE條件限制建whereinst_idwhereinst_id=Oracle10gR2RACGV$V$GV$的輸出,包含了2個實例的信息:SQL>select2fromINST_ID 12 1而對于 1Oracle提供了一些特殊視圖用以記錄其他視圖的創建方式。v$fixed_view_definition就是SQL>selectview_definitionfromv$fixed_view_definitionwhereGV$FIXED_TABLEV$FIXED_TABLESQL>selectview_definitionfromv$fixed_view_definitionwhere這里我們看到V$FIXED_TABLE基于GV$FIXED_TABLEGV$FIXED_TABLEX$V$視圖基于GV$視圖創建。總結一下,OracleGV$V$視圖是在數據庫創建過程中建立起來的,內置于數據庫中,Oraclev$fixed_view_definition視圖為我們展現這些定義。GV_$,V_$視圖和V$,GV$同義GV$V$之后,OracleGV_$V_$視圖,隨后為這些視圖建立了公用同義詞。這些工作都是通過catalog.sql(該位于$ORACLE_HOME/rdbms/admin/下)實現createorre ceviewcreateorre ceviewv_$fixed_tableasselect*fromv$fixed_table;createorre cepublicsynonymv$fixed_tableforv_$fixed_table;createorre ceviewgv_$fixed_tableasselect*fromgv$fixed_table;createorre cepublicsynonymgv$fixed_tableforgv_$fixed_table; 中可以注意到,首先V_$和GV_$視圖基于V$和GV$視圖被創建,然后基于V_$和GV_$視圖的同義詞被創建。通過V_$視圖,Oracle把V$視圖和普通用戶,V_$視圖的權限可以授予其他用戶,而Oracle不允許任何對于V$視圖的直接 ERRORERRORatlineORA-02030:canonlyselectfromfixedtables/viewsSQL>grantselectonv_$sgatoeygle;Grantsucceeded.X$V$視圖的限制,Oracle制。所以,實際上通常大部分用戶的V$對象,并不是視圖,而是指向V_$視圖的義詞;而V_$視圖是基于真正的V$視圖(這個視圖是基于X$表建立的)創建的。通過以下測試來加深一下理解首先創建一個測試用戶僅授予該用戶 SQL>SQL>createusereygleeidentifiedbyeygle;Usercreated.SQL>grantcreatesessiontoGrant如果此時使用該用戶連接,查詢V$SESSION視圖,數據庫會給出錯誤信息,因為該用戶無權該視圖,但是注意這里提示的視圖是V_$SESSION視圖的問題:SQL>connecteyglee/eygleSQL>connecteyglee/eygleSQL>descv$sessionORA-04043:object"SYS"."V_$SESSION"doesnot V_$SESSION的,而真正的V$SESSION視圖是不允許SYS之外用戶直接的SYSSELECT_CATALOG_ROLE戶獲得查詢數據字典的權限,然后此時用戶就獲得 V$SESSION的權限接下來授予用戶CREATEPROCEDURESQL>connect/assysdbaSQL>connect/assysdbaSQL>grantcreateproceduretoGrantSQL>CREATEORRE CEPROCEDUREuserlistENDSQL>CREATEORRE CEPROCEDUREuserlistEND PLS-00201:identifier'V$SESSION'mustbedeclared PL/SQL:SQLStatementignored PL/SQL:ORA-00942:tableorviewdoesnot PL/SQL:SQLStatement PLS-00597:expression'L_DATA'intheINTOlistisofwrongtype PL/SQL:Statementignored PLS-00487:Invalidreferencetovariable注意以上的錯誤信息主要是ORA-00942,也就是過程發現不了V$SESSION視圖,這說明用戶不具備V$SESSION的權限。這是在過程或觸發器中字典對象可能遇到的典型錯誤,雖然當我們使用用登錄時可以V$SESSION視圖,但是該權限是通過SELECT_CATALOG_ROLE角色所以為了獲得對V$SESSION視圖的權限,需要對用戶進行顯示,當然這個要V_$SESSION進行:SQL>connect/assysdbaSQL>grantselectonv_$sessiontoeyglee;Grantsucceeded.SQL>alterprocedureuserlistProcedureSQL>alterprocedureuserlistProcedure 時SQL>setserveroutputonSQL>execuserlistEYGLEE(sid=128,serial#=5600)isconnectedfrommachinelocalhost.localwithprogram:sqlplus@localhost.local (TNSV1-V3)EYGLE(sid=133,serial#=12772)isconnectedfrommachinelocalhost.localwithprogram:sqlplus@localhost.local (TNSV1-V3)PL/SQLproceduresuccessfullyOracleVIEW優先,然后是同義詞,通過以下實驗來驗證一下這個結論首先參考Oracle處理機X$EYGLE,V$EYGLE,V_$EYGLE和公用同義詞Oracle9iOracle9iEnterpriseEditionRelease.0-SQL>createtablex$eygleasselectusernamefromdba_users;TableSQL>createviewv$eygleasselect*fromx$eygle;ViewSQL>createviewv_$eygleasselect*fromViewSQL>createpublicsynonymv$eygleforSynonymSQL>connect/asSQL>connect/assysdbaSQL>createviewv$eygleasselectusername,user_idfromViewSYSV$EYGLE 時,Oracle選 了V$EYGLE同義詞NOTNULLNOTNULLVARCHAR2(30)NOTNULLNUMBERv$fixed_view_definition視圖是我們研究Oracle對象關系的一個,仔細理解Oracle的數據字典機制,有助于深入了解和學習Oracle數據庫知識。進一OracleX$v$fixed_tableOracle9iR2394X$X$表建立以后,基于X$表的GV$和V$V$FIXED_TABLESQL>selectcount(*)fromv$fixed_tableSQL>selectcount(*)fromv$fixed_tablewherenamelikeSQL>selectcount(*)fromv$fixed_tablewherenamelike'V$%';v$fixed_table共記錄了394259259912以上是Oracle9iR2而在Oracle10gR2中,v$fixed_table中的對象數量增加到1383個(不同安裝可能不同).Oracle11gR11741Oracle10g開始,一個同以前不同新的大家可以通過這個視圖對Oracle動態性能視圖與數據庫由于動態性能視圖是在數據庫啟動過程中自動創建的,所以在數據庫啟動的不同階段,我們能夠的視圖也各不相同。Nomount當數據庫啟動到nomountMount當數據庫啟動到Mount狀態時,控制文件被,和控制文件相關的視圖此時可以進行Open當數據庫Open最后的驗最后讓我們通過V$PARAMETERV$PARAMETER的結 MENTfromGV$PARAMETERV$PARAMETERGV$PARAMETER創建的,GV$PARAMETER則是由X$創建的:DECODE(BITAND(ksppstvf,7),1,'MODIFIED',4,'SYSTEM_MOD',DECODE(BITAND(ksppstvf,2),2,'TRUE','FALSE'),ksppdesc,FROMx$ksppix,x$ksppcvWHERE(x.indx=AND((TRANSLATE(ksppinm,'_','#')NOTLIKE'#%')OR(ksppstdf=)說明:在這里我們看到GV$PARAMETER來源于x$ksppi,x$ksppcv兩個X$表。x$ksppx$ksppcv基本上包含所有數據庫參數,v$parameer展現的是不包含"_"開頭的參數。以_"開頭的參數我們通常稱為隱含參數,一般不建議修改,但很多因為功能強大經常使用而廣為人知。視圖在非SYS用戶下查詢,很多朋友曾經提出過疑問,那就是當V$PARAMETER對象因為除了SYS用戶以外,其他用戶不能查詢V$視圖,V$視圖也不能因為除了SYS用戶以外,其他用戶不能查詢V$視圖,V$視圖也不能給其他用戶ORA-04043:objectsys.v$parameterdoesnotPARSINGPARSINGINCURSOR#2len=198dep=1uid=0oct=3lid=0tim=1092440257023120hv=selectobj#,type#,ctime,mtime,stime,status,dataobj#,flags,oid$,spare1,spare2fromobj$whereowner#=:1andname=:2andnamespace=:3andremoteownerisnullandlinknameisnullandsubnameisnullENDOFPARSE#2:c=0,e=1601,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=0,tim=1092440257023088BINDS#2:bind0:dty=2mxl=22(22)mal=00scl=00pre=00oac=08oacfl2=1size=24offset=0bfp=b701cf24bln=22avl=02 bind1:dty=1mxl=32(11)mal=00scl=00pre=00oac=18oacfl2=1size=32offset=0bfp=b701c7b4bln=32avl=11 Oracle如何通過同義詞定位 ,我們可以看到的通過通過在這里不要使用tkprof格式化,因為tkprof可能會隱去重要信息(本文 : bind2:dty=2mxl=22(22)mal=00scl=00pre=00oac=08oacfl2=1size=24offset=0bfp=b701c790bln=24avl=02 Oracle根據三個傳入參數owner#=25,name=V$PARAMETER,namespace=1PARSINGINCURSOR#4PARSINGINCURSOR#4len=46dep=1uid=0oct=3lid=0tim=1092440257028409hv=selectnode,owner,namefromsyn$whereobj#=:1ENDOFPARSE#4:c=0,e=1278,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=0,tim=1092440257028379BINDS#4:bind0:dty=2mxl=22(22)mal=00scl=00pre=00oac=08oacfl2=1size=24offset=0bfp=b701b3ccbln=22avl=03 SQL>selectobject_name,object_id,object_typefromSQL>selectobject_name,object_id,object_typefromdba_objectswhere OBJECT_ID841841正是這個同義詞,我們再繼續看這個遞歸SQLSQL>selectnode,owner,name whereobj#=841;原來這個SQL獲得的是同義詞的底層對象,這里得到了V_$PARAMETER。繼續向下看看這文件PARSINGINCURSOR#8len=37dep=1uid=0oct=3lid=0tim=1092440257074273hv=selecttextfromview$whererowid=:1ENDOFPARSE#8:c=0,e=1214,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=0,tim=1092440257074242BINDS#8:bind0:dty=11mxl=16(16)mal=00scl=00pre=00oac=18oacfl2=1size=16offset=0 bln=16avl=16 執行查詢view$視圖,獲得視圖定義文本,看一下這里的是rowid000001CD.0013.0001rowid,查詢時需要SQL>SQL>selectobj#from2wheredbms_rowid.rowid_to_restricted(rowid,0)='000001CD.0013.0001';SQL>selectobject_name,object_typefromdba_objectswhereobject_id=840; 這里的正是V_$PARAMETER至此就完成了查詢中的回溯及定位,當然,實際過程中復雜的多,感的朋友可以按照文中的方法測試研究一下最后總結一下SQL語句中Oracle 如果私有同義詞存在,將使用這個同義詞所的對象如果公共同義詞存在,將使用這個同義詞所的對象ParseforObjectelseif(SYNONYMt)elseif(publicParseforObjectelseif(SYNONYMt)elseif(publicSYNONYMt)signalORA- 同義詞優化案例一在分析一個庫中的statspack報告時,發現有1條SQL引起了大量的邏輯讀,執274,131517.9通過和開發部門的溝通,了解到應用基礎架構,就是從數據字典中查詢相關信息(如表結構、字段及約束,然后動態拼SQL,繼而執行并返回結果,這種做法在系統負荷低SELECTNULLASSELECTNULLAStable_cat,t.ownerAStable_schem,t.table_nameAStable_name,t.column_nameAScolumn_name,DECODE(t.data_type,'CHAR',1,'VARCHAR2',12,'NUMBER',3,'LONG',-1,'DATE','RAW',-3,'LONGRAW',-4,1111)ASt.data_typeASDECODE(t.data_precision,null,t.data_length,t.data_precision)AS0ASbuffer_length,t.data_scaleASdecimal_digits,10ASDECODEDECODE(t.nullable,'N',0,1)ASnullable,NULLASremarks

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論