演练:创建和运行数据生成计划

在本演练中,将创建一个数据生成计划,然后运行该计划来用随机生成的数据填充测试数据库。 首先创建一个数据库项目,然后将其部署到独立的测试数据库。 可以使用独立的数据库测试数据生成,而不影响您的生产数据或数据库。

系统必备

为了完成此演练,必须已安装以下产品:

  • Visual Studio 高级专业版

  • SQL Server 2008 或 SQL Server 2005 

创建数据库项目

首先创建一个数据库项目,并从脚本导入架构。

提示

在团队环境下,可以从版本控制签出现有项目来处理数据库项目。 有关更多信息,请参见开始团队数据库开发

创建数据库脚本

  1. 在**“文件”菜单上指向“新建”,然后单击“文件”**。

    此时将打开**“新建文件”**对话框。

  2. 在**“类别”列表中,如果尚未突出显示“常规”**,请单击它。

  3. 在**“模板”列表中,单击“Sql 文件”,然后单击“打开”**。

    Transact-SQL 编辑器打开。

  4. 复制下面的 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
    
  5. 在**“文件”菜单上,单击“将 SqlQuery_1.sql 另存为”**。

    **“另存文件为”**对话框打开。

  6. 在**“对象名”**中,键入 SampleImportScript.sql。

    可以将文件保存到计算机中的任何位置。 记下该位置,在下面的步骤中将用到它。

  7. 单击**“保存”**。

  8. 在**“文件”菜单上,单击“关闭解决方案”**。

    接下来,创建一个数据库项目,并从已创建的脚本导入架构。

创建数据库项目

  1. 在**“文件”菜单上指向“新建”,再单击“项目”**。

    此时将出现**“新建项目”**对话框。

  2. 在**“已安装的模板”下,展开“数据库”节点,然后单击“SQL Server”**。

    提示

    如果您使用的是 Visual Studio 专业版,请在“已安装的模板”下进行查看,依次展开“数据库”节点和“SQL Server”节点,然后单击“高级”

  3. 在模板列表中单击**“SQL Server 2008 数据库项目”**。

    提示

    如果要部署 SQL Server 2008 之外的服务器,请单击与目标部署环境对应的模板。

  4. 在**“名称”中,键入“WalkthroughDataGenerator”,然后单击“确定”**。

    即会创建一个包含 WalkthroughDataGenerator 空项目的解决方案。 这就是您的数据库项目。 在您使用数据库项目时,其他人都不能对其进行访问。

  5. 在**“解决方案资源管理器”中单击“WalkthroughDataGenerator”**。

  6. 在**“项目”菜单上,单击“导入脚本”**。

  7. 在**“导入 SQL 脚本文件”对话框中,单击“下一步”**。

  8. 在**“文件名”**中,键入在本演练前面的步骤中创建的脚本的路径和文件名。

    或者,也可以单击**“浏览”**查找该脚本文件。

  9. 单击**“完成”**。

    即会导入包含数据库结构定义的脚本。

  10. 导入架构后,单击**“完成”**。

    该数据库架构已导入到您的数据库项目中。 与数据库中的对象对应的项目项显示在**“解决方案资源管理器”“架构视图”**中数据库项目的下面。 接下来,配置、生成项目并将其部署到您的本地开发环境中。

部署到独立开发环境

下一步,将项目部署到新数据库。 此过程创建具有导入的架构、但不包含数据的数据库。 此数据库是一个独立的开发环境,即沙箱,您可以在该环境中开发和测试此数据库。

生成数据库项目

  1. 在**“解决方案资源管理器”中,单击数据库项目“WalkthroughDataGenerator”**。

  2. 在**“项目”菜单上,单击“WalkthroughDataGenerator 属性”**。

    将显示项目属性。

  3. 单击**“部署”**选项卡。

  4. 在**“部署操作”列表中,单击“创建部署脚本(.sql)并部署到数据库”**。

  5. 在**“目标数据库设置”中,单击“编辑”以显示“连接属性”**对话框。

  6. 设置要使用的数据库的连接属性,然后单击**“确定”**。

    **“目标连接”**框用正确的连接字符串填充。

    警告

    应在测试服务器、开发服务器或本地计算机上创建新数据库。 不应使用生产服务器。

  7. 在**“目标数据库名称”**文本框中键入“DinnerNowDataGenerator”。

  8. 在**“文件”菜单上,单击“全部保存”**。

  9. 在**“生成”菜单上,单击“生成解决方案”**。

    当生成项目时,验证是否可以创建 .dbschema 文件且没有错误。 在**“输出”窗口中查看生成状态,可以在最后一行看到“生成: 1 成功或最新”**。

部署数据库项目

  1. 在**“解决方案资源管理器”中,单击数据库项目“WalkthroughDataGenerator”**。

  2. 在**“生成”菜单上,单击“部署 WalkthroughDataGenerator”。 也可以在“解决方案资源管理器”中右击项目,然后单击“部署”**。

    警告

    应对测试服务器、开发服务器或本地计算机运行此部署。 不应使用生产服务器。

    数据库项目部署到新数据库。 在**“输出”窗口中查看部署状态,可以在最后一行看到“部署: 成功 1 个”**。

    提示

    如果未显示“输出”窗口,请打开“视图”菜单,然后单击“输出”

创建数据生成计划

