ORACLE 自带的元数据管理

from http://blog.csdn.net/housheng33/article/details/38468491

ORACLE里有个包,dbms_metadata,可以取出对象的METADATA

ORACLE本身算是提供了元数据管理,只是感觉还不大适合我国使用习惯的感觉。

 

 

http://www.itpub.net/thread-1693460-1-1.html

02年研究dw相关的产品和业务时第一次听说了元数据的概念,很多资料上是这样描述元数据的概念的:元数据是定义或者描述数据的数据。言外之意是先有元数据再有数据。在构建数据仓库前期建模的过程其实就是定义元数据的过程。如果说oltp的产生是源于业务驱动的,那么olap的产生完全是由数据驱动最终为业务服务的,他们其实最后是一个圆周,根本就没有终点,所以搞信息化,db和dw是没有尽头的,我觉得是一个闭环,闲言少叙,下面看看oracle中数据和元数据的概念,oracle中其实把数据和元数据分的非常清楚,只是没有明确的用这2个概念界定出来,在11.2版本中参数deferred_segment_creation的出现更是把元数据和数据分的非常清楚了。
--===============================
C:\>sqlplus test/test
SQL*Plus: Release 11.2.0.1.0 Production on 星期日 7月 29 19:08:15 2012
Copyright (c) 1982, 2010, Oracle.  All rights reserved.


连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning option
SQL> show parameter def
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation            boolean     TRUE
SQL> create table t(id int ,name varchar2(10)) tablespace users;
表已创建。
SQL> select object_id,data_object_id from dba_objects where owner='TEST' and object_name='T';
OBJECT_ID DATA_OBJECT_ID
---------- --------------
     21030          21030
SQL> select count(*) from dba_segments where owner='TEST' and segment_name='T';
  COUNT(*)
----------
         0
--create table之后发现数据段并不存在,这就是deferred_segment_creation的作用,段被延迟创建了,正常都是在插入数据时创建的,这里发现move之后段也随即被创建了,其实表里这时候还是没有数据的,之所以move一下,主要是我观查到dba_objects中段的id在创建表的时侯已经分配好了,而并没有在创建段的时侯再分配,所以在段不存在的时侯move一下我是想验证move之后data_object_id是否会发生变化,结果是move之后data_object_id确实和段存在的情况下move的结果一样,发生了变化。
SQL> alter table t move;
表已更改。
SQL> select object_id,data_object_id from dba_objects where owner='TEST' and object_name='T';
OBJECT_ID DATA_OBJECT_ID
---------- --------------
     21030          21031
SQL> select count(*) from dba_segments where owner='TEST' and segment_name='T';
  COUNT(*)
----------
         1
SQL>
--=================================
这里大家注意create table...定义的就是元数据,元数据是存放着system表空间里的,数据是保存在我们create table时指定的表空间users里,下面简单举个例子来帮助我们理解数据和元数据:
--=================================
SQL> insert into t values(1,'a');
已创建 1 行。
SQL> insert into t values(2,'b');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from t;
        ID NAME
---------- ----------
         1 a
         2 b
SQL> alter tablespace users offline;
表空间已更改。
SQL> select * from t;
select * from t
              *
第 1 行出现错误:
ORA-00376: 此时无法读取文件 4
ORA-01110: 数据文件 4: 'E:\ORACLE\ORADATA\TEST\USERS01.DBF'

SQL> drop table t;
表已删除。
SQL>
--================================
这里清楚的看到tablespace users被offline之后,不能查询t表里面的数据,但是缺可以drop table t,原因就是drop table的时侯oracle只是删除了t的元数据,而并不会去修改表里的数据。
--================================
有关锁的情况也是一样的,用户在修改一条数据的时侯会在表上同时加上tx和tm锁,其中tm锁锁定的就是元数据,tx锁定的是数据,要想锁定数据首先要锁定元数据。防止在修改数据的时侯其它session把元数据修改了。可见在oracle里把数据和元数据的概念也是体现的淋漓尽致。E.F.CODE在提出RDBMS理论的时侯不知道是否已对这2个概念了然于胸,在他提出olap概念的时侯不知道他老人家是否对oracle熟悉,但是我们真的很敬佩这位2次获得图灵奖的关系型数据库的鼻祖是根据什么理论能够提出这么精髓的概念。我们也不知道oracle的设计者又是参照什么理论能在olap概念之前就把元数据和数据运用的如此之精妙。
真是让人震撼。
--=================================
set unused column其实也是这个道理,首先把元数据删除了(其实是重名),然后空闲的时侯再删除数据。
--=================================
external table的话更是做到了极致,把metadata放在db里,data直接在os上,有关external table doc上有清晰的描述:
An external table is a read-only table that is defined within the database but exists
outside of the database. In more technical terms, the external table’s metadata is
stored inside the database, and the data it contains is outside of the database.

 

