深入介绍:SQL Server变更管理工具

网络整理 - 07-26
当SQL Server 2005起动并运行的时候,有一些事情是你可以做,并且可以让你的生活变得像程序员一样更加简单——不需要变成数据库管理员。最常见的一个在背上的针芒就是变更管理。虽然大多数的开发人员都很熟悉Microsoft Source Safe或者其他的资源控制技术,数据库开发人员可用来帮助轻松管理变更的工具也是非常有限的。SQL Server 2005包括了Visual Source Safe集成在内。在这篇文章中我不会涉及Source Safe。我将会把重点集中在SQL Server本身可以让你的项目前进的技巧和技术上。在这篇文章中,我将会回答以下两个大问题:

  1、我如何回滚因错误产生的变更?

  2、我如何将变更从一个数据库移到另一个数据库中?

  认识到在开发时间里你可能会犯错误,那么在每次更改之前都先给数据库进行一次拷贝。你可能会发现自己最终被埋在数据库的几百份拷贝中——我就见过这种情况发生。这会变得非常难以处理。如果你的工作方式更像我,那么你会想要工作在开发数据库中,只是简单的找到一种方法来管理错误。要处理这种错误,通常有两种方式:数据库备份和数据库快照。我将要讨论的第一种方式是数据库备份(注意:你可以使用SQL Server管理套件执行每种技巧——但是因为我们是开发人员,所以我们将会在Transact-SQL完成这些任务。)

  首先,让我们创建一个完全的数据库备份。

  

BACKUP DATABASE [AdventureWorksDW] TO DISK = N'C:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLBackupAdventureWorksDW.bak' WITH NOFORMAT, NOINIT, NAME = N'AdventureWorksDW-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO

  在这个例子中,我为SQL Server默认环境备份了AdventureWorks DW示例数据库到备份文件夹中去。备份是我们最可靠的擦除器。如果你不想要经常备份,试试叫作“数据库快照”的数据库新功能。数据库快照就是第二种方式。它允许我们取出某个时间点的数据库图像。当主数据库(或者源数据库)发生变化的时候,快照数据库对数据库备份之前发生的主要变化进行了记录。从本质上说,数据库快照在拷贝上使用了从被修改页面上传过来的写技术。因此你可以使用快照来进行恢复。要创建数据库快照,我执行如下的T-SQL:

CREATE DATABASE AdventureWorks_DWBEFORECHANGE ON ( NAME = AdventureWorksDW_Data, FILENAME = 'C:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLDataAdventureWorks_DW.ss'AS SNAPSHOT OF AdventureWorksDW;
GO

  这里灵活的部分就是知道数据文件的名字,在NAME子句中提供出来。你可以通过在SQL Server管理套件的数据库对象浏览器中找到拥有的文件来找到数据库数据文件名(是的,我们耍赖了)。

  现在,我们做一些修改,然后。噢我的天!我们需要回滚!魔法就在这里:

Use Master;
RESTORE DATABASE [AdventureWorksDW] FROM DATABASE_SNAPSHOT = 'AdventureWorks_DWBEFORECHANGE';

  这很酷,但是有些局限。当你使用快照恢复之后,你应该进行一次完全的数据库备份——仅仅是重新执行以上步骤。SQL Server重新构建了日志文件,然后执行一次完整的备份来使它正确。还有,既然数据库快照不能捕捉数据库中的一切内容,只是那些被修改了的部分,你可能需要使用我们前面创建的完全备份,或者用脚本重新输入所与的测试数据。在很多情况下,我们都将数据放在单独的插入数据脚本中,所以我们可以在匆忙间重新产生它们。

  我喜欢使用叫做EMS DB Extract的工具。它在生成向数据库中创建数据插入的脚本方面非常棒。SQL Server确实提供了数据库导入和导出向导,但是我发现它是有限制的,它强迫我使用向导,这就意味着改变了我的操作方式。如果你选择了使用数据库导入导出向导,你会发现它创建并执行了SQL Server综合服务(SSIS)包。这可以非常方便,也可以不是。数据库导入导出向导可以使用目标数据库或者几种不同类型的文件格式。选择目标数据库就意味着你每次要运行它的时候都要创建一个新的数据库,或者重写现有的数据库。我比较喜欢让我的服务器保持整洁,所以一个数据库拷贝足够了——我只是重写原有的那个备份。