版本控制SQL Server数据库

我想让我的数据库受版本控制。有没有人有任何建议或推荐的文章,让我开始?

我总是希望在那里至少有一些数据(如 alumb 所提及的:用户类型和管理员)。我还经常需要大量的生成测试数据来进行性能测量。

0
额外 编辑
意见: 9
K. Scott Allen的这个系列也可以给你一些建议:数据库工作的三条规则 版本控制数据库?基准 版本控制数据库?更改脚本 版本控制数据库?视图,存储过程等 [版本控制数据库?分支和合并](
额外 作者 Marek Grzenkowicz,
额外 作者 stukelly,
@ ashy_32bit典型的stackoverflow / stackexchange逻辑。这是我不喜欢这个网站的;很多好东西因为愚蠢的原因而关闭。因为这个,我几乎没有发布任何问题。我对安全堆栈交换拥有近主持人权限,并投票保留 - 打开/重新打开获得密切投票的线程的一半。
额外 作者 Luc,
154 upvotes和146 fav并关闭?这可能吗?
额外 作者 ashy_32bit,
[版本控制数据库 - 分支和合并]新链接: odetocode.com/blogs/scott/archive/2008/02/03/…
额外 作者 Fil,
也看看这个白皮书;数据库版本控制的权威指南 www3.dbmaestro.com/&hellip ;
额外 作者 DBAstep,

28 答案

我们使用 DBGhost 来管理我们的SQL数据库。然后,您将脚本在您的版本控制中构建一个新的数据库,并且它将构建新的数据库,或者将任何现有的数据库升级到版本控制中的模式。这样,您不必担心创建更改脚本(尽管您仍然可以这样做,例如,如果您想更改列的数据类型并需要转换数据)。

0
额外
我已经使用DbGhost 10年了,它永远不会让我失望。他们提供的支持是首屈一指的
额外 作者 penderi,

我们不存储数据库模式,我们将更改存储到数据库。我们所做的是存储模式更改,以便为任何版本的数据库构建更改脚本并将其应用到我们客户的数据库。我编写了一个数据库实用程序应用程序,它可以与我们的主应用程序一起分发,它可以读取该脚本并知道需要应用哪些更新它也有足够的智能来根据需要刷新视图和存储过程。

0
额外

你也可以看看迁移解决方案。这些允许您使用C#代码指定数据库模式,并使用MSBuild上下滚动数据库版本。

我目前正在使用 DbUp ,并且运行良好。

0
额外

如果你有一个小的数据库,并且你想要对整个事物进行版本化,那么这个批处理脚本可能会有所帮助。它将Subversion中的MSSQL数据库MDF文件分离,压缩和检查。

如果您主要想要对模式进行版本控制并只有少量参考数据,则可以使用 SubSonic Migrations 来处理这个问题。这样做的好处是,您可以轻松地上移或下移到任何特定的版本。

0
额外
0
额外
真正令人沮丧的是,VS数据库项目可以生成这些模式更新所需的脚本,但它会直接应用它们。它不会处理版本历史的东西。您必须手动执行此操作,并且如果您甚至忘记手动添加更新脚本,那么您的数据库已更新,并且数据库项目不会再次生成相同的更新脚本。我希望有一个处理版本化数据库管理的项目类型。
额外 作者 Jez,
@ nikc.org的答案,加上自动化后的提交钩子。
额外 作者 Silviu-Marian,
我有一个习惯,即维护完整的创建和删除脚本,以及用于更新现有数据库实例的增量脚本。两者都进入版本控制。增量脚本根据版本号命名。这样一来,使用更新脚本就可以轻松实现数据库修补的自动化。
额外 作者 nikc.org,
是说你把升级脚本放在源代码控制中,坚果不放在那里?
额外 作者 A-K,
控制完整模式脚本的版本对于参考目的非常有用。例如,通过查看ALTER PROCEDURE语句,无法查看存储过程中发生了什么变化。
额外 作者 Constantin,
在运行新的升级脚本之后转储(并版本化)完整的数据库模式是在构建/部署过程中为其他工具提供信息的好方法。此外,在脚本中拥有完整的模式意味着能够在不经过所有迁移步骤的情况下“旋转”新的数据库。它还可以将当前版本与以前的累积版本进行比较。
额外 作者 mlibby,
我也是这样做的,但我在源代码控制中保留了一个普通的备份文件来代替完整的代码脚本。根据我的经验,更快更容易出问题。它确实使得在任意版本之间进行区分变得稍微困难​​一些,但是再次做到这一点并不经常出现,并且无论如何,更新脚本都是完全可搜索的,因为所有更改都经过它们,所以这应该足够了。另外,对于DB内部的版本号,我在数据库对象上放置了一个扩展属性。这样它就是模式的一部分,而不是数据的一部分。
额外 作者 Atario,

这很简单。

  1. 当基础项目准备就绪时,您必须创建完整的数据库脚本。这个脚本被委托给SVN。它是第一个版本。

  2. 之后,所有开发人员创建更改脚本(ALTER ...,新表格,sprocs等)。

  3. 当您需要当前版本时,您应该执行所有新的更改脚本。

  4. 当应用程序发布到产品时,您将回到1(但随后它将成为课程的后续版本)。

南特将帮助您执行这些更改脚本。 :)

