【问题标题】:Extract code or script of database objects提取数据库对象的代码或脚本
【发布时间】:2012-06-08 09:55:14
【问题描述】:

我需要从我的所有函数、过程、包、视图和表中提取代码(脚本),以便在我投入生产时可以运行脚本来创建所有对象。

在开发过程中,我没有对所有数据库对象进行脚本备份。

提取代码或脚本的最佳方法是什么?任何建议或帮助都非常值得赞赏。

谢谢

【问题讨论】:

    标签: database plsql oracle10g toad plsqldeveloper


    【解决方案1】:

    您确实使用版本控制系统,不是吗?请做。

    如果您无法使用系统函数dbms_metadata.get_ddl,它将返回用于创建对象的 DDL 的 clob。这需要为每个单独的对象完成,因此可能值得循环通过user_objects

    或者,您可以通过右键单击对象并使用view 选项来浏览 PL/SQL Developer 中的定义,然后在右下角您可以查看用于创建对象的 SQL。

    还有一个export "tool",它对如何使用它的解释不如 SQL Developer 变体那么好。

    当然,正确的答案是获取版本控制系统并使用它。

    【讨论】:

    • 是否可以将版本控制与数据库集成?
    • 我不知道。您可以通过将所有对象 DDL 存储在表中来创建自己的 DDL,但是,它仍然不是那么安全,因为您可能会丢失所有内容。我们只有一个单行脚本,它遍历 VCS 中的所有文件夹并执行其中的脚本。
    • 在数据库中启用 VCS 需要做什么?必须执行任何设置或脚本才能启用此功能?谢谢
    • @user75ponic 您没有在数据库中启用 VCS。相反,您可以在自己的计算机上使用您最喜欢的编辑器将所有 SQL 和 PL/SQL DDL/DML 编写为文本文件。将文件保存到 VCS(SVN、git、hg 等)并使用命令行工具(Oracle 中的sqlplus)将文件“执行”到数据库。
    【解决方案2】:

    我不知道数据库本身,但SQL Developer 会做。我很确定 TOAD 和其他此类工具也会如此。

    【讨论】:

      【解决方案3】:

      在我的例子中,所有自定义对象都以“XX”开头。您可以使用或修改我的脚本:

      DECLARE
         CURSOR c_tables IS
           SELECT replace(object_type, ' ', '_') type,
                  object_name name,
                  owner schema,
                  object_type||'#'||object_name||'.sql' files
             FROM all_objects
            WHERE UPPER(object_name) LIKE 'XX%'
              AND object_type NOT IN ('DIRECTORY');
      
         ddl_text CLOB;
      
       BEGIN
         FOR rec_tables IN c_tables LOOP
           dbms_output.put_line('OBJECT_TYPE: '||rec_tables.type||', OBJECT_NAME: '||rec_tables.name||', SCHEMA: '||rec_tables.schema||' ->'||rec_tables.files);
      
           SELECT dbms_metadata.get_ddl(rec_tables.type, rec_tables.name, rec_tables.schema)
             INTO ddl_text
             FROM DUAL;
      
           dbms_xslprocessor.clob2file(ddl_text, 'UTL_CUSTOM_DDL', rec_tables.files, nls_charset_id('WE8MSWIN1252'));
         END LOOP;
       END;
      

      问候

      【讨论】:

        【解决方案4】:

        很抱歉,您有一种非最佳的开发实践,无法扩展到一个开发人员之外。

        永远不要使用 SQL GUI 客户端的能力直接在数据库中编辑数据库对象。 (除非你故意想制造人为的问题。)

        相反,所有 SQL 和 PL/SQL DDL 和 DML 都应位于保存在 version control system (VCS) 中的文本文件中(例如 subversiongitmercurial)。使用您的favorite editor 编辑文件。

        通过使用命令行工具(在 Oracle 中为 sqlplus)执行保存在 VCS 中的文本文件来修改数据库。这适用于所有数据库实例:开发、QA、生产。

        对于大型开发项目,请考虑使用schema migration 工具(例如FlywayRoundhouse)。

        多年来,通过执行一个简单的规则,我已经能够消除大量的开发和生产问题:

        如果代码不在 VCS 中,则它不存在。

        (令人惊讶的是,在 2015 年仍有许多开发团队不使用 VCS。)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多