下一步,创建数据生成计划。 数据生成计划包含有关要用数据填充哪些表和列的信息。 有关更多信息,请参见如何:创建数据生成计划

创建数据生成计划

  1. 在**“解决方案资源管理器”中,右击“数据生成计划”节点,指向“添加”,然后单击“数据生成计划”**。

    随即将出现**“添加新项”**对话框。

  2. 在**“名称”**文本框中,键入“PartialDGenPlan.dgen”。

  3. 单击**“添加”**。

    即会创建数据生成计划。 将出现数据生成计划和**“数据生成预览”**窗口。 数据生成计划窗口按横向分为两个窗格。 上面的窗格列出数据库项目架构中定义的表。 下面的窗格显示上面的窗格中突出显示的表的列详细信息。

    提示

    如果“数据生成预览”窗口尚未打开,则可以通过以下操作将其打开:打开“数据”菜单,指向“数据生成器”,然后单击“预览数据生成”。 默认情况下,“数据生成预览”窗口将作为一个选项卡停靠在数据生成计划窗口的底部。 若要展开视图,请单击窗口,然后单击“窗口”菜单上的“以选项卡式文档停靠”。 也可以右击标题栏,然后单击“以选项卡式文档停靠”

  4. 在 PartialDGenPlan.dgen 设计器中,清除所有表的复选框。

    提示

    通过使用“在数据生成中包含所有表”“从数据生成中排除所有表”命令,可以选中或清除所有表的复选框。 通过右击数据生成计划窗口中的任何行,或在“数据”菜单上指向“数据生成器”,可以访问这些命令。

  5. 在 PartialDGenPlan.dgen 设计器中,选中 dbo.Restaurant 表的复选框。

    系统还将自动选中 dbo.RestaurantCategory 表的复选框。 由于 Restaurant 表具有 RestaurantCategory 表的外键,因此必须填充其他表才能填充 Restaurant 表。 有关更多信息,请参见如何:指定用于数据生成的表

  6. 在**“文件”菜单上,单击“全部保存”**。

指定数据生成的详细信息

下一步,指定列数据填充方式的详细信息。 有关更多信息,请参见指定为列生成数据的详细信息

指定数据生成的详细信息

  1. 通过执行下列步骤,设置要生成的数据的行数:

    1. 在 PartialDGenPlan.dgen 设计器中,单击 Restaurant 表的行。

    2. 单击**“相关表”**列,使用下拉箭头指定 RestaurantCategories 表。

    3. 单击**“相关表的比率”**列并键入 10:1。

    根据这些设置,将为生成的每个类别生成 10 个餐馆。 有关更多信息,请参见如何:指定要生成的行数

  2. 通过执行下列步骤,设置要生成的数据的 Null 行数:

    1. 在 PartialDGenPlan.dgen 设计器中,单击 Restaurant 表的行。

    2. 在列详细信息窗格中,单击 Description 列的行。

    3. 在**“属性”**窗口中,将“null 百分比”属性设置为 10。

    根据这些设置,Description 列中 10% 的生成数据将包含 NULL。 可以打开**“数据生成预览”**窗口并验证 Description 列是否包含一些 null 值。

  3. 通过执行下列步骤,设置生成的数据的文本:

    1. 在 PartialDGenPlan.dgen 设计器中,单击 Restaurant 表的行。

    2. 在列详细信息窗格中,单击 Name 列的行。

    3. 单击 Generator 列,使用下拉箭头指定 RegularExpression 数据生成器。

    4. 在**“属性”**窗口中,按照如下方式设置“表达式”属性:

      (Delicious|Golden|Family|Sweet|Dancing|Magic|Thai) (Ginger|Duck|Flower|Potato|Pumpkin|Kitchen|Grill|Onion|Corral)
      

    ProductName 列中生成的数据将包含由两个单词组成的名称。 可以打开**“数据生成预览”**窗口并验证 Name 列是否包含随机生成的餐馆名称。 有关更多信息,请参见正则表达式生成器

  4. 在**“文件”菜单上,单击“全部保存”**。

运行生成数据的计划

最后,运行数据生成计划。 生成数据之后,可以使用其他工具登录数据库,验证新数据。

运行生成数据的计划

  1. 在**“解决方案资源管理器”**中,双击“PartialDGenPlan.dgen”。

    提示

    必须打开数据生成计划。 如果未打开该计划,则无法生成数据。

  2. 在**“数据”菜单上,指向“数据生成器”,然后单击“生成数据”**。

    将出现**“连接到数据库”**对话框。

  3. 在**“数据生成连接信息”列表中,指定与在此演练前面的步骤中部署的数据库的连接,然后单击“确定”**。

  4. 提示在插入新行之前清除表内容时,单击**“是”**。

    将生成数据。 在“填充”窗口中,将用数据生成的状态更新状态列。 状态栏汇总了所有表的数据生成。

  5. (可选)使用其他工具登录数据库。 可以将 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 列是否包含与您指定的正则表达式匹配的数据。

后续步骤

通常,将为数据库中的其他列和表配置数据生成。 完成该配置后,通过选中项目并在版本控制中包括数据生成计划,使项目可供团队使用。 有关更多信息,请参见向版本控制中添加文件

请参见

概念

使用数据生成器生成数据库的测试数据

指定为列生成数据的详细信息

使用单元测试验证数据库代码

用自定义数据生成器生成专用的测试数据