Oracle相關資料字典檢視

賀子_DBA時代發表於2018-06-16
問題描述:alert日誌發現報錯主鍵衝突
ORA-12012: 自動執行作業 24 出錯
ORA-00001: 違反唯一約束條件 (ADDEDTAXUSER.PK_PT_INOUTFLOW)
ORA-06512: 在 "DWETL.SP_ETL_CONTROL", line 519
ORA-06512: 在 line 7
透過報錯可以看出,是違反了ADDEDTAXUSER使用者下的PK_PT_INOUTFLOW主鍵,並且是在執行DWETL使用者下的SP_ETL_CONTROL東西的時候報錯的;
那麼接下來透過資料字典查出相關物件到底是什麼,以及他們的建立語句:
1.首先查詢出這個主鍵屬於哪個表?
SQL> select OWNER,CONSTRAINT_NAME,TABLE_NAME from dba_constraints where CONSTRAINT_NAME='PK_PT_INOUTFLOW';
OWNER CONSTRAINT_NAME TABLE_NAME
------------------------------------------------------------ ------------------------------ -----------------------------ADDEDTAXUSER PK_PT_INOUTFLOW PT_INOUTFLOW
2.查詢這個主鍵在哪個表的那個欄位上,可以透過dba_ind_columns 或者dba_cons_columns
SQL> select INDEX_OWNER,INDEX_NAME,TABLE_NAME,COLUMN_NAME from dba_ind_columns where INDEX_NAME='PK_PT_INOUTFLOW';

INDEX_OWNER INDEX_NAME COLUMN_NAME TABLE_NAME
------------------------------ ------------------------------ ------------------------------ ------------------------------
ADDEDTAXUSER PK_PT_INOUTFLOW PT_INOUTFLOW PK_INOUTFLOW
或者
SQL> select owner,CONSTRAINT_NAME,table_name,COLUMN_NAME from dba_cons_columns where CONSTRAINT_NAME='PK_PT_INOUTFLOW';

OWNER CONSTRAINT_NAME TABLE_NAME COLUMN_NAME
------------------------------ ------------------------------ ------------------------------
ADDEDTAXUSER PK_PT_INOUTFLOW PT_INOUTFLOW PK_INOUTFLOW
3.然後檢視DWETL使用者下的SP_ETL_CONTROL 是個什麼東西?
可以看出是儲存過程,如下:
SQL> select OWNER,OBJECT_NAME,OBJECT_TYPE from dba_objects where OBJECT_NAME='SP_ETL_CONTROL';

OWNER OBJECT_NAME OBJECT_TYPE
------------------------------ --------------------------------------------------------------------------------------------
DWETL SP_ETL_CONTROLPROCEDURE
4.檢視這個儲存過程的建立語句,藉助dbms_metadata程式包的get_ddl函式:
set line 200
set pagesize 0
set long 99999
select dbms_metadata.get_ddl('PROCEDURE','SP_ETL_CONTROL','DWETL') from dual;
至此查出了報錯的所有的資訊,可以給開發溝通了。。。。

透過這個問題,順便總結下,常用的查詢語句:
一:查詢物件的建立語句:
select dbms_metadata.get_ddl('TABLE','TABLE_NAME','TABLE_OWNER') from dual;
select dbms_metadata.get_ddl('INDEX','INDEX_NAME','INDEX_OWNER') from dual;
select dbms_metadata.get_ddl('VIEW','VIEW_NAME','VIEW_OWNER') from dual;
select dbms_metadata.get_ddl('PROCEDURE','PROCEDURE_name','PROCEDURE_owner') from dual;
select dbms_metadata.get_ddl('FUNCTION','FUNCTION_NAME','FUNCTION_OWNER') from dual;
二:查詢出資料庫中的有log欄位的資訊,透過DBA_TAB_COLUMNS和dba_lobs資料字典查詢:
SQL>select owner ,table_name ,COLUMN_NAME from dba_lobs where rownum<10;
SQL> select OWNER,TABLE_NAME,COLUMN_NAME,DATA_TYPE from DBA_TAB_COLUMNS where DATA_TYPE like '%LOB%' and rownum<10;
SYS VIEWCON$ CON_TEXT CLOB
SYS ECOL$ BINARYDEFVAL BLOB
SYS JIREFRESHSQL$ SQLTEXT CLOB
四:以及一些常用的資料字典小結:
DBA_TABLES:描述資料庫中所有相關的表。
DBA_ALL_TABLES:描述資料庫中所有的物件以及相關的表。
USER_TABLES:描述資料庫中當前使用者擁有的相關的表。
USER_ALL_TABLES:描述資料庫中當前使用者擁有的物件以及相關的表。
ALL_TABLES:描述資料庫中所有的使用者可以訪問的相關的表。
ALL_ALL_TABLES:描述資料庫中所有的使用者可以訪問的物件以及相關的表。
DBA_TAB_COLUMNS:描述資料庫中所有表的列屬性。
USER_TAB_COLUMNS:描述資料庫中當前使用者擁有的表的列屬性。
ALL_TAB_COLUMNS:描述資料庫中所有使用者可以訪問的表的列屬性。
DBA_CONSTRAINTS:描述資料庫中所有表的約束和屬性。
DBA_CONS_COLUMNS:包含在DBA_CONSTRAINTS約束定義中的可訪問的列的資訊。
ALL_CONSTRAINTS:描述資料庫中所有使用者可以訪問的表的約束和屬性。
ALL_CONS_COLUMNS:包含在ALL_CONSTRAINTS約束定義的可訪問的列的資訊。
USER_CONSTRAINTS:描述資料庫中所有當前使用者擁有的表的約束的屬性。
USER_CONS_COLUMNS:包含在USER_CONSTRAINTS約束定義的可訪問的列的資訊。
DBA_SEQUENCES:資料庫中所有序列的描述。
ALL_SEQUENCES:描述資料庫中所有使用者可以訪問的序列的描述。
USER_SEQUENCES:描述資料庫中所有當前使用者擁有的序列的描述。
DBA_INDEXES:描述資料庫中所有的索引的屬性。
ALL_INDEXES:描述資料庫中所有使用者可以訪問的索引的屬性。
USER_INDEXES:描述資料庫中所有當前使用者擁有的索引的屬性。
最後介紹下:
1)ALL_TABLES、user_tables和dba_tables的區別?
dba_tables : 系統裡所有的表的資訊,需要DBA許可權才能查詢的檢視(資料字典檢視)
all_tables : 當前使用者有許可權的表的資訊(只要對某個表有任何許可權,即可在此檢視中看到表的相關資訊)
user_tables: 當前使用者名稱下的表的資訊
所以以上3個檢視中,user_tables的範圍最小,all_tables看到的東西稍多一些,而dba_tables看到最多的資訊;
2)資料字典檢視(dba_)和動態效能檢視(v$)的區別?
資料字典檢視反映了資料庫的資訊,如資料庫的物理結構和邏輯結構資訊,使用者和許可權資訊以及
資料庫物件的資訊,如表、檢視、索引、儲存程式、約束等,這些資訊不會隨著資料庫的執行而改變,除非人為操作,資料字典檢視中的資訊是靜態的,來自資料字典基表,它反映的是資料庫的資訊,這些資訊不會因為資料庫伺服器的關閉而消失。
而動態效能檢視則主要反映了例項的資訊,並且動態效能檢視中的資訊則是動態變化的,它反映了例項的實際執行情況,這些資訊來自SGA或者控制檔案,隨著例項的關閉和重新啟動,這些資訊將重新產生。

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

相關文章