http://blog.csdn.net/liujien/article/details/4397357

==========================元数据简介==============================

元数据简介

  元数据 (metadata) 最常见的定义为"有关数据的结构数据",或者再简单一点就是"关于数据的信息",日常生活中的图例、图书馆目录卡和名片等都可以看作是元数据。在关系型数据库管理系统 (DBMS) 中,元数据描述了数据的结构和意义。比如在管理、维护 SQL Server 或者是开发数据库应用程序的时候,我们经常要获取一些涉及到数据库架构的信息:

  某个数据库中的表和视图的个数以及名称 ;

  某个表或者视图中列的个数以及每一列的名称、数据类型、长度、精度、描述等;

  某个表上定义的约束;

  某个表上定义的索引以及主键/外键的信息。

  下面我们将介绍几种获取元数据的方法。

 

 

 

=============================获得元数据==================================

  • 创建表,并给表和字段加上描述 
    CREATE TABLE MANTIS_CODE(
        ID      VARCHAR2(32)     NOT NULL,
        NAME    VARCHAR2(255)    NOT NULL
    );

CREATE TABLE MANTIS_CODE_ITEM(
    CODE_ID    VARCHAR2(32)     NOT NULL,
    VALUE      VARCHAR2(32)     NOT NULL,
    NAME       VARCHAR2(255)
)
;

  • .创建主键 
     alter TABLE MANTIS_CODE add constraint  PK_MANTIS_CODE primary key (ID)
  • 联合主键 
     alter TABLE MANTIS_CODE add constraint  PK_MANTIS_CODE primary key (ID,NAME)
  • 创建表描述 
    COMMENT ON TABLE mantis_code is '代码表'
  • 创建字段描述 
    COMMENT ON COLUMN mantis_code.ID is '代码标识'
  •  创建外键 
    alter table MANTIS_CODE_ITEM  add constraint   FK_MANTIS_CODE_ITEM foreign key(CODE_ID) references  MANTIS_CODE(ID)
  • 取得表的描述 
    select * from user_tab_comments where  comments  is  not  null
  • 取得字段 
    select   t.TABLE_NAME,t.COLUMN_NAME,t.DATA_TYPE,t.DATA_LENGTH,t.DATA_PRECISION,t.DATA_SCALE,

t.NULLABLE,t.DATA_DEFAULT  from   user_tab_columns t where t.TABLE_NAME='USER_INFO'

  • 取得字段的描述 
    select   *   from   user_col_comments   where   comments   is   not   null;
  •  取得表的主键 
    select *  from user_cons_columns cc,user_constraints c
     where c.constraint_name = cc.constraint_name
       and c.constraint_type = 'P'
       and cc.table_name = 'USER_INFO'
  • 取得外键 
    select r.CONSTRAINT_NAME,
           r.TABLE_NAME,
           r.R_CONSTRAINT_NAME,
           rc.COLUMN_NAME,
           pc.COLUMN_NAME as PK_COLUMN_NAME,
           pc.TABLE_NAME as PK_TABLE_NAME
      from USER_CONSTRAINTS r,
           USER_CONS_COLUMNS rc,
           USER_CONSTRAINTS p,
           USER_CONS_COLUMNS pc
     where r.CONSTRAINT_TYPE = 'R'
       and r.CONSTRAINT_NAME = rc.CONSTRAINT_NAME
       and pc.CONSTRAINT_NAME = p.CONSTRAINT_NAME
       and p.CONSTRAINT_TYPE = 'P'
       and r.R_CONSTRAINT_NAME = p.CONSTRAINT_NAME
       and r.TABLE_NAME = 'USER_ROLE_MAP'

如果取得数据库表则从ALL_CONSTRAINTS  ALL_CONS_COLUMNS中取得


 ==================另外一种组织方式来获得元数据==============================

 

--表信息

select * from all_tab_comments t
where owner='DBO'

--列信息

select * from all_col_comments t
where owner='DBO'

--主键、外键对照

select OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME, R_OWNER, R_CONSTRAINT_NAME
from all_constraints
where owner='DBO' and (Constraint_Type='P' or Constraint_Type='R')


--主键、外键信息

select * 
from all_cons_columns 
where owner='DBO'
order by Constraint_Name, Position

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值