資料字典

Diy_os發表於2015-07-16
SQL> select * from v$version where rownum<2;


BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production


SQL> !cat /etc/issue
Enterprise Linux Enterprise Linux Server release 5.5 (Carthage)
Kernel \r on an \m

學習oracle過程中,透過資料字典我們可以獲取管理資料庫的資訊。
通常資料字典由4部分組成:內部X$表(是oracle資料庫的核心,這些表用於跟蹤記錄了資料庫內部的資訊,oracle不允許sysdba之外的使用者直接訪問,顯示授權也不允許),資料字典表(用以儲存表,索引,約束以及其他資料庫資訊,這些物件通常以$結尾),動態效能檢視(記錄了資料庫執行時資訊和統計的資料資訊),靜態資料字典檢視(oracle提供了靜態資料字典檢視提供來給使用者對於資料字典的訪問,但是這部分內容相對穩定,不能直接修改,故稱作靜態資料字典檢視)。

X$表:隨著對oracle學習研究的深入,我們會接觸到這類表,現階段對這類底層表不作過多的說明。X$KSPPI,X$KSPPCV,X$BH,X$KSMSP,X$KVIT這幾類是我們比較熟知的X$類表。
資料字典表:如果讀者閱讀過之前文章,應該會對sql.bsq檔案不陌生,這個檔案裡是資料字典表的定義以及註釋說明。具體位置$ORACLE_HOME/RDBMS/admin
在建立資料庫時,透過呼叫sql.bsq指令碼來建立資料字典表,例如OBJ$,TAB$等。
對bootstrap$應該很熟悉,記錄了一些資料庫系統基本物件的建立語句,透過bootstrap$進行引導,進一步建立相關重要的物件。
SQL> desc bootstrap$;
 名稱                                                                                                                                                                        是否為空? 型別
 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------- --------------------------------------------------------------------------------------------------------------------
 LINE#                                                                                NOT NULL NUMBER
 OBJ#                                                                                 NOT NULL NUMBER
 SQL_TEXT                                                                             NOT NULL VARCHAR2(4000)

SQL> select * from bootstrap$ where rownum<5;


     LINE#       OBJ#
---------- ----------
SQL_TEXT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
        -1         -1
8.0.0.0.0


         0          0
CREATE ROLLBACK SEGMENT SYSTEM STORAGE (  INITIAL 112K NEXT 56K MINEXTENTS 1 MAXEXTENTS 32765 OBJNO 0 EXTENTS (FILE 1 BLOCK 128))


        20         20
CREATE TABLE ICOL$("OBJ#" NUMBER NOT NULL,"BO#" NUMBER NOT NULL,"COL#" NUMBER NOT NULL,"POS#" NUMBER NOT NULL,"SEGCOL#" NUMBER NOT NULL,"SEGCOLLENGTH" NUMBER NOT NULL,"OFFSET" NUMBER NOT NULL,"INTCOL#" NUMBER NOT NULL,"SPARE1" NUMBER,"SPARE2" NUMBER,"SPARE3" NUMBER,"SPARE4" VARCHAR2(1000),"SPARE5" V
ARCHAR2(1000),"SPARE6" DATE) STORAGE (  OBJNO 20 TABNO 4) CLUSTER C_OBJ#(BO#)


        42         42
