是的,可以将您的更改从您的开发实例迁移到您的生产实例;为此,您必须创建 SQL 脚本,使用更改来更新您的生产数据库。这可以通过手动编写脚本或使用工具为您生成脚本来完成。不管你怎么做,你都需要脚本来更新你的数据库(好吧,你可以通过你的数据库工具来执行手动更新,但这是不可取的,因为你希望更新在很短的时间窗口内发生,并且你希望这种情况可靠且可重复地发生)。
据我所知,最简单的方法是使用 SQL 比较(用于模式更新)或 SQL 数据比较(用于数据更新)之类的工具。这些来自 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/