国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > 綜合 > 正文

實(shí)例講解如何查找某個(gè)對(duì)象的定義情況

2024-07-21 02:42:02
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
在實(shí)際的工作中,我們經(jīng)常需要查找某個(gè)對(duì)象的定義的情況,本文中我們將針對(duì)不同類型的對(duì)象分別進(jìn)行講解:

一、V$視圖和X$視圖

普通的用戶不能訪問(wèn)V$視圖:

SQL> conn lunar/lunar@test1已連接。SQL> select * from user_sys_PRivs;USERNAME       PRIVILEGE   ADMIN_OPTION---------- -------------- ------------SQL> select * from user_role_privs;USERNAME      GRANTED_ROLE   ADMIN_OPTION DEFAULT_ROLE OS_GRANTED----------- --------------- ------------ ------------ ----------LUNAR       CONNECT      NO           YES          NOLUNAR       RESOURCE     NO           YES          NOPUBLIC      PLUSTRACE    NO           YES          NOSQL> select count(*) from v$fixed_table;select count(*) from v$fixed_tableORA-00942: 表或視圖不存在必須授權(quán):SQL> conn /@test1 as sysdba已連接。SQL> grant select on v_$fixed_table to lunar;授權(quán)成功。SQL> conn lunar/lunar@test1已連接。SQL>

我們可以發(fā)現(xiàn),得到授權(quán)的普通用戶仍然只能訪問(wèn)V$開(kāi)頭的視圖,而不能直接訪問(wèn)V_$開(kāi)頭的視圖,因?yàn)閷?shí)際上V$視圖是V_$視圖的公有同義詞(PUBLIC SYNONYM)要想訪問(wèn)V_$必須帶上SYS.V_$。

例如:

SQL> select count(*) from v$fixed_table;  COUNT(*)----------       912SQL> select count(*) from v_$fixed_table;select count(*) from v_$fixed_tableORA-00942: 表或視圖不存在SQL> select count(*) from sys.v_$fixed_table;  COUNT(*)----------       912SQL>

與此同時(shí),也可以授予用戶SELECT any table權(quán)限,這樣這個(gè)用戶就可以訪問(wèn)所有的V$視圖:

SQL> grant select any table to lunar;授權(quán)成功。SQL> select * from user_role_privs;USERNAME         GRANTED_ROLE       ADMIN_OPTION DEFAULT_ROLE OS_GRANTED------------ --------------------- ------------ ------------ ----------LUNAR            CONNECT             NO           YES          NOLUNAR            RESOURCE            NO           YES          NOPUBLIC           PLUSTRACE           NO           YES          NOSQL> select * from user_sys_privs;USERNAME         PRIVILEGE           ADMIN_OPTION------------ ----------------------- ------------LUNAR            SELECT ANY TABLE       NOSQL> select count(*) from v$fixed_table;  COUNT(*)----------       912SQL> select * from v$fixed_table where rownum<2;NAME       OBJECT_ID TYPE   TABLE_NUM---------- ---------- ----- ----------X$KQFTA    4294950912 TABLE     0SQL> select * from v_$fixed_table where rownum<2;select * from v_$fixed_table where rownum<2ORA-00942: 表或視圖不存在SQL> select * from sys.v_$fixed_table where rownum<2;NAME       OBJECT_ID  TYPE   TABLE_NUM---------- ---------- ----- ----------X$KQFTA    4294950912 TABLE      0SQL>

通過(guò)查詢V$FIXED_TABLE視圖,我們可以看到大部分V$視圖和一些X$視圖(還有一些Oracle未公開(kāi)的視圖不在其中)。

有人要問(wèn),那么這些V$視圖又是有什么組成的呢?

通過(guò)查詢V$FIXED_VIEW_DEFINITION視圖,我們可以看到這些V$視圖的創(chuàng)建語(yǔ)句:

SQL> conn /@test1 as sysdba已連接。SQL> grant select any table to lunar;授權(quán)成功。SQL> conn lunar/lunar@test1已連接。SQL>SQL> set heading off echo off long 50000 pages 10000SQL> select * from v$fixed_view_definition where view_name='V$FIXED_TABLE';V$FIXED_TABLE                  select  NAME , OBJECT_ID , TYPE , TABLE_NUM from GV$FIXED_TABLE where inst_id = USERENV('Instance')SQL> select  NAME , OBJECT_ID , TYPE , TABLE_NUM from GV$FIXED_TABLE where inst_id = USERENV('Instance')