记住。有纪律的时候一切正常。每次数据库更改被提交时代码中的相应函数也被提交。

0
额外
几年后,我说:使用FluentMigrator(或类似的工具为您的平台)。
额外 作者 dariol,

我还在通过数据库扩展属性系列过程存储的数据库中使用一个版本。我的应用程序为每个版本步骤提供脚本(即从1.1移动到1.2)。部署时,它会查看当前版本,然后逐个运行脚本,直到达到最后一个应用程序版本。没有直接的'最终'版本的脚本,即使部署在干净的数据库上也不会通过一系列升级步骤进行部署。

Now what I like to add is that I've seen two days ago a presentation on the MS campus about the new and upcoming VS DB edition. The presentation was focused specifically on this topic and I was blown out of the water. You should definitely check it out, the new facilities are focused on keeping schema definition in T-SQL scripts (CREATEs), a runtime delta engine to compare deployment schema with defined schema and doing the delta ALTERs and integration with source code integration, up to and including MSBUILD continuous integration for automated build drops. The drop will contain a new file type, the .dbschema files, that can be taken to the deployment site and a command line tool can do the actual 'deltas' and run the deployment. I have a blog entry on this topic with links to the VSDE downloads, you should check them out: http://rusanu.com/2009/05/15/version-control-and-your-database/

0
额外

在迁移到x64平台之后,我们需要对我们的SQL数据库进行版本升级,而旧版本则随迁移而中断。我们编写了一个使用SQLDMO将所有SQL对象映射到一个文件夹的C#应用​​程序:

                Root
                    ServerName
                       DatabaseName
                          Schema Objects
                             Database Triggers*
                                .ddltrigger.sql
                             Functions
                                ..function.sql
                             Security
                                Roles
                                   Application Roles
                                      .approle.sql
                                   Database Roles
                                      .role.sql
                                Schemas*
                                   .schema.sql
                                Users
                                   .user.sql
                             Storage
                                Full Text Catalogs*
                                   .fulltext.sql
                             Stored Procedures
                                ..proc.sql
                             Synonyms*
                                .synonym.sql
                             Tables
                                ..table.sql
                                Constraints
                                   ...chkconst.sql
                                   ...defconst.sql
                                Indexes
                                   ...index.sql
                                Keys
                                   ...fkey.sql
                                   ...pkey.sql
                                   ...ukey.sql
                                Triggers
                                   ...trigger.sql
                             Types
                                User-defined Data Types
                                   ..uddt.sql
                                xml Schema Collections*
                                   ..xmlschema.sql
                             Views
                                ..view.sql
                                Indexes
                                   ...index.sql
                                Triggers
                                   ...trigger.sql

然后应用程序会将新编写的版本与存储在SVN中的版本进行比较,如果有差异,它会更新SVN。 我们确定,一晚上运行该流程就足够了,因为我们没有对SQL进行很多更改。它使我们能够跟踪所有我们关心的对象的变化,并且允许我们在发生严重问题时重建我们的完整模式。

0
额外
哦,这对于公开可用是很好的。
额外 作者 Chris Charabaruk,

我前一段时间写了这个应用程序, http://sqlschemasourcectrl.codeplex.com/ 这将扫描您的MSFT SQL数据库的数量和你想要的一样多,并自动将你的对象(表,视图,特效,函数,sql设置)转储到SVN中。奇迹般有效。我将它与Unfuddle一起使用(它允许我在签入时获取警报)

0
额外

在Red Gate,我们提供了一个工具, SQL源代码管理,使用SQL比较技术将您的数据库与TFS或SVN存储库相关联。这个工具集成到SSMS中,让你像平常一样工作,除了它现在可以让你提交对象。

