在典型的开发环境里,会有一台开发服务器,一台功能测试服务器,一台质量保证服务器,以及一台或者多台生产服务器。现在让我们假设你要求修改开发服务器上的一个表格,加入一个数据列或者更改数据列的名称或数据类型,而且你还要进行50个或者更多的更改。现在是按照层叠顺序对其他服务器进行更改的时候了。
SQL Server 2005 Management Studio通过其“生成更改脚本(Generate Change Script)”按钮轻易地解决了这一难题,见图A。当你右击一个表格并从快捷方式菜单里选择“修改(Modify)”时,“生成更改脚本”按钮就会出现。这个按钮背后的代码会分析当前表格的定义,将它与你更改过的定义进行比较,然后编写一个更改旧表格以满足新定义的脚本。通过在远程数据库上运行这个脚本,你可以对安装在客户端或者分支网站上的数据库进行修改。
图A |
 
图A:“生成更改脚本”按钮 |
现在你被要求分别更改char的所有nchar数据列和varchar的所有nvarchar数据列。这可能是个很棘手的东西,尤其是在涉及外来键的情况下。(在本文里,我们不考虑将这样的数据列作为主键所带来的问题,这与身份列是不同的。)
当你开始进行这些改变时,你会发现SQL Server 2005 Management Studio里的另外一个很酷的隐藏特性:数据类型更改(Data Type Change)。当你更该数据类型或者更改被作为外来键的数据列里的其他内容时,这个对话框就会出现。例如,在更改了char的所有nchar实例和varchar的所有nvarchar实例之后,“要求数据类型更改(Data Type Change Required)”对话框(见图B)就会弹出来。在阅读完关于可能会由于转换而丢失数据的警告信息之后,我点击了“同意(Yes)”按钮继续。
图B |
 
图B:SQL Server 2005 Management Studio检测到CustomerID列是一个外来键,并通知你所有的实例都会被更改。 |
SQL Server 2005 Management Studio生成的代码会完成所有的更改并提供一个预览画面供我进行检查。(注意:在预览窗口里,你无法看到所有的代码,但是你可以选择所有的代码,把它粘贴到另外一个编辑器里更好地查看。)列表C里是生成的代码:
/* To prevent any potential data loss issues, you should review this script
in detail before running it outside the context of the database designer.*/
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.CustomerCustomerDemo
DROP CONSTRAINT FK_CustomerCustomerDemo
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.Orders
DROP CONSTRAINT FK_Orders_Shippers
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.Orders
DROP CONSTRAINT FK_Orders_Employees
GO
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_Customers
(
CustomerIDchar(10) NOT NULL,
CompanyNamevarchar(50) NOT NULL,
ContactNamevarchar(50) NULL,
ContactTitlevarchar(50) NULL,
Address varchar(60) NULL,
City varchar(50) NULL,
Region varchar(50) NULL,
PostalCodevarchar(50) NULL,
Country varchar(50) NULL,
Phone varchar(50) NULL,
Fax varchar(50) NULL,
DateCreateddatetime NOT NULL
) ON [PRIMARY]
GO
GRANT DELETE ON dbo.Tmp_Customers TO public ASdbo
GO
GRANT INSERT ON dbo.Tmp_Customers TO public ASdbo
GO
GRANT REFERENCES ON dbo.Tmp_Customers TO public ASdbo
GO
GRANT SELECT ON dbo.Tmp_Customers TO public ASdbo
GO
GRANT UPDATE ON dbo.Tmp_Customers TO public ASdbo
GO
ALTER TABLE dbo.Tmp_Customers ADD CONSTRAINT
DF_Customers_DateCreated DEFAULT GetDate() FOR DateCreated
GO
IF EXISTS(SELECT * FROM dbo.Customers)
EXEC('INSERT INTO dbo.Tmp_Customers
(CustomerID, CompanyName, ContactName, ContactTitle, Address,
City, Region, PostalCode, Country, Phone, Fax)
如果你碰到这种类型的更改要求,而且在你整个数据库里都有,那么生成像上面这样的单独的脚本会相当烦人。你可以通过不同的解决方案来节省时间,例如数据建模工具或者Red Gate Software公司的SQL Compare,后者能够“diff”两个数据库,更改一个数据库就能对另外一个数据库进行更新。但是,当你的任务不是那么重要时,SQL Server 2005 Management Studio确实完成得非常好。
责任编辑:张琎
查看本文的国际来源
|