共计 3925 个字符,预计需要花费 10 分钟才能阅读完成。
本篇内容主要讲解“Oracle 相关数据字典分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让丸趣 TV 小编来带大家学习“Oracle 相关数据字典分析”吧!
问题描述: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
SQL select OWNER,TABLE_NAME,COLUMN_NAME,DATA_TYPE from DBA_TAB_COLUMNS where DATA_TYPE like %LOB% and rownum
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 或者控制文件,随着实例的关闭和重新启动,这些信息将重新产生。
到此,相信大家对“Oracle 相关数据字典分析”有了更深的了解,不妨来实际操作一番吧!这里是丸趣 TV 网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!