对于基于迁移的方法(更适合自动化部署),我们提供 ReadyRoll ,它创建和管理一组增量脚本作为Visual Studio项目。

在SQL源代码管理中,可以指定静态数据表。这些作为INSERT语句存储在源代码控制中。

如果您正在讨论测试数据,我们建议您使用工具或通过您定义的部署后脚本生成测试数据,或者您只需将生产备份恢复到开发环境。

0
额外
这个答案是两年前发布的Dane答案的重复。
额外 作者 Knickerless-Noggins,
有趣的产品(市场缺口),但是存储为“CREATE ...”的delta会吓倒我。你怎么分支/合并?
额外 作者 annakata,
我们将对象定义存储为CREATE,但如果您“最新”,或者例如使用SQL Compare Pro生成同步脚本,则会将这些脚本更改为适当的命令,例如ALTER。要进行分支或合并,您只需使用与当前相同的方式使用源代码管理系统。
额外 作者 David Atkinson,
这是一个不同的答案。 SQL Compare不是版本控制数据库,而SQL Source Control是专门为此设计的。
额外 作者 David Atkinson,

使用VS 2010,使用数据库项目。

  1. Script out your database
  2. Make changes to scripts or directly on your db server
  3. Sync up using Data > Schema Compare

制作完美的数据库版本解决方案,使数据库的同步变得轻而易举。

0
额外
是的,但不幸的是,你必须记住每一次“生成脚本”。如果直接更新数据库,则无法为该增量生成更新脚本。如果只有数据库项目将具有一些用于版本控制的内置功能。
额外 作者 Jez,

查看DBGhost http://www.innovartis.co.uk/ 。我已经在自动化方式使用了2年,现在效果很好。它允许我们的数据库构建发生得很像Java或C构建,除了数据库之外。你知道我的意思。

0
额外

为了快速转储到源代码控制系统,您可以通过使用sysobjects中的版本信息来查看自上次以来哪些对象发生了更改。

Setup: Create a table in each database you want to check incrementally to hold the version information from the last time you checked it (empty on the first run). Clear this table if you want to re-scan your whole data structure.

IF ISNULL(OBJECT_ID('last_run_sysversions'), 0) <> 0 DROP TABLE last_run_sysversions
CREATE TABLE last_run_sysversions (
    name varchar(128), 
    id int, base_schema_ver int,
    schema_ver int,
    type char(2)
)

Normal running mode: You can take the results from this sql, and generate sql scripts for just the ones you're interested in, and put them into a source control of your choice.

IF ISNULL(OBJECT_ID('tempdb.dbo.#tmp'), 0) <> 0 DROP TABLE #tmp
CREATE TABLE #tmp (
    name varchar(128), 
    id int, base_schema_ver int,
    schema_ver int,
    type char(2)
)

SET NOCOUNT ON

-- Insert the values from the end of the last run into #tmp
INSERT #tmp (name, id, base_schema_ver, schema_ver, type) 
SELECT name, id, base_schema_ver, schema_ver, type FROM last_run_sysversions

DELETE last_run_sysversions
INSERT last_run_sysversions (name, id, base_schema_ver, schema_ver, type)
SELECT name, id, base_schema_ver, schema_ver, type FROM sysobjects

-- This next bit lists all differences to scripts.
SET NOCOUNT OFF

--Renamed.
SELECT 'renamed' AS ChangeType, t.name, o.name AS extra_info, 1 AS Priority
FROM sysobjects o INNER JOIN #tmp t ON o.id = t.id
WHERE o.name <> t.name /*COLLATE*/
AND o.type IN ('TR', 'P' ,'U' ,'V')
UNION 

--Changed (using alter)
SELECT 'changed' AS ChangeType, o.name /*COLLATE*/, 
       'altered' AS extra_info, 2 AS Priority
FROM sysobjects o INNER JOIN #tmp t ON o.id = t.id 
WHERE (
   o.base_schema_ver <> t.base_schema_ver
OR o.schema_ver      <> t.schema_ver
)
AND  o.type IN ('TR', 'P' ,'U' ,'V')
AND  o.name NOT IN ( SELECT oi.name 
         FROM sysobjects oi INNER JOIN #tmp ti ON oi.id = ti.id
         WHERE oi.name <> ti.name /*COLLATE*/
         AND oi.type IN ('TR', 'P' ,'U' ,'V')) 
UNION

