您如何对 Oracle 数据库更改进行版本控制?

Lei*_*fel 32 oracle oracle-11g-r2 version-control

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

小智 22

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

您可以审计 DDL 更改或使用 DDL 触发器来获取更改,甚至可以使用 diff 软件来比较两个实例,但这些方法是不加区分的;通常,在确定需要更改的内容之前,开发人员会对模式进行一些更改(例如,很少的测试更改、创建虚拟表来测试概念等)。


Ati*_*gur 10

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

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

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

答案 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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

答案 3 如果 3 为真。请注意,在这种情况下,您没有约束 6 ,即:您没有开发、测试、产品服务器。只有生产服务器。您可以使用 DDL 触发器来记录已完成的更改。这主要用于阻止人们滥用他们的 DDL 授权。如果出现任何问题,您可以找负责人。为此,每个人都应该连接到他们的用户帐户,并且应用程序帐户不应有任何 DDL 授权。由于每个开发人员都知道应用程序帐户并且可以使用它。

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

如果这些工具能够记录谁进行了更改,那将会很有用。请注意,在此解决方案中,您会丢失按时间间隔完成的额外 DDL。


Lei*_*fel 6

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