2010-03-08 24 views
3

我使用SQL Developer的GUI进行DDL更改。问题是,我需要对测试环境应用相同的更改。我想知道别人是如何处理这个问题的。目前,我不得不手动编写ALTER语句,以使测试环境与开发环境保持一致,但这很容易出错(两次做同样的事情)。在测试环境中没有重要数据的情况下,我通常会把所有东西都丢掉,从dev中导出DDL脚本并在测试中从头开始运行它们。我应该如何将DDL更改从一个环境迁移到下一个环境?

我知道有触发器可以存储每个DDL更改,但这是一个严重共享的环境,如果可能,我希望避免这种情况。

也许我应该只是手动编写DDL的东西,而不是使用GUI?

+0

这是我们在最后一家店使用的手段 - 通过脚本。分解为组件:表,索引,约束......有时会在放置/禁用和重新创建之间进行细分。 – 2010-03-08 20:41:30

+0

@OMG Ponies您的意思是手动编写和版本化每个脚本,或者您有一个自动脚本/触发器跟踪它们并对它们进行分类? – 2010-03-08 20:43:21

+0

@RI:手册。我们的客户使用了Oracle Designer,我被告知它不可靠。 – 2010-03-08 20:54:24

回答

6

我已经看到了一种我不知道怎么处理这个问题的方法,最后我认为你只需要维护手动脚本。

现在,你不一定必须自己写。在MSSQL中,当你做出改变时,有一个生成脚本的按钮,它将为你正在做的改变吐出一个SQL脚本。我知道你在谈论甲骨文,而且我已经用了几年的GUI,但我只能想象它们具有相同的功能。

但是,您无法脱离手动处理脚本。您将在预先存在的数据中遇到很多问题,例如新列的默认值或如何处理重命名/删除/移动列的数据。这只是分析使用数据库模式进行分析的一部分,您不能远离。如果您尝试使用完全自动化的解决方案来完成此任务,那么您的数据迟早会变得混乱。

为了让您的生活更轻松一点,我建议的一件事是确保将代码更改中的架构更改分开。不同之处在于,对表和列的模式更改必须只运行一次而不再运行,因此必须将其作为单独的更改脚本进行版本控制。但是,像存储过程,函数甚至视图一样,代码更改可以(也应该)反复运行,并且可以像任何其他代码文件一样进行版本控制。我见过的最佳方法是当我们拥有VSS中的所有特效/函数/视图时,我们的构建过程将全部放弃并在每次更新期间重新创建它们。这与重建C#/ Java /任何代码的想法是一样的,因为它确保所有内容始终保持最新状态。

+0

@Mike好点...我一直在处理这个问题的方式不一致,并希望有一些明显的我错过了,这会让它更容易。 我会将您的答案标记为正确,并遵循此处的指导原则,但为了满足我的好奇心和作为备份,我将在单独的答案中发布我实施的用于跟踪DDL更改的数据库触发器。 – 2010-03-08 22:25:34

+0

如果你在11g上,有一个方便的打包函数叫做dbms_metadata_diff.compare_alter 给它两个对象,它会生成ALTER脚本以将其转换为另一个。你也可以通过数据库链接指向它。 – 2010-03-08 22:30:30

+0

@加里感谢您的提示......我们还没有在11g上,但将存储一个未来的一个。 – 2010-03-08 22:31:39

2

千万不要使用GUI来做这些事情。编写脚本并将它们放入源代码控制。

3

这里是我用来跟踪DDL变化的触发器。来源用于:

http://www.dba-oracle.com/t_ddl_triggers.htm

http://www.orafaq.com/forum/t/68667/0/

CREATE OR REPLACE TRIGGER ddl_trig 
AFTER create OR drop OR alter 
    ON scott.SCHEMA 
DECLARE 
    li ora_name_list_t; 
    ddl_text clob; 
BEGIN 
    for i in 1..ora_sql_txt(li) loop 
    ddl_text := ddl_text || li(i); 
    end loop; 

INSERT INTO my_audit_tbl VALUES 
    (SYSDATE, 
    ORA_SYSEVENT, 
    ORA_DICT_OBJ_TYPE, 
    ORA_DICT_OBJ_NAME, 
    ddl_text 
    ); 
END; 
/
+0

+1感谢您指出'ora_sql_txt'。我可能会误解,但在FOR循环中引用'ora_sql_txt'可能会导致函数被多次调用 - 如果只调用一次,它可能会稍微好一点。请参阅此处的示例:http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/triggers.htm#LNPLS2014 – 2012-02-01 04:29:29

1

数据库变更管理/数据库DIFF 有些工具是 -

1)的Oracle变更管理包

从文档 -

它允许我们在固定的时间取基线(快照),然后我们可以看到数据库模式和对象是如何改变的。CMP也可以生成DDL脚本,但我不确定我们是否想要使用它。

详细

2)PL/SQL开发比较用户对象设有

 This is available from Tools -> Compare User Objects 

3)的Oracle SQL开发人员数据库DIFF特征

  This is available from Tools -> Database diff 
      http://www.oracle.com/technology/products/database/sql_developer/files/what_is_sqldev.html#copy See “Schema Copy and Compare” 



#1看起来是最通用和最灵活的,但DBA权限可能是必要的。

#2 & 3可供任何开发人员使用。我认为Oracle SQL Developer更简单,并提供更多选项。

使用上述任何选项可以帮助 -

  1. 标识改变的对象,也可以作为提交MAC的前检查清单。
  2. 相关开发人员可以拥有特定的更改对象。
0

你可以用Toad很好地做到这一点。

您使用比较模式函数来查找所有差异(它非常灵活;您可以指定要查看哪些对象类型以及许多其他选项)。它会显示你的差异,你可以看看并确保它看起来不错,然后告诉它为你生成一个更新脚本。瞧。唯一的问题是,您需要DBA模块来生成同步脚本,这是额外的成本。但如果你经常这样做,我会说它是值得的。 (或者,如果你能够获得一个较旧的Toad版本,9.0之前的版本我认为,有一个错误可以让你在没有DBA模块的情况下提取同步脚本:))

蟾蜍并不便宜,使用它多年,我认为它是不可或缺的,并且非常值得任何Oracle开发人员或DBA的价格。

相关问题