--Changed (actually dropped and recreated [but not renamed])
SELECT 'changed' AS ChangeType, t.name, 'dropped' AS extra_info, 2 AS Priority
FROM #tmp t
WHERE    t.name IN ( SELECT ti.name /*COLLATE*/ FROM #tmp ti
         WHERE NOT EXISTS (SELECT * FROM sysobjects oi
                           WHERE oi.id = ti.id))
AND  t.name IN ( SELECT oi.name /*COLLATE*/ FROM sysobjects oi
         WHERE NOT EXISTS (SELECT * FROM #tmp ti
                           WHERE oi.id = ti.id)
         AND   oi.type  IN ('TR', 'P' ,'U' ,'V'))
UNION

--Deleted
SELECT 'deleted' AS ChangeType, t.name, '' AS extra_info, 0 AS Priority
FROM #tmp t
WHERE NOT EXISTS (SELECT * FROM sysobjects o
                  WHERE o.id = t.id)
AND t.name NOT IN (  SELECT oi.name /*COLLATE*/ FROM sysobjects oi
         WHERE NOT EXISTS (SELECT * FROM #tmp ti
                           WHERE oi.id = ti.id)
         AND   oi.type  IN ('TR', 'P' ,'U' ,'V'))
UNION

--Added
SELECT 'added' AS ChangeType, o.name /*COLLATE*/, '' AS extra_info, 4 AS Priority
FROM sysobjects o
WHERE NOT EXISTS (SELECT * FROM #tmp t
                  WHERE o.id = t.id)
AND      o.type  IN ('TR', 'P' ,'U' ,'V')
AND  o.name NOT IN ( SELECT ti.name /*COLLATE*/ FROM #tmp ti
         WHERE NOT EXISTS (SELECT * FROM sysobjects oi
                           WHERE oi.id = ti.id))
ORDER BY Priority ASC

Note: If you use a non-standard collation in any of your databases, you will need to replace /* COLLATE */ with your database collation. i.e. COLLATE Latin1_General_CI_AI

0
额外
非常有用的脚本,谢谢。
额外 作者 pmcilreavy,

您没有提及任何有关您的目标环境或约束的细节,因此这可能不完全适用......但如果您正在寻找一种方法来有效跟踪不断变化的数据库架构,并且不会对使用Ruby,ActiveRecord的迁移就在你的胡同里。

迁移以编程方式使用Ruby DSL定义数据库转换;每个转换都可以应用或(通常)回滚,允许您在任何给定的时间点跳转到不同版本的数据库模式。定义这些转换的文件可以像任何其他源代码一样检入版本控制。

因为迁移是 ActiveRecord 的一部分,所以它们通常用于全堆栈Rails应用程序;不过,您可以使用独立于Rails的ActiveRecord,只需很少的努力。有关使用AR的更详细的处理,请参见此处。 Rails之外的迁移。

0
额外

这是围绕发展的“难题”之一。据我所知,没有完美的解决方案。

If you only need to store the database structure and not the data you can export the database as SQL queries. (in Enterprise Manager: Right click on database -> Generate SQL script. I recommend setting the "create one file per object" on the options tab) You can then commit these text files to svn and make use of svn's diff and logging functions.

我把它与一个带有几个参数并设置数据库的批处理脚本绑定在一起。我还添加了一些额外的查询来输入默认数据,如用户类型和管理员用户。 (如果您想了解更多信息,请发布一些内容,然后我可以将脚本放在可访问的地方)