CREATE INDEX I_ICOL1 ON ICOL$(OBJ#) PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE (  INITIAL 64K NEXT 1024K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 OBJNO 42 EXTENTS (FILE 1 BLOCK 384))

關於這方面內容,參考之前文章(http://blog.itpub.net/29876893/viewspace-1603494/


動態效能檢視:在資料庫啟動的時,動態建立了X$表,在此基礎上,oracle又建立了V$和GV$檢視(GV$是為了OPS/RAC環境的需要,一般每個V$檢視都有一個GV$檢視與之對應)
除了GV$和V$,oracle建立了GV_$於V_$檢視,然後又為這些檢視建立了共有同義詞,這些工作都是透過catalog.sql來實現的($ORACLE_HOME/rdbms/admin):
catalog.sql中給了註釋說明,詳細的過程可以檢視該文字後面給出的具體呼叫文字:
@@cdstrt
@@cdfixed.sql
@@cdcore.sql


--CATCTL -M
@@cdplsql.sql
@@cdsqlddl.sql
@@cdmanage.sql
@@cdtxnspc.sql
@@cdenv.sql
@@cdrac.sql
@@cdsec.sql
@@cdobj.sql
@@cdjava.sql
@@cdpart.sql
@@cdrep.sql
@@cdaw.sql
@@cdsummgt.sql
@@cdtools.sql
@@cdexttab.sql
@@cddm.sql
@@catldr.sql




--CATCTL -S     Final scripts single process
@@cdoptim.sql
@@catsum.sql
@@catexp.sql
@@cddst.sql
@@cdend.sql

摘自部分cdcore.sql:

create or replace view ALL_LOG_GROUP_COLUMNS
   (OWNER, LOG_GROUP_NAME, TABLE_NAME, COLUMN_NAME, POSITION,LOGGING_PROPERTY)
as
select u.name, c.name, o.name,
       decode(ac.name, null, col.name, ac.name), cc.pos#,
       decode(cc.spare1, 1, 'NO LOG', 'LOG')
from sys.user$ u, sys.con$ c, sys.col$ col, sys.ccol$ cc, sys.cdef$ cd,
     sys.obj$ o, sys.attrcol$ ac
where c.owner# = u.user#
  and c.con# = cd.con#
  and cd.type# = 12
  and cd.con# = cc.con#
  and cc.obj# = col.obj#
  and cc.intcol# = col.intcol#
  and cc.obj# = o.obj#
  and (c.owner# = userenv('SCHEMAID')
       or cd.obj# in (select obj#
                      from sys.objauth$
                      where grantee# in ( select kzsrorol
                                         from x$kzsro
                                       )
                     )
        or /* user has system privileges */
          exists (select null from v$enabledprivs
                  where priv_number in (-45 /* LOCK ANY TABLE */,
                                        -47 /* SELECT ANY TABLE */,
                                        -48 /* INSERT ANY TABLE */,
                                        -49 /* UPDATE ANY TABLE */,
                                        -50 /* DELETE ANY TABLE */)
                  )
      )
  and col.obj# = ac.obj#(+)
  and col.intcol# = ac.intcol#(+)
/
comment on table ALL_LOG_GROUP_COLUMNS is
'Information about columns in log group definitions'
/
comment on column ALL_LOG_GROUP_COLUMNS.OWNER is
'Owner of the log group definition'
/
comment on column ALL_LOG_GROUP_COLUMNS.LOG_GROUP_NAME is
'Name associated with the log group definition'
/
comment on column ALL_LOG_GROUP_COLUMNS.TABLE_NAME is
'Name associated with table with log group definition'
/
comment on column ALL_LOG_GROUP_COLUMNS.COLUMN_NAME is
'Name associated with column or attribute of object column specified in the log group definition'
/
comment on column ALL_LOG_GROUP_COLUMNS.POSITION is
'Original position of column or attribute in definition'
/
comment on column ALL_LOG_GROUP_COLUMNS.LOGGING_PROPERTY is
'Whether the column or attribute would be supplementally logged'
/
grant select on ALL_LOG_GROUP_COLUMNS to public with grant option
/
V_$和GV_$是基於V$和GV_$檢視建立的,然後基於V_$和GV_$檢視的同義詞被建立。透過V_$,oracle把V$檢視和普通使用者隔離,V_$的許可權可以授予給其他使用者,oracle不允許任何對於V$檢視的直接授予,有關內容可以參考之前寫過的文章(http://blog.itpub.net/29876893/viewspace-1688759/),所以大多數我們訪問的V$物件,並不是檢視,而是指向V_$檢視的同義詞,而V_$檢視是基於真正的V$檢視(這個檢視是基於真正的X$表建立)建立,讀者可以透過轉儲分析,也可以參考上述文章。oracle訪問view優先然後是同義詞。
靜態資料字典檢視:
通常分為三類:

上面的三大類檢視,在oracle中是為了實現許可權的控制。schema是使用者具有所有物件許可權的集合,透過schema可以將不同使用者區分開來,使用者可以訪問自己schema的物件,對於其他使用者schema的訪問則需要相關許可權才可以。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29876893/viewspace-1735644/,如需轉載,請註明出處,否則將追究法律責任。

相關文章