我经常遇到以下问题。
我正在对项目进行一些更改,这些更改需要数据库中的新表或新列。我进行数据库修改并继续我的工作。通常,我记得记下更改,以便可以在实时系统上复制它们。但是,我并不总是记得自己所做的更改,也并非总是记得写下来。
因此,我推动了实时系统,并收到了一个很大的明显错误,那就是没有NewColumnX
,呃。
无论这可能不是这种情况的最佳实践,是否都存在数据库的版本控制系统?我不在乎特定的数据库技术。我只想知道是否存在。如果碰巧可以与MS SQL Server配合使用,那就太好了。
我经常遇到以下问题。
我正在对项目进行一些更改,这些更改需要数据库中的新表或新列。我进行数据库修改并继续我的工作。通常,我记得记下更改,以便可以在实时系统上复制它们。但是,我并不总是记得自己所做的更改,也并非总是记得写下来。
因此,我推动了实时系统,并收到了一个很大的明显错误,那就是没有NewColumnX
,呃。
无论这可能不是这种情况的最佳实践,是否都存在数据库的版本控制系统?我不在乎特定的数据库技术。我只想知道是否存在。如果碰巧可以与MS SQL Server配合使用,那就太好了。
Answers:
在Ruby on Rails中,有一个迁移的概念-一种用于更改数据库的快速脚本。
您生成一个迁移文件,该文件具有增加数据库版本的规则(例如,添加列)和具有降级版本的规则(例如,删除列)。每个迁移都有编号,并且有一个表跟踪您当前的数据库版本。
要向上迁移,请运行一个名为“ db:migrate”的命令,该命令将查看您的版本并应用所需的脚本。您可以通过类似的方式向下迁移。
迁移脚本本身保存在版本控制系统中-每当您更改数据库时,都需要签入新脚本,任何开发人员都可以应用该脚本将其本地db更新到最新版本。
我有点老套,因为我使用源文件来创建数据库。实际上有2个文件-project-database.sql和project-updates.sql-第一个用于架构和持久性数据,第二个用于修改。当然,两者都在源代码控制之下。
当数据库更改时,我首先在project-database.sql中更新主模式,然后将相关信息复制到project-updates.sql中,例如ALTER TABLE语句。然后,我可以将更新应用到开发数据库,进行测试,然后进行迭代,直到完成为止。然后,检入文件,再次进行测试,然后应用于生产。
另外,我通常在db中有一个表-Config-如:
的SQL
CREATE TABLE Config
(
cfg_tag VARCHAR(50),
cfg_value VARCHAR(100)
);
INSERT INTO Config(cfg_tag, cfg_value) VALUES
( 'db_version', '$Revision: $'),
( 'db_revision', '$Revision: $');
然后,将以下内容添加到更新部分:
UPDATE Config SET cfg_value='$Revision: $' WHERE cfg_tag='db_revision';
在db_version
当数据库被重新创建仅得到改变,而db_revision
给我的指示DB多远是关闭的基线。
我可以将更新保存在它们自己的单独文件中,但是我选择将它们全部融合在一起,并使用剪切和粘贴来提取相关部分。还需要进行更多的内务处理,即从$ Revision 1.1 $中删除“:”以冻结它们。
Redgate有一个称为SQL Source Control的产品。它与TFS,SVN,SourceGear Vault,Vault Pro,Mercurial,Perforce和Git集成。
我想知道没有人提到基于Java 的开放源代码工具liquibase,它几乎适用于所有支持jdbc的数据库。与rails相比,它使用xml代替ruby来执行模式更改。尽管我不喜欢将XML用于特定领域的语言,但是xml的非常酷的优点是liquibase知道如何回滚某些操作,例如
<createTable tableName="USER">
<column name="firstname" type="varchar(255)"/>
</createTable>
所以您不需要自己处理
还支持纯sql语句或数据导入。
大多数数据库引擎应支持将数据库转储到文件中。无论如何,我知道MySQL确实如此。这只是一个文本文件,因此您可以将其提交给Subversion或任何使用的文件。对文件运行diff也很容易。
我已经断断续续地做到了这一点-管理(或尝试管理)模式版本。最佳方法取决于您拥有的工具。如果您可以获得Quest Software工具“ Schema Manager”,那么您的状况将会很好。Oracle有自己的劣质工具,我也不推荐使用这种工具,也称为“ Schema Manager”(令人困惑吗?)。
如果没有自动化工具(请参阅此处有关Data Dude的其他评论),那么您将直接使用脚本和DDL文件。选择一种方法,记录下来,然后严格执行。我喜欢能够在任何给定时刻重新创建数据库的功能,因此我更喜欢对整个数据库(如果我是DBA)或开发人员模式(如果我在产品中)进行完整的DDL导出。 -开发模式)。
PLSQL Developer是All Arround Automations的工具,它具有一个用于存储库的插件,该插件可以在Visual Source Safe中正常运行(但效果不佳)。
通过网络:
版本控制插件在PL / SQL Developer IDE >>和任何支持Microsoft SCC接口规范的版本控制系统之间提供了紧密的集成。>>这包括最受欢迎的版本控制系统,例如Microsoft Visual SourceSafe,>> Merant PVCS和MKS Source Integrity。
您可以在Visual Studio中使用Microsoft SQL Server数据工具来生成数据库对象的脚本,作为SQL Server项目的一部分。然后,您可以使用Visual Studio中内置的源代码管理集成将脚本添加到源代码管理中。此外,SQL Server项目允许您使用编译器验证数据库对象,并生成部署脚本以更新现有数据库或创建新数据库。
我们已经使用了MS Team System数据库版取得了很好的成功。它或多或少无缝地与TFS版本控制和Visual Studio集成在一起,使我们能够轻松管理存储的proc,视图等。解决冲突可能会很痛苦,但是一旦完成,版本历史便会完整。此后,向质量保证和生产的迁移非常简单。
可以公平地说,它是1.0版产品,而且存在不少问题。
Schema Compare for Oracle是专门用于将更改从我们的Oracle数据库迁移到另一个数据库的工具。请访问下面的URL,以获取下载链接,在这里您可以使用该软件进行功能全面的试用。
http://www.red-gate.com/Products/schema_compare_for_oracle/index.htm
我建议两种方法之一。首先,从Sybase 投资PowerDesigner。企业版。它允许您设计物理数据模型,以及更多其他内容。但是它带有一个存储库,可让您签入模型。每个新签入都可以是新版本,它可以将任何版本与任何其他版本进行比较,甚至可以与当时数据库中的内容进行比较。然后,它将显示每个差异的列表,并询问应迁移的内容……然后构建脚本来执行此操作。它并不便宜,但价格却便宜两倍,投资回报率约为6个月。
另一个想法是打开DDL审核(在Oracle中有效)。这将创建一个表格,其中包含您所做的所有更改。如果您从上次将数据库更改更改为prod到现在的时间戳查询更改,则将按顺序列出已完成的所有操作。一些where子句可以消除零和更改,例如create table foo;。随后是drop table foo; 您可以轻松地构建一个mod脚本。为什么要将更改保留在Wiki中,这是工作的两倍。让数据库为您跟踪它们。
有两本书的建议:Ambler和Sadalage的“重构数据库”和Ambler的“敏捷数据库技术”。
有人提到了Rails迁移。我认为即使在Rails应用程序之外,它们也能很好地工作。我在SQL Server的ASP应用程序中使用了它们,而我们正在向Rails迁移。您可以将迁移脚本本身检入VCS。这是Pragmatic Dave Thomas关于这个主题的帖子。