您如何版本化Oracle数据库更改?


32

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


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

@Gaurav我看到了,但是我想要一些特定于Oracle的答案。
Leigh Riffel

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

Answers:


22

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

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


1
我的工作场所的工作流程与此处提到的工作流程类似
Sathyajith Bhat 2011年

10

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

在牢记以下限制条件时,应回答此问题。

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

答案1

  • 如果1,4,6为true,则可以使用外部源控件。例如
    • 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中,您需要存储更改的每个版本。

  1. 开始
  2. V1
  3. V2
  4. V3
  5. ...

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

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

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

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



4

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






By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.