我需要从我的所有函数、过程、包、视图和表中提取代码(脚本),这样当我转移到生产环境时,我可以运行脚本来创建所有对象。
在开发过程中,我没有对所有数据库对象进行脚本备份。
提取代码或脚本的最佳方法是什么?任何建议或帮助都是非常值得赞赏的。
谢谢
我需要从我的所有函数、过程、包、视图和表中提取代码(脚本),这样当我转移到生产环境时,我可以运行脚本来创建所有对象。
在开发过程中,我没有对所有数据库对象进行脚本备份。
提取代码或脚本的最佳方法是什么?任何建议或帮助都是非常值得赞赏的。
谢谢
你确实使用版本控制系统,不是吗?请做。
如果您无法使用系统函数dbms_metadata.get_ddl
,它将返回用于创建对象的 DDL 的 clob。这将需要为每个单独的对象完成,因此可能值得循环遍历user_objects
。
或者,您可以通过右键单击对象并使用view
选项在 PL/SQL Developer 中浏览定义,然后在右下角您可以查看用于创建对象的 SQL。
还有一个导出“工具”,它对如何使用它的解释不如 SQL Developer 变体。
当然,正确的答案是获得一个版本控制系统并使用它。
我不知道数据库本身,但SQL Developer会这样做。我很确定 TOAD 和其他此类工具也会如此。
就我而言,所有自定义对象都以“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;
问候
抱歉,您有一个非最佳开发实践,无法扩展到一个开发人员之外。
永远不要使用 SQL GUI 客户端的能力直接在数据库中编辑数据库对象。(除非你故意想制造人为的问题。)
相反,所有 SQL 和 PL/SQL DDL 和 DML 都应该位于保存到版本控制系统(VCS) 中的文本文件中(例如subversion、git、mercurial)。使用您喜欢的编辑器来编辑文件。
通过使用命令行工具(在 Oracle 中)执行保存在 VCS 中的文本文件来修改数据库sqlplus
。这适用于所有数据库实例:开发、QA、生产。
对于大型开发项目,请考虑使用模式迁移工具(例如Flyway、Roundhouse)。
多年来,我已经能够通过执行一个简单的规则来消除大量的开发和生产问题:
如果代码不在 VCS 中,则它不存在。
(令人惊讶的是,在 2015 年仍有许多开发团队不使用 VCS。)