如果您还需要保留所有数据,我建议保留数据库的备份并使用Redgate( http ://www.red-gate.com/ )产品进行比较。他们并不便宜,但他们值得每一分钱。

0
额外
@Taichman:DataGrove似乎不支持SQL服务器,因此与问题无关。
额外 作者 Neolisk,
如果使用“每个对象一个文件”选项,如何确定运行数据库脚本的顺序?
额外 作者 Jamie Kitson,
关于数据 - 您可以使用 OffScale DataGrove 保存整个数据库的版本(包括数据)。您可以稍后使用它来产生您的数据库的两个虚拟副本,可以与红门产品进行比较。它还为您节省生成测试数据的需求 - 您可以保存数据库的版本以匹配不同的测试用例(再次,完整的整个数据库的虚拟副本)
额外 作者 Taichman,

典型的解决方案是根据需要转储数据库并备份这些文件。

根据您的开发平台,可能会有开源插件可用。滚动你自己的代码来做它通常是相当平凡的。

注意:您可能需要备份数据库转储,而不是将其放入版本控制。这些文件在版本控制中可能会非常快,并且会导致整个源代码管理系统变慢(我现在回想起CVS恐怖故事)。

0
额外

我们刚刚开始使用Team Foundation Server。如果你的数据库是中等大小的,那么Visual Studio有一些很好的项目集成,包括内置的比较,数据比较,数据库重构工具,数据库测试框架,甚至数据生成工具。

但是,该模型并不适合非常大的或第三方数据库(即加密对象)。所以,我们所做的只是存储我们自定义的对象。 Visual Studio / Team Foundation Server对此非常有效。

TFS数据库主管。博客

MS TFS网站

0
额外

Red Gate的SQL Compare产品不仅允许您进行对象级别的比较,并从中生成更改脚本,还允许您将数据库对象导出到由对象类型组织的文件夹层次结构中,同时创建一个[objectname] .sql脚本每个对象在这些目录中。对象类型层次结构如下所示:

\功能结果 \安全结果 \安全\角色点击 \安全\架构结果 \安全\用户点击 \存储过程
\表

如果在进行更改后将脚本转储到同一根目录,则可以使用它来更新SVN回购,并分别保存每个对象的运行历史记录。

0
额外
我们刚刚发布了SQL源代码控制,它将您描述的SQL比较行为集成到SSMS中,并链接到SVN和TFS。我已经为这个问题添加了一个单独的答案,更详细地描述了它的功能。 red-gate.com/products/SQL_Source_Control/index.htm
额外 作者 David Atkinson,

前一段时间,我发现一个VB BAS模块,它使用DMO和VSS对象将整个数据库脚本化并转换为VSS。我把它变成了一个VB脚本,并在这里发布。您可以轻松地取出VSS调用并使用DMO内容生成所有脚本,然后从调用VBScript的同一批处理文件调用SVN来检查它们?

戴夫J

0
额外

你可能想看看Liquibase( http://www.liquibase.org/ )。即使你不使用这个工具,它也能很好地处理数据库变更管理或重构的概念。

0
额外
我们在5个分布在不同分支的团队中使用Liquibase进行连续交付,并且效果很好。我们有10多个数据库应用程序安装在许多不同的环境中我们用它来管理模式,索引,分区,代码,查找数据,组和组权限。我们将它用于Oracle,Postgresql和MSSQL。
额外 作者 Peter Henell,
如果我根据介绍正确理解,它需要你知道一些专有的xml语言来声明你的对象而不是SQL?不是粉丝。
额外 作者 JDPeckham,

因为我们的应用必须跨多个RDBMS工作,所以我们使用数据库中立的转矩格式(XML)。我们还以XML格式版本控制了我们数据库的参考数据,如下所示(其中“关系”是参考表之一):

  
  
  etc.

然后,我们使用自行开发的工具生成从数据库版本X到版本X + 1所需的模式升级和参考数据升级脚本。

0
额外

使用更改脚本将数据库脚本保存到版本控制中是一种好方法,以便您可以升级任何一个数据库。您也可以保存不同版本的模式,以便您可以创建完整的数据库,而无需应用所有更改脚本。处理脚本应该是自动的,这样你就不必手动工作。

我认为为每个开发人员分配一个数据库并且不使用共享数据库非常重要。这样开发人员就可以独立于其他开发人员创建测试用例和开发阶段。

自动化工具应该具有处理数据库元数据的手段,该手段告诉哪些数据库处于何种开发状态以及哪些表包含版本可控数据等等。

0
额外

对于推荐使用RedGate工具的每个人+1,附加推荐和警告。

SqlCompare也有一个体面的API文档:例如,您可以编写一个控制台应用程序,它可以在登录时将您的源代码控制的脚本文件夹与CI集成测试数据库进行同步,以便当有人从其脚本文件夹中检入对模式的更改时它会随匹配的应用程序代码更改而自动部署。这有助于弥补与忘记将本地数据库中的更改传播到共享开发数据库的开发人员的差距(我认为大约有一半人认为:))。

需要注意的是,通过脚本解决方案或其他方式,RedGate工具足够流畅,很容易忘记抽象背后的SQL现实。如果您重命名表中的所有列,SqlCompare无法将旧列映射到新列,并将删除表中的所有数据。它会产生警告,但我看到有人点击过去。我认为这里有一个值得一提的观点,那就是你只能自动完成数据库版本升级和升级 - 抽象是非常有漏洞的。

0
额外
值得注意的是,对于含糊不清的数据库更改(因此需要“开发人员意图”元素),基于迁移的解决方案是适当的解决方案。 Redgate现在拥有满足这种版本控制方法的ReadyRoll。
额外 作者 David Atkinson,
所以应该有一个跟踪你正在改变的列的系统,并记住从旧列名到新列名的映射。
额外 作者 Silvercode,

根据我的经验,解决方案有两个方面:

  1. 您需要处理由开发人员在开发过程中完成的对开发数据库的更改。

  2. 您需要在客户网站中处理数据库升级。

为了处理#1,你需要一个强大的数据库差异/合并工具。最好的工具应该能够尽可能地执行自动合并,同时允许您手动解决未处理的冲突。

完美的工具应该使用3路合并算法来处理合并操作,该算法考虑到THEIRS数据库和MINE数据库中相对于BASE数据库所做的更改。

I wrote a commercial tool that provides manual merge support for SQLite databases and I'm currently adding support for 3-way merge algorithm for SQLite. Check it out at http://www.sqlitecompare.com

为了处理#2,你需要一个升级框架。

基本思路是开发一个自动升级框架,知道如何从现有的SQL模式升级到新的SQL模式,并可以为每个现有的数据库安装构建升级路径。

http://www.codeproject.com/KB/查看我关于这个主题的文章。 database / sqlite_upgrade.aspx 来获得我正在谈论的内容的一般概念。

祝你好运

Liron Levi

0
额外

我同意ESV的回答,出于这个确切原因,我开始了一个小项目,以帮助维护一个非常简单的文件中的数据库更新,然后可以保持长期的源代码。它允许开发人员以及UAT和Production轻松更新。该工具适用于Sql Server和MySql。

一些项目功能:

  • 允许架构更改
  • 允许值树人口
  • 允许单独的测试数据插入例如。 UAT
  • 允许选择回滚(不自动)
  • 维护对SQL Server和Mysql的支持
  • 有能力使用一个简单的命令将您现有的数据库导入到版本控制中(仅适用于sql server ...仍然可以在mysql上使用)

该代码托管在谷歌代码上。请查看Google代码以获取更多信息

http://code.google.com/p/databaseversioncontrol/

0
额外

这是一个非常古老的问题,但是很多人现在都试图解决这个问题。他们所要做的就是研究有关Visual Studio数据库项目。没有这个,任何数据库开发看起来都很虚弱。从代码组织到部署到版本控制,它简化了一切。

0
额外

首先,您必须选择适合您的版本控制系统:

    集中式版本控制系统 - 一种标准系统,用户在处理文件之前/之后检出/检入,并将文件保存在单个中央服务器中
  • 分布式版本控制系统 - 克隆存储库的系统,每个克隆实际上是存储库的完整备份,因此如果任何服务器崩溃,则可以使用任何克隆的存储库来恢复它 在为您的需求选择正确的系统后,您需要设置每个版本控制系统的核心库 所有这些在下面的文章中都有解释: http://solutioncenter.apexsql.com/sql-server-source-control-part-i-understanding-source-control-basics/

设置存储库后,如果中央版本控制系统是工作文件夹,则可以阅读这篇文章。它展示了如何使用以下方法在开发环境中设置源代码管理:

  • 通过MSSCCI提供商的SQL Server Management Studio,

  • Visual Studio和SQL Server数据工具

  • 第三方工具ApexSQL源代码管理
0
额外

I would suggest using comparison tools to improvise a version control system for your database. A good alternative are xSQL Schema Compare and xSQL Data Compare.

现在,如果您的目标是在版本控制下只有数据库的模式,您可以简单地使用xSQL Schema Compare来生成模式的xSQL快照,并将这些文件添加到版本控制中。与恢复或更新到特定版本相比,只需将数据库的当前版本与目标版本的快照进行比较即可。

唉,如果您想要在版本控制下也有数据,则可以使用xSQL Data Compare为您的数据库生成更改脚本,并在您的版本控制中添加.sql文件。然后你可以执行这些脚本来恢复/更新你想要的任何版本。请记住,对于“还原”功能,您需要生成更改脚本,这些脚本在执行时将使版本3与版本2相同,并且对于“更新”功能,您需要生成相反的更改脚本。

最后,借助一些基本的批处理编程技巧,您可以使用命令行版本的xSQL Schema Compare和xSQL Data Compare自动执行整个过程

免责声明:我隶属于xSQL。

0
额外