那么這個(gè)GV$FIXED_TABLE視圖的定義又是怎樣的呢?

SQL> select * from v$fixed_view_definition where view_name='GV$FIXED_TABLE';GV$FIXED_TABLE                 select inst_id,kqftanam, kqftaobj, 'TABLE', indx from x$kqfta union all select inst_id,kqfvinam, kqfviobj, 'VIEW', 65537 from x$kqfvi union all select inst_id,kqfdtnam, kqfdtobj, 'TABLE', 65537 from x$kqfdtSQL> select inst_id,kqftanam, kqftaobj, 'TABLE', indx from x$kqfta union all select inst_id,kqfvinam, kqfviobj, 'VIEW', 65537 from x$kqfvi union all select inst_id,kqfdtnam, kqfdtobj, 'TABLE', 65537 from x$kqfdt

此時(shí)我們就找到了創(chuàng)建一個(gè)V$視圖的最低層的信息,即一個(gè)V$視圖是由哪些X$表構(gòu)成的。

要找到底層X(jué)$表的索引信息,可以查詢v$indexed_fixed_column:

SQL> desc v$indexed_fixed_columnName            Type         Nullable Default Comments --------------- ------------ -------- ------- -------- TABLE_NAME      VARCHAR2(30) Y                         INDEX_NUMBER    NUMBER       Y                         COLUMN_NAME     VARCHAR2(30) Y                         COLUMN_POSITION NUMBER       Y                         SQL> 例如:SQL> select * from v$indexed_fixed_column where table_name='X$KQFTA';TABLE_NAME          INDEX_NUMBER COLUMN_NAME  COLUMN_POSITION------------------ ------------ -------------- ---------------X$KQFTA               1 ADDR                    0X$KQFTA               2 INDX                    0SQL>

一般情況下,V$視圖和GV$視圖的定義是一樣的,只是GV$視圖中包含的實(shí)例id的信息,常用于OPS或者RAC的系統(tǒng)中,也有少數(shù)幾個(gè)V$視圖和GV$視圖的定義是有區(qū)別的,比如GV$PX_PROCESS和V$PX_PROCESS:

SQL> select * from v$fixed_view_definition where view_name='GV$PX_PROCESS';GV$PX_PROCESS                  select a.inst_id, a.kxfpdpnam,  decode(bitand(a.kxfpdpflg, 16), 0, 'INUSE', 'AVAILABLE'),  b.pid, a.kxfpdpspid, c.sid, c.serial#  from x$kxfpdp a, V$PROCESS b, V$session c  where bitand(kxfpdpflg, 8) != 0 and  a.kxfpdpspid = b.SPID anda.kxfpdpspid = c.PROCESS(+)SQL>select a.inst_id, a.kxfpdpnam,   decode(bitand(a.kxfpdpflg, 16), 0, 'IN USE', 'AVAILABLE'),   b.pid, a.kxfpdpspid, c.sid, c.serial#  from x$kxfpdp a, V$PROCESS b, V$SESSION c  where bitand(kxfpdpflg, 8) != 0 and  a.kxfpdpspid = b.SPID and  a.kxfpdpspid = c.PROCESS(+) SQL> select * from v$fixed_view_definition where view_name='V$PX_PROCESS';V$PX_PROCESS                   select  SERVER_NAME, STATUS, PID, SPID, SID, SERIAL#  from GV$PX_PROCESS where inst_id = USERENV('Instance')SQL>select  SERVER_NAME, STATUS, PID, SPID, SID, SERIAL#  from GV$PX_PROCESS where inst_id = USERENV('Instance')

二、數(shù)據(jù)字典的組成

下面我們?cè)賮?lái)將一個(gè)數(shù)據(jù)字典表的定義呢?

