我正在开发一个项目,其中我们有两个版本的MVC应用程序,live和dev版本,我已经对开发版本进行了更改,并添加了表格和数据等。
有没有办法将这些更改迁移到实时版本而不会丢失所有数据(即只是重新生成数据库)。
我已经尝试过重建数据库,但是我们丢失了以前存储的所有数据(显然我们基本上删除了旧数据库并重建了它)。
TL;博士
如何将我的开发版mvc应用程序以及任何新表格迁移到缺少模型和表格的mvc应用程序的实时版本。
答案 0 :(得分:0)
是的,可以将您的更改从开发实例迁移到生产实例;为此,您必须创建SQL脚本,以使用更改来更新生产数据库。这可以通过手动编写脚本或使用工具为您生成脚本来完成。无论如何,你需要脚本来更新你的数据库(好吧,你可以通过数据库的工具执行手动更新,但这是不可取的,因为你希望在短时间内发生更新,而你希望这可靠且可重复地发生。)
我知道这样做的最简单方法是使用SQL Compare(用于架构更新)或SQL Data Compare(用于数据更新)等工具。这些来自Redgate,但它们花费了相当多的钱。他们非常值得他们定价,我与之合作的大多数公司都很乐意支付许可费。但是,你可能不想亲自为他们辩护。要使用这些工具,可以将它们连接到源数据库和目标数据库,并分析数据库(示意图或数据)之间的差异并生成SQL脚本。然后可以手动或通过工具本身运行这些脚本。
理想情况下,当您处理应用程序时,您应该随身携带这些脚本。这样,当需要更新环境时,您可以简单地运行您拥有的脚本。值得花时间在构建过程中包含它,因此数据库脚本将包含在构建中。您应该编写脚本以使它们是幂等的,这意味着您可以多次运行它们,最终结果将是相同的(数据库更新为所需的模式和数据)。
管理此操作可能是在数据库中创建DBVersions表。此表包含所有脚本更新。例如,您可以拥有如下表格(这是SQL Server 2008方言):
CREATE TABLE [dbo].[DBVersions] (
[CaseID] [int] NOT NULL,
[DateExecutedOn] [datetime] NOT NULL,
CONSTRAINT [PK_DBVersions] PRIMARY KEY CLUSTERED (
[CaseID] ASC
)
) ON [PRIMARY]
CaseID是指需要SQL更新的功能或错误的案例(或问题)编号。您的构建过程可以检查此表以查看脚本是否已运行。如果没有,它运行它。如果您不能以允许它们多次运行的方式编写脚本,这将非常有用。如果所有脚本都可以无限次运行,那么这个表并不是绝对必要的,尽管每次部署完成后都可以减少运行大量脚本的需要。
以下是Redgate工具的链接。可能还有很多其他工具,但我对这些工具有很好的体验。
http://www.red-gate.com/products/sql-development/sql-compare/
http://www.red-gate.com/products/sql-development/sql-data-compare/
答案 1 :(得分:0)
这取决于您的部署策略,这更像是您的团队需要拥抱的工作流程。如果从头开始重新生成实时数据库,则可能需要一段时间,具体取决于数据库大小的大小。在大多数情况下,我认为不需要这样做。
您只需要分离数据库架构对象和数据行脚本。实时数据库版本应该将其数据库模式对象编写成脚本并存储在存储库中。当开发人员正在处理新功能时,他/她将需要针对存储库中的数据库脚本进行这些更改。如果需要对数据库行进行更改,则开发人员还需要检入存储库中的数据行脚本。在每日部署中,可以将实时数据库版本与存储库中检查的内容进行比较,并推送以使其同步。
在我们这边,我们使用RedGate Schema Compare和Data Compare等工具来执行从开发版到我们预期目标版本的数据库迁移。