我使用SQL Developer的GUI进行DDL更改。问题是,我需要将相同的更改应用于测试环境。我想知道其他人如何处理这个问题。目前我不得不手动编写ALTER语句以使测试环境与开发环境保持一致,但这很容易出错(两次做同样的事情)。如果测试环境中没有重要数据,我通常会把所有内容都搞砸,从dev中导出DDL脚本并在测试中从头开始运行。
我知道有些触发器可以存储每个DDL更改,但这是一个高度共享的环境,我想尽可能避免这种情况。
也许我应该手动编写DDL内容而不是使用GUI?
答案 0 :(得分:6)
我已经看到了一种我不知道的方法试图解决这个问题,最后我认为你需要维护手动脚本。
现在,你不一定要自己写。在MSSQL中,当您进行更改时,Generate Script会有一个小按钮,它会为您正在进行的更改吐出一个SQL脚本。我知道你在谈论Oracle,自从我使用他们的GUI以来已经有几年了,但我只能想象他们有相同的功能。
但是,您无法手动使用脚本。对于预先存在的数据,您将遇到很多问题,例如新列的默认值或如何处理重命名/删除/移动列的数据。这只是随着时间的推移使用数据库模式的分析的一部分,你无法摆脱它。如果您尝试使用完全自动化的解决方案,那么您的数据迟早会被搞砸。
我建议的一件事就是让您的生活更轻松,确保您将架构更改与代码更改分开。不同之处在于对表和列的模式更改必须只运行一次而不能再次运行,因此必须作为单独的更改脚本进行版本控制。但是,代码更改(如存储过程,函数甚至视图)可以(并且应该)反复运行,并且可以像任何其他代码文件一样进行版本控制。我见过的最好的方法就是当我们在VSS中拥有所有的proc / functions / views时,我们的构建过程将全部删除,并在每次更新时重新创建它们。这与重建C#/ Java /任何代码的想法相同,因为它确保所有内容始终是最新的。
答案 1 :(得分: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;
/
答案 2 :(得分:2)
永远不要使用GUI来做这些事情。编写脚本并将它们放入源代码控制中。
答案 3 :(得分:1)
数据库更改管理/数据库差异 一些工具是 -
1)Oracle变更管理包
来自文档 -
它允许我们在固定时间获取基线(快照),然后我们可以看到数据库模式和对象是如何更改的。 CMP也可以生成DDL脚本,但我不确定我们是否想要使用它。
详细
2)PL / SQL Developer比较用户对象功能
This is available from Tools -> Compare User Objects
3)Oracle SQL Developer数据库差异功能
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更容易,并提供更多选项。
使用上述任何选项都可以提供帮助 -
答案 4 :(得分:0)
您可以使用Toad很好地完成此操作。
您可以使用Compare Schemas功能查找所有差异(它非常灵活;您可以指定要查看的对象类型以及许多其他选项)。它会向您显示差异,您可以查看并确保它看起来正确,然后告诉它为您生成更新脚本。瞧。唯一的问题是,您需要DBA模块来生成同步脚本,这是一个额外的成本。但是,如果你经常这样做,我会说这是值得的。 (或者,如果您可以获得较早的Toad版本,我认为9.0之前的版本中存在一个错误,允许您在没有DBA模块的情况下提取同步脚本。:))
蟾蜍并不便宜,但多年来一直使用它我认为它是不可或缺的,并且非常值得任何Oracle开发人员或DBA付出代价。