SQL> desc dba_viewsName             Type          Nullable  Default Comments                                                    ---------------- ------------ -------- ------- -------OWNER            VARCHAR2(30)           Owner of the view                                           VIEW_NAME        VARCHAR2(30)           Name of the view                                            TEXT_LENGTH      NUMBER         Y        Length of the view text                                     TEXT             LONG           Y        View text                                                   TYPE_TEXT_LENGTH NUMBER         Y        Length of the type clause of the object view                TYPE_TEXT        VARCHAR2(4000) Y        Type clause of the object view                              OID_TEXT_LENGTH  NUMBER         Y        Length of the WITH OBJECT OID clause of the object view     OID_TEXT         VARCHAR2(4000) Y        WITH OBJECT OID clause of the object view                   VIEW_TYPE_OWNER  VARCHAR2(30)   Y        Owner of the type of the view if the view is an object view VIEW_TYPE        VARCHAR2(30)   Y        Type of the view if the view is an object view              SUPERVIEW_NAME   VARCHAR2(30)   Y        Name of the superview, if view is a subview                 SQL> SQL> set heading off echo off long 1000000000 pages 10000SQL> select text from dba_views where view_name ='DBA_USERS';select u.name, u.user#, u.passWord,m.status,decode(u.astatus, 4, u.ltime,5, u.ltime,6, u.ltime,8, u.ltime,9, u.ltime,10, u.ltime, to_date(NULL)),decode(u.astatus,1, u.exptime,2, u.exptime,5, u.exptime,6, u.exptime,9, u.exptime,10, u.exptime,decode(u.ptime, '', to_date(NULL),decode(pr.limit#, 2147483647, to_date(NULL),decode(pr.limit#, 0,decode(dp.limit#, 2147483647, to_date(NULL), u.ptime +dp.limit#/86400),u.ptime + pr.limit#/86400)))),dts.name, tts.name, u.ctime, p.name, u.defschclass, u.ext_usernamefrom sys.user$ u, sys.ts$ dts, sys.ts$ tts, sys.profname$ p,sys.user_astatus_map m, sys.profile$ pr, sys.profile$ dpwhere u.datats# = dts.ts#and u.resource$ = p.profile#and u.tempts# = tts.ts#and u.astatus = m.status#and u.type# = 1and u.resource$ = pr.profile#and dp.profile# = 0and dp.type#=1and dp.resource#=1and pr.type# = 1and pr.resource# = 1SQL>

三、如何查找用戶自定義的某個(gè)表的定義?

在Oracle 9i前,我們可以使用下面的方法:

SQL> select substr(table_name,1,20) tabname,  2  substr(column_name,1,20)column_name,  3  rtrim(data_type)||'('||data_length||')' from dba_tab_columns  4  where owner='&username'  5  /TABNAME                              COLUMN_NAME    RTRIM(DATA_TYPE)||'('||DATA_LE--------------------------- ---------------------   -------BONUS                                    ENAME                                    VARCHAR2(10)BONUS                                    JOB                                      VARCHAR2(9)BONUS                                    SAL         NUMBER(22)BONUS                                    COMM        NUMBER(22)DEPT                                     DEPTNO      NUMBER(22)DEPT                                     DNAME                                    VARCHAR2(14)DEPT                                     LOC                                      VARCHAR2(13)DUMMY                                    DUMMY       NUMBER(22)EMP                                      EMPNO       NUMBER(22)EMP                                      ENAME                                    VARCHAR2(10)EMP                                      JOB                                      VARCHAR2(9)EMP                                      MGR         NUMBER(22)EMP                                      HIREDATE    DATE(7)EMP                                      SAL         NUMBER(22)EMP                                      COMM        NUMBER(22)EMP                                      DEPTNO      NUMBER(22)SALGRADE                                 GRADE       NUMBER(22)SALGRADE                                 LOSAL       NUMBER(22)SALGRADE                                 HISAL       NUMBER(22)19 rows selectedSQL>

從Oracle 9i開(kāi)始,我們可以使用dbms_metadata.get_ddl來(lái)找到對(duì)象的定義。

例如:

SQL> @C:/TEMP/get_obj_sql.sqlSQL> set heading off echo off pages 10000 long 90000輸入 object_type 的值:  TABLE輸入 object_name 的值:  EMP輸入 object_owner 的值:  LUNAR原值    1: select dbms_metadata.get_ddl(upper('&OBJECT_TYPE'),upper('&OBJECT_NAME'),upper('&OBJECT_OWNER')) from dual新值    1: select dbms_metadata.get_ddl(upper('TABLE'),upper('EMP'),upper('LUNAR')) from dual  CREATE TABLE "LUNAR"."EMP"   (    "EMPNO" NUMBER(4,0) NOT NULL ENABLE,        "ENAME" VARCHAR2(10),        "JOB" VARCHAR2(9),        "MGR" NUMBER(4,0),        "HIREDATE" DATE,        "SAL" NUMBER(7,2),        "COMM" NUMBER(7,2),        "DEPTNO" NUMBER(2,0)   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)  TABLESPACE "SYSTEM" SQL>

