导出数据库控件的数据库对象

时间:2015-02-04 06:26:41

标签: sql oracle oracle10g ddl database-metadata

我们正在为我们的项目实施版本控制。作为其中的一部分,我们需要检入所有数据库对象。我们有表,过程,函数,包,视图和物化视图。问题是有很多对象,我们需要明智地放置源代码文件。例如有表T1,T2,T3,我们需要文件Table_T1.txt,它们将具有T1定义(列定义,表的索引和授权)等所有对象。

我知道元数据表格,例如DBA_VIEWSdba_sourceDBMS_METADATA.GET_DDL等,我可以找到所需的信息但是如何明智地提取信息对象。目前我们正在处理特定对象的全部信息,然后将其分离(切割 - 粘贴)到不同的文件中。有没有聪明的方法来解决这个问题?

数据库 - Oracle 10g

2 个答案:

答案 0 :(得分:0)

  

但是如何明智地提取信息对象。

正确传递参数。然后,您可以自定义您的输出。

DBMS_METADATA.GET_DDL (object_type, object_name, object_owner)

例如,要为用户 SCOTT 中的所有表格获取 METADATA

SQL> conn scott/tiger@pdborcl;
Connected.
SQL> set long 200000
SQL> select dbms_metadata.get_ddl('TABLE',t.table_name, 'SCOTT') from US

DBMS_METADATA.GET_DDL('TABLE',T.TABLE_NAME,'SCOTT')
------------------------------------------------------------------------

  CREATE TABLE "SCOTT"."DEPT"
   (    "DEPTNO" NUMBER(2,0),
        "DNAME" VARCHAR2(14),
        "LOC" VARCHAR2(13),
         CONSTRAINT "PK_DEPT" PRIMARY KEY ("DEPTNO")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"  ENABLE
   ) SEGMENT CREATION IMMEDIATE
  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 FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"


  CREATE TABLE "SCOTT"."EMP"
   (    "EMPNO" NUMBER(4,0),
        "ENAME" VARCHAR2(10),
        "JOB" VARCHAR2(9),
        "MGR" NUMBER(4,0),
        "HIREDATE" DATE,
        "SAL" NUMBER(7,2),
        "COMM" NUMBER(7,2),
        "DEPTNO" NUMBER(2,0),
         CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"  ENABLE,
         CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO")
          REFERENCES "SCOTT"."DEPT" ("DEPTNO") ENABLE
   ) SEGMENT CREATION IMMEDIATE
  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 FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"


  CREATE TABLE "SCOTT"."BONUS"
   (    "ENAME" VARCHAR2(10),
        "JOB" VARCHAR2(9),
        "SAL" NUMBER,
        "COMM" NUMBER
   ) SEGMENT CREATION DEFERRED
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS LOGGING
  TABLESPACE "USERS"


  CREATE TABLE "SCOTT"."SALGRADE"
   (    "GRADE" NUMBER,
        "LOSAL" NUMBER,
        "HISAL" NUMBER
   ) SEGMENT CREATION IMMEDIATE
  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 FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"

因此,这为 SCOTT 架构中的所有表提供了 DDL

同样,您可以对所有其他对象执行相同的操作,例如INDEXESROLES等。

要在文本文件中获取DDL,只需使用 SPOOL 。因此,您只需要针对不同对象类型的单个脚本在相应的文本文件中进行假脱机。

答案 1 :(得分:0)

简单的事实是,在处理Java,C#或其他文件时,您无法处理数据库对象。

原因很多,我只列举一些:

文件存储在开发人员的PC本地,而他/她所做的更改不会影响其他开发人员。同样,开发人员不会受到她的同事所做的更改的影响。在数据库中,这通常不是这种情况,开发人员共享相同的数据库环境,因此提交给数据库的任何更改都会影响其他人。

使用签入/提交更改等来完成发布代码更改(取决于您使用的源控制工具)。此时,开发人员本地目录中的代码将插入源代码控制库中。想要获取最新代码的开发人员需要从源代码管理工具请求它。在数据库中,更改已经存在并影响其他数据,即使它没有签入存储库。

在文件签入期间,源代码管理工具会执行冲突检查,以查看在您修改本地副本期间是否修改了同一文件并由其他开发人员签入。同样,在数据库中没有检查这一点。如果您从本地PC更改过程,同时我使用本地PC的代码修改相同的过程,那么我们会覆盖彼此的更改。

代码的构建过程是通过将标签/最新版本的代码获取到空目录然后执行构建 - 编译来完成的。输出是二进制文件,我们在其中复制&替换现有的。我们不关心以前的事情。在数据库中,我们无法重新创建数据库,因为我们需要维护数据!此外,部署还会执行在构建过程中生成的SQL脚本。

执行SQL脚本(使用DDL,DCL,DML(用于静态内容)命令)时,假设在创建脚本时环境的当前结构与结构匹配。如果没有,那么当您尝试添加已存在的新列时,您的脚本可能会失败。

将SQL脚本作为代码处理并手动生成它们将导致语法错误,数据库依赖性错误,不可重用的脚本会使开发,维护和测试这些脚本的任务变得复杂。此外,这些脚本可能运行在与您运行的环境不同的环境中。

有时,版本控制存储库中的脚本与测试对象的结构不匹配,然后生产中会出现错误!

还有更多,但我认为你得到了照片。

我发现作品如下:

使用强制版本控制系统对数据库对象强制执行签出/签入操作。这将确保版本控制存储库匹配签入的代码,因为它在签入操作中读取对象的元数据,而不是手动完成的分离步骤

使用影响分析,利用基线作为比较的一部分来识别冲突并确定变更(在比较源控制存储库和数据库之间的对象结构时)是否是源于开发的真正变化或者来自不同路径的更改然后应该跳过,例如不同的分支或紧急修复。

我写的一篇文章发表于here,欢迎您阅读。