代码之家  ›  专栏  ›  技术社区  ›  Pravin Satav

导出用于版本控制的数据库对象

  •  1
  • Pravin Satav  · 技术社区  · 10 年前

    我们正在为我们的项目实施版本控制。作为这项工作的一部分,我们需要签入所有DB对象。我们有表、过程、函数、包、视图和物化视图。问题是有很多对象,我们需要将源代码放在文件中。e、 g.有表T1、T2、T3,我们需要文件Table_T1.text,它将为所有对象提供T1定义(列定义、表索引和授权)等。

    我知道元数据表,如 DBA_VIEWS , dba_source DBMS_METADATA.GET_DDL 在那里我可以找到所需的信息 而是如何以对象的方式获取信息。 目前,我们的工作是获取特定对象的全部信息,然后将其分离(剪切粘贴)到不同的文件中。有什么聪明的方法来解决这个问题吗?

    数据库—Oracle 10g

    2 回复  |  直到 10 年前
        1
  •  0
  •   Lalit Kumar B    9 年前

    而是如何以对象的方式获取信息。

    通过 参数 正确地那你可以 定制 您的输出。

    DBMS_METADATA.GET_DDL (object_type, object_name, object_owner)
    

    例如,要获得 元数据 对于用户中的所有表 斯科特 .

    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"
    

    所以,这给了我 DDL公司 中的所有表 斯科特 模式。

    类似地,您可以对所有其他对象(如 INDEXES , ROLES

    要获取文本文件中的DDL,只需使用 线轴,线轴 。因此,您只需要为不同的对象类型编写单独的脚本,以便在各自的文本文件中插入。

        2
  •  0
  •   Uri    10 年前

    简单的事实是,不能像对待Java、C#或其他文件那样对待数据库对象。

    原因有很多,我将列举几个:

    文件存储在开发人员的PC上,其所做的更改不会影响其他开发人员。同样,开发人员不受同事所做更改的影响。在数据库中,情况通常不是这样,开发人员共享相同的数据库环境,因此对数据库所做的任何更改都会影响其他人。

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

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

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

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

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

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

    还有很多,但我想你明白了。

    我发现有效的方法如下:

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

    使用影响分析,该分析利用基线作为比较的一部分,以确定冲突,并确定更改(当比较源代码管理存储库和数据库之间的对象结构时)是源于开发的真实更改还是源于不同路径的更改,然后应跳过该更改,例如不同分支或紧急修复。

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