如何生成sql脚本来更新现有数据库并保留其数据

时间:2010-10-22 15:17:32

标签: sql-server scripting wizard

我有一个包含数据的SQL Server 2008数据库(称之为productionDB),将在生产环境中使用。

我有一个在暂存环境中使用的另一个SQL Server 2008数据库(称之为stagingDB)。

我正在开发的应用程序不断发展,以至于我经常对数据库架构进行更改(即添加/编辑表以及添加/编辑存储过程)。

到目前为止,每次我对stagingDB进行更改时,我都会生成脚本(通过SQL Server脚本向导),这将删除/创建所有模式。因此,当我在productionDB上运行脚本时,它会成功更新到更新的模式,但是生产数据库中的所有数据都将丢失 - 这一直很好,直到现在为止。

继续前进,我想生成脚本,将现有数据保存在productionDB中并更新其架构。

我无法在SQL Server脚本向导中找到可以执行我所描述的选项。

SQL Server脚本向导是否能够执行我要查找的内容?如果是这样,怎么样?

4 个答案:

答案 0 :(得分:5)

删除/重新创建是一把大刀;你必须更多手术。以下是一些伪代码示例:

添加新列:

if not exists (select your column from syscolumns)
   alter yourTable add
      yourColumn (type) NULL

如果它不能为空,请设置默认值,或更新列以填充数据,然后更改表并将列设置为NOT NULL。

重命名列:

if not exists (select your column from syscolumns)
begin
   alter yourTable add yourColumn <type> NULL

   update yourTable set yourColumn = oldColumn

   alter yourTable drop oldColumn
end

重命名表格:

if not exists (select your table from sysobjects)
begin
   create yourTable
       <your columns here>

   insert into yourTable ( <columns> ) select ( <columns> ) from oldTable

   delete from oldTable
   drop table oldTable
end

注意一个共同的主题;首先,您必须通过检查是否存在更新的架构元素来检查您是否已执行此更新。然后,按添加模式 - >迁移数据 - > drop模式的顺序添加或删除必要的内容。这需要更多的代码工作,但它会更快地运行并保存您的数据。

答案 1 :(得分:2)

我真的不知道SQL Server能否自动执行您想要的任何操作,但您可能会发现商业应用程序(例如由RedGate等公司提供的应用程序)可以执行您想要的操作,但它非常复杂主题,总会有一些无法真正管理的场景。我总是找到一个更好的方案来编写对Staging的修改,以便它们可以重新运行。因此,您编写脚本来修改表结构 - 这样就可以在脚本运行时维护暂存和实时数据。

答案 2 :(得分:1)

您的主要问题是SQL Server脚本向导不知道您的数据库处于什么状态,您将运行该脚本。

因此,它不知道应用什么差异,例如:何时使用alter table或何时使用create table

是的,该脚本可以添加If Not Exist子句,但是当您的表存在但需要额外的2列时,该子句也不知道该怎么做。 SQL Server脚本向导不与另一个模式进行比较,它只是按原样编写现有模式的脚本。

根据您的SQL2008版本,您可能会安装一个版本的BIDS以及SQL。在开始菜单中,您应该拥有“Microsoft SQL Server 2008”文件夹,其中包含指向“SQL Server Business Intelligence Development Studio”(BIDS)的链接。

同样,这将取决于SQLServer2008的版本。 BIDS是Visual Studio开发环境。

现在,如果你有这个,根据你拥有的BIDS版本(我认为模式比较工具的最小值是VS2008 SP1),你可以在那里创建项目来比较2个数据库模式。然后可以将差异编写到适当的脚本中。 我不知道自己在VS2008中如何做到这一点,因为我们正在使用VS2010和完全实现它的版本。我看了VS2008,但在一个明显的位置找不到它。据谷歌称,虽然VS2008 SP1有一个架构比较工具。

如果所有其他方法都失败了,您将不得不搜索免费或付费的架构比较工具,例如SQL Compare 8.2

这个想法是一样的,你必须比较两个模式,看看有什么不同。然后决定从暂存到实时的内容,并相应地编写脚本。这些工具只为您完成大部分手工工作。

答案 3 :(得分:0)

您可以使用 Visual Studio 数据库项目管理数据库(使用脚本为您的数据库创建非常容易),然后当您要更新现有数据库时,对要更新的数据库使用发布选项将生成用于更新数据库的脚本,如果需要,可以为您针对数据库运行脚本:)