我很想知道其他人正在使用什么方法来跟踪对数据库所做的更改,包括表定义更改,新对象,程序包更改等。您是否将平面文件与外部版本控制系统一起使用?触发器?其他软件?

评论

这确实类似于dba.stackexchange.com/questions/2/…-您可能会从那里得到一些非Oracle特定的想法!

@Gaurav我看到了,但是我想要一些针对Oracle的答案。

与您的要求无关,但与您相关:基于版本的重新定义

#1 楼

在我工作过的站点上,必须对生产实例进行的任何更改都必须编写为将在SQL * Plus中运行的更改脚本。此外,必须从头重新创建所有架构对象所需的脚本是最新的。所有这些脚本都被检入变更控制,然后从那里迁移。

您可以审核DDL变更或使用DDL触发器来选取变更,甚至可以使用diff软件比较两个实例,但是这些方法不加选择通常,开发人员会在确定确切需要更改的内容之前对模式进行许多更改和撤消操作(例如,小的测试更改,创建虚拟表以测试概念等)。

评论


我的工作场所与此处提到的工作流程相似

– Sathyajith Bhat
2011年1月5日17:25

#2 楼

我已经思考并阅读了很多有关此主题的内容。这是配置控制和变更管理策略的广泛主题。 CMMI在此主题中具有一个域。即使在获得CMMI 3-5认证的公司中,他们有时也不会对数据库进行版本控制。

在牢记以下约束的同时应回答此问题。


您有一个管理者,每个DDL都由该管理者执行。
其他人有能力执行DDL语句。
您只需记录发生的更改已经完成,但是您不需要比较巨大的差异。
您的数据库设计是通过外部工具完成的,然后发布到数据库中。该外部工具甚至可以是源代码控制中的DDL脚本。但是关键是您要对此进行源代码控制,然后将其发布到数据库。
您不需要了解瞬时更改,而可以不时地:即每小时,每天。
您具有定义的服务器结构:开发,测试, 生产。以及良好的测试策略。

答案1


如果1,4,6是正确的,则可以使用外部源代码控制。例如,

Embercadero有一个数据库更改管理工具(http://www.embarcadero.com/products/db-change-manager-xe)。它具有对数据库(Oracle)进行反向工程并将其置于源代码管理中的能力。这样,任何数量的开发人员dba都可以访问此架构并对其进行更改。
Oracle SQL Designer与该方法类似。
创建表脚本以进行源代码控制(svn,mercurial等)并进行维护它们也是相同的东西。

http://www.liquibase.org是上面的自动化方法。
我写了代码生成器,生成了DAL(数据访问层),DDL(创建表)陈述。我们将它们放在源代码管理中,并在那里进行维护。我认为像liquibase这样的专用解决方案可能会更好。



如果有6,则此方法效果很好。您将DDL语句(也是代码)放入源代码管理并进行维护。没有人会在没有适当考虑的情况下更改测试服务器和生产服务器。

缺点是如果您出于任何原因对生产或测试服务器进行任何更改,快速的错误修复,主键更改等,则需要滚动该程序。更改开发服务器。因为实际上开发服务器是您的真实理由。没有其他办法。

这是一种面向开发人员的方法。但是,当您第一次开发新模块时,它的效果很好。

答案2
-如果1和6为真:

回答1的类似方法是保持开发服务器。每个人使用它都会改变它。比时间来更新。您使用数据库比较工具。将它们作为脚本获取,置于源代码控制之下。

- Red Gate Schema Compare supports Oracle
- Embercadero has similar tool
- https://github.com/carbonfive/db-migration
- http://www.sumsoftsolutions.com/svco/ (I have not used this product but I believe it belongs to this category.)
- Rails Active Migration (http://www.oracle.com/technetwork/articles/kern-rails-migrations-100756.html)


答案1和答案2之间的区别是,在答案1中,您收集了整个数据库的DDL语句并将其存储。在答案2中,您需要存储更改的每个版本。


开始
V1
V2
V3
...

如果将列放在表,然后决定将其删除。您的脚本将在答案2中显示此内容,而在答案1中,您只会看到最新版本。并且您需要比较V2和V1以查看差异。我个人更喜欢答案1,因为我可以轻松比较Start和V3,V1和V3。在答案2中,我需要查找所有更改。
在回答中,源代码管理中的2个脚本也往往是一个爆炸式的复杂脚本。很难找到信息。

答案3
如果3为真。请注意,在这种情况下,您没有约束6,即:您没有开发,测试,产品服务器。仅生产服务器。您可以使用DDL触发器记录所做的更改。这主要是用来劝阻人们滥用其DDL赠款。如果发生任何问题,您可以找到负责任的人。为此,每个人都应使用其用户帐户进行连接,并且应用程序帐户不应具有任何DDL授予。因为每个开发人员都知道应用程序帐户并可以使用它。

回答4
如果您有3和5。请注意,在这种情况下,您没有约束6,即:您没有有开发,测试,产品服务器。仅生产服务器。
而不是触发器来存储更改。
您可以使用外部工具查找更改并将DDL脚本存储在源代码管理中。

如果这些工具能够记录谁进行了更改,那么它将很有用。请注意,在此解决方案中,您会松散间隔执行的额外DDL。

#3 楼

刚刚找到了有关使用Liquibase来版本Oracle的有趣教程。

#4 楼

在某些数据库上,我们使用DDL触发器来捕获更改并将其保存到表中。然后,我们有一个Web界面来提取这些以前的版本。它有严重的缺点,这就是为什么我要寻找替代品,但是它很容易并且比没有版本控制要好。

#5 楼

我们已经为11g数据库使用了Schema Version Control,但是11.2上的软件存在一些问题。如果不是那些我们仍在解决的问题,那将是一个很棒的产品。

#6 楼

我们曾经使用过Oracle SQL Designer,现在我已经将其替换为SQL Developer Data Modeler。 http://www.oracle.com/technetwork/developer-tools/datamodeler/overview/index.html

很好,尤其是。能够为列设置DOMAIN并节省创建常见列(mtime,ctime等)的大量时间。

#7 楼

我们使用oracle-ddl2svn工具集(我是作者)在SVN中自动存储oracle DDL模式。

#8 楼

看看DBmaestro TeamWork,它的数据库实施了变更管理方法。


披露:我为dbMaestro工作

#9 楼

我从未使用过它,但是http://blog.gitora.com/是另一种选择。