演练:创建和运行数据生成计划
在本演练中,将创建一个数据生成计划,然后运行该计划来用随机生成的数据填充测试数据库。 首先创建一个数据库项目,然后将其部署到独立的测试数据库。 可以使用独立的数据库测试数据生成,而不影响您的生产数据或数据库。
系统必备
为了完成此演练,必须已安装以下产品:
Visual Studio 高级专业版
SQL Server 2008 或 SQL Server 2005
创建数据库项目
首先创建一个数据库项目,并从脚本导入架构。
提示
在团队环境下,可以从版本控制签出现有项目来处理数据库项目。 有关更多信息,请参见开始团队数据库开发。
创建数据库脚本
在**“文件”菜单上指向“新建”,然后单击“文件”**。
此时将打开**“新建文件”**对话框。
在**“类别”列表中,如果尚未突出显示“常规”**,请单击它。
在**“模板”列表中,单击“Sql 文件”,然后单击“打开”**。
Transact-SQL 编辑器打开。
复制下面的 Transact-SQL 代码并将其粘贴到 Transact-SQL 编辑器中。
PRINT N'Creating dbo.Customer...'; GO CREATE TABLE [dbo].[Customer] ( [CustomerId] UNIQUEIDENTIFIER NOT NULL, [UserId] UNIQUEIDENTIFIER NOT NULL, [UserName] VARCHAR (256) NOT NULL ); GO PRINT N'Creating dbo.Menu...'; GO CREATE TABLE [dbo].[Menu] ( [MenuId] UNIQUEIDENTIFIER NOT NULL, [RestaurantId] UNIQUEIDENTIFIER NOT NULL, [StartDate] DATETIME NOT NULL, [EndDate] DATETIME NOT NULL, [MenuType] VARCHAR (50) NULL ); GO PRINT N'Creating dbo.MenuItem...'; GO CREATE TABLE [dbo].[MenuItem] ( [MenuItemId] UNIQUEIDENTIFIER NOT NULL, [MenuId] UNIQUEIDENTIFIER NOT NULL, [Name] VARCHAR (128) NULL, [Description] VARCHAR (512) NULL, [ImageLocation] VARCHAR (MAX) NULL, [Price] MONEY NULL, [PreparationTime] INT NULL ); GO PRINT N'Creating dbo.Order...'; GO CREATE TABLE [dbo].[Order] ( [OrderId] UNIQUEIDENTIFIER NOT NULL, [SubmittedDate] SMALLDATETIME NOT NULL, [CustomerID] UNIQUEIDENTIFIER NOT NULL, [Total] MONEY NOT NULL, [ContactTelephone] CHAR (20) NULL, [PostalCode] CHAR (10) NULL, [State] CHAR (2) NULL, [StreetAddress] VARCHAR (75) NULL, [City] VARCHAR (25) NULL ); GO PRINT N'Creating dbo.OrderDetail...'; GO CREATE TABLE [dbo].[OrderDetail] ( [OrderDetailId] UNIQUEIDENTIFIER NOT NULL, [OrderId] UNIQUEIDENTIFIER NOT NULL, [RestaurantId] UNIQUEIDENTIFIER NOT NULL, [MenuItemId] UNIQUEIDENTIFIER NOT NULL, [DeliveryId] UNIQUEIDENTIFIER NOT NULL, [Quantity] INT NOT NULL, [UnitCost] MONEY NOT NULL, [Status] NCHAR (20) NOT NULL, [StatusUpdatedTime] SMALLDATETIME NOT NULL, [WorkflowId] UNIQUEIDENTIFIER NOT NULL, [ETA] SMALLDATETIME NULL ); GO PRINT N'Creating dbo.OrderPayment...'; GO CREATE TABLE [dbo].[OrderPayment] ( [PaymentID] UNIQUEIDENTIFIER NOT NULL, [OrderID] UNIQUEIDENTIFIER NOT NULL, [CreditCardNumber] CHAR (4) NULL, [NameOnCard] VARCHAR (75) NULL, [Address] VARCHAR (50) NULL, [Country] VARCHAR (50) NULL, [City] VARCHAR (50) NULL, [State] VARCHAR (50) NULL, [PostalCode] CHAR (10) NULL, [ExpirationDate] SMALLDATETIME NULL, [CreditCardType] VARCHAR (50) NULL ); GO PRINT N'Creating dbo.Restaurant...'; GO CREATE TABLE [dbo].[Restaurant] ( [RestaurantId] UNIQUEIDENTIFIER NOT NULL, [Name] VARCHAR (256) NULL, [Description] VARCHAR (1024) NULL, [RestaurantCategoryId] UNIQUEIDENTIFIER NOT NULL, [LogoImageLocation] NVARCHAR (MAX) NULL, [SmallLogoImageLocation] NVARCHAR (MAX) NULL, [BannerImageLocation] NVARCHAR (MAX) NULL, [MainImageLocation] NVARCHAR (MAX) NULL, [BackgroundLocation] NVARCHAR (MAX) NULL, [PostalCode] VARCHAR (128) NOT NULL, [StreetAddress] VARCHAR (256) NULL, [City] VARCHAR (512) NULL, [State] VARCHAR (256) NULL ); GO PRINT N'Creating dbo.RestaurantCategory...'; GO CREATE TABLE [dbo].[RestaurantCategory] ( [RestaurantCategoryId] UNIQUEIDENTIFIER NOT NULL, [Description] VARCHAR (255) NOT NULL ); GO PRINT N'Creating dbo.Default_Menu_StartDate...'; GO ALTER TABLE [dbo].[Menu] ADD CONSTRAINT [Default_Menu_StartDate] DEFAULT GETDATE() FOR [StartDate]; GO PRINT N'Creating dbo.PK_Customer...'; GO ALTER TABLE [dbo].[Customer] ADD CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED ([CustomerId] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF); GO PRINT N'Creating dbo.PK_Menu...'; GO ALTER TABLE [dbo].[Menu] ADD CONSTRAINT [PK_Menu] PRIMARY KEY CLUSTERED ([MenuId] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF); GO PRINT N'Creating dbo.PK_MenuItem...'; GO ALTER TABLE [dbo].[MenuItem] ADD CONSTRAINT [PK_MenuItem] PRIMARY KEY CLUSTERED ([MenuItemId] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF); GO PRINT N'Creating dbo.PK_Order2...'; GO ALTER TABLE [dbo].[Order] ADD CONSTRAINT [PK_Order2] PRIMARY KEY CLUSTERED ([OrderId] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF); GO PRINT N'Creating dbo.PK_OrderDetail...'; GO ALTER TABLE [dbo].[OrderDetail] ADD CONSTRAINT [PK_OrderDetail] PRIMARY KEY CLUSTERED ([OrderDetailId] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF); GO PRINT N'Creating dbo.PK_OrderPayment...'; GO ALTER TABLE [dbo].[OrderPayment] ADD CONSTRAINT [PK_OrderPayment] PRIMARY KEY CLUSTERED ([PaymentID] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF); GO PRINT N'Creating dbo.PK_Restaurant...'; GO ALTER TABLE [dbo].[Restaurant] ADD CONSTRAINT [PK_Restaurant] PRIMARY KEY CLUSTERED ([RestaurantId] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF); GO PRINT N'Creating dbo.PK_RestaurantCategory...'; GO ALTER TABLE [dbo].[RestaurantCategory] ADD CONSTRAINT [PK_RestaurantCategory] PRIMARY KEY CLUSTERED ([RestaurantCategoryId] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF); GO PRINT N'Creating dbo.FK_Menu_Restaurant...'; GO ALTER TABLE [dbo].[Menu] ADD CONSTRAINT [FK_Menu_Restaurant] FOREIGN KEY ([RestaurantId]) REFERENCES [dbo].[Restaurant] ([RestaurantId]) ON DELETE NO ACTION ON UPDATE NO ACTION; GO PRINT N'Creating dbo.FK_MenuItem_Menu...'; GO ALTER TABLE [dbo].[MenuItem] ADD CONSTRAINT [FK_MenuItem_Menu] FOREIGN KEY ([MenuId]) REFERENCES [dbo].[Menu] ([MenuId]) ON DELETE NO ACTION ON UPDATE NO ACTION; GO PRINT N'Creating dbo.FK_Order2_Customer...'; GO ALTER TABLE [dbo].[Order] ADD CONSTRAINT [FK_Order2_Customer] FOREIGN KEY ([CustomerID]) REFERENCES [dbo].[Customer] ([CustomerId]) ON DELETE NO ACTION ON UPDATE NO ACTION; GO PRINT N'Creating dbo.FK_OrderDetail_MenuItem...'; GO ALTER TABLE [dbo].[OrderDetail] ADD CONSTRAINT [FK_OrderDetail_MenuItem] FOREIGN KEY ([MenuItemId]) REFERENCES [dbo].[MenuItem] ([MenuItemId]) ON DELETE NO ACTION ON UPDATE NO ACTION; GO PRINT N'Creating dbo.FK_OrderDetail_Order2...'; GO ALTER TABLE [dbo].[OrderDetail] ADD CONSTRAINT [FK_OrderDetail_Order2] FOREIGN KEY ([OrderId]) REFERENCES [dbo].[Order] ([OrderId]) ON DELETE CASCADE ON UPDATE CASCADE; GO PRINT N'Creating dbo.FK_OrderDetail_Restaurant...'; GO ALTER TABLE [dbo].[OrderDetail] ADD CONSTRAINT [FK_OrderDetail_Restaurant] FOREIGN KEY ([RestaurantId]) REFERENCES [dbo].[Restaurant] ([RestaurantId]) ON DELETE NO ACTION ON UPDATE CASCADE; GO PRINT N'Creating dbo.FK_OrderPayment_Order...'; GO ALTER TABLE [dbo].[OrderPayment] ADD CONSTRAINT [FK_OrderPayment_Order] FOREIGN KEY ([OrderID]) REFERENCES [dbo].[Order] ([OrderId]) ON DELETE CASCADE ON UPDATE CASCADE; GO PRINT N'Creating dbo.FK_Restaurant_RestaurantCategory...'; GO ALTER TABLE [dbo].[Restaurant] ADD CONSTRAINT [FK_Restaurant_RestaurantCategory] FOREIGN KEY ([RestaurantCategoryId]) REFERENCES [dbo].[RestaurantCategory] ([RestaurantCategoryId]) ON DELETE NO ACTION ON UPDATE NO ACTION; GO PRINT N'Creating dbo.CK_Menu_EndDate...'; GO ALTER TABLE [dbo].[Menu] ADD CONSTRAINT [CK_Menu_EndDate] CHECK (([EndDate] > '01/01/2000') AND ([EndDate] >= [StartDate])); GO PRINT N'Creating dbo.CK_Menu_StartDate...'; GO ALTER TABLE [dbo].[Menu] ADD CONSTRAINT [CK_Menu_StartDate] CHECK ([StartDate] > '01/01/2000'); GO PRINT N'Creating AutoCreatedLocal...'; GO CREATE ROUTE [AutoCreatedLocal] AUTHORIZATION [dbo] WITH ADDRESS = N'LOCAL'; GO PRINT N'Creating dbo.Menu.EndDate.ExtProp_Menu_EndDate_Description...'; GO EXECUTE sp_addextendedproperty @name = N'ExtProp_Menu_EndDate_Description', @value = 'Date the menu expired. Must be > 01/01/2000 and must be after the StartDate', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'Menu', @level2type = N'COLUMN', @level2name = N'EndDate'; GO
在**“文件”菜单上,单击“将 SqlQuery_1.sql 另存为”**。
**“另存文件为”**对话框打开。
在**“对象名”**中,键入 SampleImportScript.sql。
可以将文件保存到计算机中的任何位置。 记下该位置,在下面的步骤中将用到它。
单击**“保存”**。
在**“文件”菜单上,单击“关闭解决方案”**。
接下来,创建一个数据库项目,并从已创建的脚本导入架构。
创建数据库项目
在**“文件”菜单上指向“新建”,再单击“项目”**。
此时将出现**“新建项目”**对话框。
在**“已安装的模板”下,展开“数据库”节点,然后单击“SQL Server”**。
提示
如果您使用的是 Visual Studio 专业版,请在“已安装的模板”下进行查看,依次展开“数据库”节点和“SQL Server”节点,然后单击“高级”。
在模板列表中单击**“SQL Server 2008 数据库项目”**。
提示
如果要部署 SQL Server 2008 之外的服务器,请单击与目标部署环境对应的模板。
在**“名称”中,键入“WalkthroughDataGenerator”,然后单击“确定”**。
即会创建一个包含 WalkthroughDataGenerator 空项目的解决方案。 这就是您的数据库项目。 在您使用数据库项目时,其他人都不能对其进行访问。
在**“解决方案资源管理器”中单击“WalkthroughDataGenerator”**。
在**“项目”菜单上,单击“导入脚本”**。
在**“导入 SQL 脚本文件”对话框中,单击“下一步”**。
在**“文件名”**中,键入在本演练前面的步骤中创建的脚本的路径和文件名。
或者,也可以单击**“浏览”**查找该脚本文件。
单击**“完成”**。
即会导入包含数据库结构定义的脚本。
导入架构后,单击**“完成”**。
该数据库架构已导入到您的数据库项目中。 与数据库中的对象对应的项目项显示在**“解决方案资源管理器”和“架构视图”**中数据库项目的下面。 接下来,配置、生成项目并将其部署到您的本地开发环境中。
部署到独立开发环境
下一步,将项目部署到新数据库。 此过程创建具有导入的架构、但不包含数据的数据库。 此数据库是一个独立的开发环境,即沙箱,您可以在该环境中开发和测试此数据库。
生成数据库项目
在**“解决方案资源管理器”中,单击数据库项目“WalkthroughDataGenerator”**。
在**“项目”菜单上,单击“WalkthroughDataGenerator 属性”**。
将显示项目属性。
单击**“部署”**选项卡。
在**“部署操作”列表中,单击“创建部署脚本(.sql)并部署到数据库”**。
在**“目标数据库设置”中,单击“编辑”以显示“连接属性”**对话框。
设置要使用的数据库的连接属性,然后单击**“确定”**。
**“目标连接”**框用正确的连接字符串填充。
警告
应在测试服务器、开发服务器或本地计算机上创建新数据库。 不应使用生产服务器。
在**“目标数据库名称”**文本框中键入“DinnerNowDataGenerator”。
在**“文件”菜单上,单击“全部保存”**。
在**“生成”菜单上,单击“生成解决方案”**。
当生成项目时,验证是否可以创建 .dbschema 文件且没有错误。 在**“输出”窗口中查看生成状态,可以在最后一行看到“生成: 1 成功或最新”**。
部署数据库项目
在**“解决方案资源管理器”中,单击数据库项目“WalkthroughDataGenerator”**。
在**“生成”菜单上,单击“部署 WalkthroughDataGenerator”。 也可以在“解决方案资源管理器”中右击项目,然后单击“部署”**。
警告
应对测试服务器、开发服务器或本地计算机运行此部署。 不应使用生产服务器。
数据库项目部署到新数据库。 在**“输出”窗口中查看部署状态,可以在最后一行看到“部署: 成功 1 个”**。
提示
如果未显示“输出”窗口,请打开“视图”菜单,然后单击“输出”。
创建数据生成计划
下一步,创建数据生成计划。 数据生成计划包含有关要用数据填充哪些表和列的信息。 有关更多信息,请参见如何:创建数据生成计划。
创建数据生成计划
在**“解决方案资源管理器”中,右击“数据生成计划”节点,指向“添加”,然后单击“数据生成计划”**。
随即将出现**“添加新项”**对话框。
在**“名称”**文本框中,键入“PartialDGenPlan.dgen”。
单击**“添加”**。
即会创建数据生成计划。 将出现数据生成计划和**“数据生成预览”**窗口。 数据生成计划窗口按横向分为两个窗格。 上面的窗格列出数据库项目架构中定义的表。 下面的窗格显示上面的窗格中突出显示的表的列详细信息。
提示
如果“数据生成预览”窗口尚未打开,则可以通过以下操作将其打开:打开“数据”菜单,指向“数据生成器”,然后单击“预览数据生成”。 默认情况下,“数据生成预览”窗口将作为一个选项卡停靠在数据生成计划窗口的底部。 若要展开视图,请单击窗口,然后单击“窗口”菜单上的“以选项卡式文档停靠”。 也可以右击标题栏,然后单击“以选项卡式文档停靠”。
在 PartialDGenPlan.dgen 设计器中,清除所有表的复选框。
提示
通过使用“在数据生成中包含所有表”和“从数据生成中排除所有表”命令,可以选中或清除所有表的复选框。 通过右击数据生成计划窗口中的任何行,或在“数据”菜单上指向“数据生成器”,可以访问这些命令。
在 PartialDGenPlan.dgen 设计器中,选中 dbo.Restaurant 表的复选框。
系统还将自动选中 dbo.RestaurantCategory 表的复选框。 由于 Restaurant 表具有 RestaurantCategory 表的外键,因此必须填充其他表才能填充 Restaurant 表。 有关更多信息,请参见如何:指定用于数据生成的表。
在**“文件”菜单上,单击“全部保存”**。
指定数据生成的详细信息
下一步,指定列数据填充方式的详细信息。 有关更多信息,请参见指定为列生成数据的详细信息。
指定数据生成的详细信息
通过执行下列步骤,设置要生成的数据的行数:
在 PartialDGenPlan.dgen 设计器中,单击 Restaurant 表的行。
单击**“相关表”**列,使用下拉箭头指定 RestaurantCategories 表。
单击**“相关表的比率”**列并键入 10:1。
根据这些设置,将为生成的每个类别生成 10 个餐馆。 有关更多信息,请参见如何:指定要生成的行数。
通过执行下列步骤,设置要生成的数据的 Null 行数:
在 PartialDGenPlan.dgen 设计器中,单击 Restaurant 表的行。
在列详细信息窗格中,单击 Description 列的行。
在**“属性”**窗口中,将“null 百分比”属性设置为 10。
根据这些设置,Description 列中 10% 的生成数据将包含 NULL。 可以打开**“数据生成预览”**窗口并验证 Description 列是否包含一些 null 值。
通过执行下列步骤,设置生成的数据的文本:
在 PartialDGenPlan.dgen 设计器中,单击 Restaurant 表的行。
在列详细信息窗格中,单击 Name 列的行。
单击 Generator 列,使用下拉箭头指定 RegularExpression 数据生成器。
在**“属性”**窗口中,按照如下方式设置“表达式”属性:
(Delicious|Golden|Family|Sweet|Dancing|Magic|Thai) (Ginger|Duck|Flower|Potato|Pumpkin|Kitchen|Grill|Onion|Corral)
ProductName 列中生成的数据将包含由两个单词组成的名称。 可以打开**“数据生成预览”**窗口并验证 Name 列是否包含随机生成的餐馆名称。 有关更多信息,请参见正则表达式生成器。
在**“文件”菜单上,单击“全部保存”**。
运行生成数据的计划
最后,运行数据生成计划。 生成数据之后,可以使用其他工具登录数据库,验证新数据。
运行生成数据的计划
在**“解决方案资源管理器”**中,双击“PartialDGenPlan.dgen”。
提示
必须打开数据生成计划。 如果未打开该计划,则无法生成数据。
在**“数据”菜单上,指向“数据生成器”,然后单击“生成数据”**。
将出现**“连接到数据库”**对话框。
在**“数据生成连接信息”列表中,指定与在此演练前面的步骤中部署的数据库的连接,然后单击“确定”**。
提示在插入新行之前清除表内容时,单击**“是”**。
将生成数据。 在“填充”窗口中,将用数据生成的状态更新状态列。 状态栏汇总了所有表的数据生成。
(可选)使用其他工具登录数据库。 可以将 Visual Studio 高级专业版中提供的 Transact-SQL 编辑器用于此步骤。 有关更多信息,请参见 Microsoft 网站上的 Editing Database Scripts and Objects with the Transact-SQL Editor(使用 Transact-SQL 编辑器编辑数据库脚本和对象)。 通过运行以下查询查看新数据:
use DinnerNowDataGenerator select * from [dbo].[RestaurantCategory] select * from [dbo].[Restaurant]
验证为 Restaurant 表生成的行数是否是为 RestaurantCategory 表生成的行数的 10 倍。 验证 Restaurant 表中的 Description 列是否包含 NULL 值。 验证 Restaurant 表中的 Name 列是否包含与您指定的正则表达式匹配的数据。
后续步骤
通常,将为数据库中的其他列和表配置数据生成。 完成该配置后,通过选中项目并在版本控制中包括数据生成计划,使项目可供团队使用。 有关更多信息,请参见向版本控制中添加文件。