大家需要注意,這個(gè)查詢是需要臨時(shí)表空間的,所以如果臨時(shí)表空間不夠查詢就會(huì)有問(wèn)題了:

SQL> @C:/TEMP/get_obj_sql.sqlSQL> set heading off echo off pages 10000 long 90000輸入 object_type 的值:  TABLE輸入 object_name 的值:  DEPT輸入 object_owner 的值:  LUNAR原值    1: select dbms_metadata.get_ddl(upper('&OBJECT_TYPE'),upper('&OBJECT_NAME'),upper('&OBJECT_OWNER')) from dual新值    1: select dbms_metadata.get_ddl(upper('TABLE'),upper('DEPT'),upper('LUNAR')) from dualERROR:ORA-25153: 臨時(shí)表空間為空ORA-06512: 在"SYS.DBMS_LOB", line 424ORA-06512: 在"SYS.DBMS_METADATA", line 557ORA-06512: 在"SYS.DBMS_METADATA", line 1221ORA-06512: 在line 1 未選定行SQL>SQL> SELECT NAME FROM V$TEMPFILE;未選定行SQL> SELECT NAME FROM V$TABLESPACE;NAME------------------------------SYSTEMUNDOTBS1TEMPINDXUSERSSQL> ALTER TEMPORARY TABLESPACE TEMP ADD TEMPFILE 'D:/oracle92/oradata/test1/TEMP01.DBF' SIZE 10M;ALTER TEMPORARY TABLESPACE TEMP ADD TEMPFILE 'D:/oracle92/oradata/test1/TEMP01.DBF' SIZE 10M      *ERROR 位于第 1 行:ORA-00940: 無(wú)效的 ALTER 命令SQL> ALTER TABLESPACE TEMP ADD TEMPFILE 'D:/oracle92/oradata/test1/TEMP01.DBF' SIZE 10M;表空間已更改。SQL> @C:/TEMP/get_obj_sql.sqlSQL> set heading off echo off pages 10000 long 90000輸入 object_type 的值:  TABLE輸入 object_name 的值:  EMP輸入 object_owner 的值:  LUNAR原值    1: select dbms_metadata.get_ddl(upper('&OBJECT_TYPE'),upper('&OBJECT_NAME'),upper('&OBJECT_OWNER')) from dual新值    1: select dbms_metadata.get_ddl(upper('TABLE'),upper('EMP'),upper('LUNAR')) from dual  CREATE TABLE "LUNAR"."EMP"   (    "EMPNO" NUMBER(4,0) NOT NULL ENABLE,        "ENAME" VARCHAR2(10),        "JOB" VARCHAR2(9),        "MGR" NUMBER(4,0),        "HIREDATE" DATE,        "SAL" NUMBER(7,2),        "COMM" NUMBER(7,2),        "DEPTNO" NUMBER(2,0)   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)  TABLESPACE "SYSTEM" SQL>SQL>

dbms_metadata.get_ddl也可以用來(lái)查詢其他對(duì)象的創(chuàng)建語(yǔ)句,使用的方法如下;

select dbms_metadata.get_ddl('對(duì)象類型','對(duì)象名','用戶名') from dual;

例如:

oracle@cs_db02:/arch1/lunar/tools > get_obj_sql.sh procedure aa miscConnected.CREATE OR REPLACE PROCEDURE "MISC"."AA" isbegindelete from error_tip;end aa;

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 奉贤区| 五台县| 尚志市| 黄大仙区| 朝阳市| 林西县| 开封市| 洪洞县| 宿迁市| 吐鲁番市| 盱眙县| 湘潭市| 衡山县| 尼玛县| 巨野县| 正阳县| 赤峰市| 乐清市| 绥江县| 尤溪县| 红原县| 万山特区| 永吉县| 靖宇县| 鸡泽县| 石林| 丰镇市| 灵石县| 和政县| 潮安县| 虹口区| 湘西| 黄梅县| 信丰县| 会泽县| 历史| 达日县| 阿克陶县| 平顶山市| 丹江口市| 桐柏县|