更新:2007 年 11 月
在本演练中,您将设置独立开发环境,使每位数据库开发人员都可在不影响团队其他成员的情况下进行更改并对更改进行测试。独立数据库开发环境基于包含成品数据库中所有对象的定义的数据库项目。您将创建项目,从成品数据库中导入数据库架构,并配置数据库项目设置。您将创建一个数据生成计划,然后将该数据库项目及其关联的所有文件都置于版本控制之下,以便与团队共享。
在本演练中,由您定义团队中每位开发人员进行其开发工作所使用的环境,因而您是在担当管理角色。在每位开发人员完成工作项之前,他或她会使用数据生成器将真实但虚设的数据置于更新的架构中,然后运行数据库单元测试以验证架构更改是否按预期效果正常运行。当完成工作项时,每位开发人员会将其所做的更改签入到版本控制中,团队可以从版本控制中获得这些更改。通过在签入更改前运行测试,团队的每个成员都在最大程度上降低对整体工作成果构成的风险。
本演练涉及以下任务:
- 如何使用“新建数据库项目向导”来创建数据库项目。 
- 如何运行“新建数据库项目向导”来导入数据库架构、指定数据库项目属性以及指定生成和部署属性。 
- 如何检查导入操作的结果。 
- 如何创建数据生成计划并对其进行自定义,以生成更真实的测试数据。 
- 如何将项目添加到版本控制中。 
先决条件
必须已安装 Visual Studio Team System Database Edition 并且具有对 Microsoft SQL Server 2005 的 AdventureWorks 示例数据库的访问权限。若要将项目添加到版本控制中,必须已经安装了版本控制软件,例如 Visual Studio Team System Team Foundation Server。
有关如何安装 AdventureWorks 示例数据库的信息,请参见 Microsoft 网站上的“Installing AdventureWorks Sample Databases and Samples”(安装 AdventureWorks 示例数据库和示例)。
创建数据库项目
- 在“文件”菜单上指向“新建”,再单击“项目”。 - 将出现“新建项目”对话框。 
- 在“项目类型”中,展开“数据库项目”节点,然后单击“Microsoft SQL Server”。 
- 在“模板”列表中单击“SQL Server 2005 向导”。 
- 在“名称”中键入“AdvWorksSandbox”。 
- 接受默认的“位置”和“解决方案名称”。 
- 如果“创建解决方案的目录”复选框尚未选中,则选择该复选框。 
- 如果“添加到源代码管理”复选框尚未清除,则清除该复选框,并单击“确定”。 - 将出现“新建数据库项目向导”。接下来,您将使用该向导配置数据库项目并导入初始数据库架构。 
配置项目并导入数据库架构
- 阅读“欢迎”页之后,单击“下一步”。 
- 由于 AdventureWorks 数据库包含多个架构中的对象,因此请选择“按架构组织我的项目”复选框。 .gif) 重要说明: 重要说明:- 创建了项目后,将无法更改其组织方式。 
- 在“指定在数据库项目中创建的对象使用的默认架构”中键入“HumanResources”。 
- 在“设置数据库选项”页上,接受默认设置,并单击“下一步”。 .gif) 说明: 说明:- 您可以在创建项目后更改这些选项。有关更多信息,请参见如何:为生成和部署配置数据库项目。 
- 在“导入数据库架构”页上,选中“导入现有架构”复选框。 
- 在“源数据库连接”中单击包含 AdventureWorks 数据库的服务器和数据库所对应的连接。如果该连接尚不存在,则单击“新建连接”来创建它。如果不指定连接,则将创建数据库项目但不导入任何架构。 .gif) 说明: 说明:- 如果数据库项目尚不包含数据库对象,则可在以后导入数据库架构。有关更多信息,请参见如何:导入数据库架构。 
- 接受默认的导入选项,然后单击“下一步”。 
- 在“配置生成/部署”页上的“目标连接”中,单击“浏览”按钮,并指定要用来创建独立开发环境的数据库服务器的连接。 
- 如果尚未指定目标数据库名称,请在“目标数据库名称”中键入“AdvWorksSandbox”。 
- 在“默认部署排序规则”中,单击“使用源项目的排序规则”。 - 此步骤将使目标数据库使用数据库项目的排序规则。 
- 清除“如果可能发生数据丢失则阻止增量部署”复选框。 - 由于独立开发环境将只包含生成的测试数据,因此可以允许数据丢失发生。 
- 单击“完成”创建数据库项目并导入数据库。 
检查产生的项目
- 在“解决方案资源管理器”中展开“AdvWorksSandbox”节点,再展开“架构对象”子节点。 
- 浏览层次结构中“架构对象”节点下的子节点。 - “解决方案资源管理器”包含一些特定的文件,这些文件定义了被导入数据库的数据库架构中的对象。 
- 在“架构视图”中展开“AdvWorksSandbox”节点。 
- 浏览层次结构中“AdvWorksSandbox”节点下的子节点。 - “架构视图”包含“解决方案资源管理器”中显示的文件中定义的对象。 
- 在“解决方案资源管理器”中单击“AdvWorksSandbox”节点。 
- 在“项目”菜单上,单击“AdvWorksSandbox 属性”。 
- 在“属性”页上,单击“生成”选项卡。 
- 如果尚未指定目标数据库名称,请在“目标数据库名称”中键入“AdvWorksSandbox”。 
- 在“文件”菜单上,单击“保存选定项”。 - 每个开发人员需指定将承载数据库副本的数据库服务器的连接字符串。 
将项目部署到独立开发环境
- 在“解决方案资源管理器”中单击“AdvWorksSandbox”节点。 
- 在“生成”菜单上单击“部署 项目名称”。 - 将为数据库项目生成一个生成脚本,然后将该脚本部署到您选择承载独立开发环境的数据库服务器上。部署完成后,“输出”窗口中将显示“部署已成功”。 - 接下来,您将指定数据生成计划,以使用真实的测试数据来填充独立开发数据库。 
生成测试数据
既然您已经拥有一个可进行开发的独立数据库,您需要可以驱动单元测试的测试数据。首先,创建一个默认数据生成计划,然后对该计划进行自定义,使其生成更加真实的数据。在此示例中,您仅为数据库中表和列的子集配置数据生成。您将为“Employee”表和“StateProvince”表配置数据生成。
“StateProvince”表中的原始数据不是敏感数据,因此可以使用该原始数据填充独立开发数据库。
但是,应对“Employee”表的默认生成计划进行下列更改:
- “Title”应为下列内容之一:Developer、Sr. Developer、Tester、Sr. Tester、Project Manager、Sales Associate 或 Sr. Sales Associate。 
- “Birthdate”必须至少在 18 年以前,但不能早于 1930 年 1 月 1 日。此规范与数据库中该列的约束相匹配。 
- “Marital Status”必须为“M”或“S”。 
- “Gender”必须为“M”或“F”。 
- “HireDate”不得晚于当天日期,也不能早于 2000 年 1 月 1 日。 
- “VacationHours”应在 -10 到 160 这一范围内正态分布。 
- “ModifiedDate”不得晚于当天日期,也不能早于 2000 年 1 月 1 日。大多数记录都将是近期更新的记录。 
- “Contact”表中的“AdditionalContactInfo”必须来自源 AdventureWorks 数据库。 
创建数据生成计划
- 在“解决方案资源管理器”中展开“AdvWorksSandbox”节点,然后单击“数据生成计划”文件夹。 
- 在“项目”菜单上单击“添加新项”。 - 即会出现“添加新项”对话框。 
- 在“模板”列表中单击“数据生成计划”。 
- 在“名称”中键入“AWGenPlan.dgen”,然后单击“添加”。 - 将向数据库项目中添加一个名为 AWGenPlan 的数据生成计划并在编辑器中打开该计划。数据库架构也导入数据生成计划中。接下来,您将修改该计划,使其生成更加真实的测试数据。 
将数据生成限制到相关表
- 右击数据生成计划,再单击“从数据生成中排除所有表”。 
- 在数据生成计划中选中下列表对应的复选框:HumanResources.Employee、Person.Contact、Person.CountryRegion 和 Person.StateProvince。 - 接下来,您将为“StateProvince”表定义数据生成计划。 
为“StateProvince”表定义数据生成计划
- 单击数据生成计划中的“[Person].[StateProvince]”。 
- 在“数据”菜单上,指向“数据生成器”,然后单击“列详细信息”。 - 将出现“列详细信息”窗口,其中显示“[Person].[StateProvince]”表的各个列、列的数据类型、与每个列关联的默认生成器以及生成器结果。 
- 在“列详细信息”窗格中单击“StateProvinceCode”,然后将“生成器”字段设置为“数据绑定生成器”。 - 此步骤表明要使用查询结果来填充此列。 
- 在“视图”菜单上单击“属性窗口”。 
- 在“属性”窗口的“生成器”部分中的**“连接信息”**属性中,单击在前面的过程中从中导入数据库架构的数据库所对应的连接。 - 此步骤指定在运行将为此列生成数据的查询时要使用的数据库连接。 
- 在“属性”窗口的“生成器”部分中的**“选择查询”**属性中,将查询字符串设置为 SELECT [StateProvinceCode] FROM [Person].[StateProvince]。 
- 在“列详细信息”窗格中 StateProvinceCode 的“生成器输出”字段中,单击“[OutputTable1].[StateProvinceCode]”。 - 此步骤在结果集中选择要与此列关联的列。 
- 在“列详细信息”窗格中,单击“修改日期”。 
- 在“属性”窗口的“生成器”部分中,将 Max 属性设置为今天的日期,这是因为记录不可能已在将来的某个日期修改。 
- 在“属性”窗口中的“生成器”部分中,将 Min属性设置为 1/1/2000 12:00:00 AM。在本示例中,假定公司从 2000 年伊始便开始收集数据。 - 接下来,您将为“Contact”表指定数据生成计划。 
为“Contact”表定义数据生成计划
- 单击数据生成计划中的“[Person].[Contact]”。 
- 在“数据”菜单上,指向“数据生成器”,然后单击“列详细信息”。 - 将出现“列详细信息”窗口,其中显示“[Person].[Contact]”表的各个列、列的数据类型、与每个列关联的默认生成器以及生成器结果。 
- 在“列详细信息”窗格中单击“AdditionalContactInfo”,然后将“生成器”字段设置为“数据绑定生成器”。 - 此步骤表明要使用查询结果来填充此列。 
- 在“视图”菜单上单击“属性窗口”。 
- 在“属性”窗口的“生成器”部分中的**“连接信息”**属性中,单击在前面的过程中从中导入数据库架构的数据库所对应的连接。 - 此步骤指定在运行将为此列生成数据的查询时要使用的数据库连接。 
- 在“属性”窗口的“生成器”部分中的**“选择查询”**属性中,将查询字符串设置为 SELECT * FROM [Person].[Contact]。 
- 在“列详细信息”窗格中 StateProvinceCode 的“生成器输出”字段中,单击“[OutputTable1].[AdditionalContactInfo]”。 - 此步骤在结果集中选择要与此列关联的列。 
- 在“列详细信息”窗格中,单击“修改日期”。 
- 在“属性”窗口的“生成器”部分中,将 Max 属性设置为今天的日期,这是因为记录不可能已在将来的某个日期修改。 
- 在“属性”窗口中的“生成器”部分中,将 Min属性设置为 1/1/2000 12:00:00 AM。在本示例中,假定公司从 2000 年伊始便开始收集数据。 - 接下来,您将为“Employee”表指定数据生成计划。 
为“Employee”表定义数据生成计划
- 单击数据生成计划中的“[HumanResources].[Employee]”。 
- 在“列详细信息”窗格中单击“Title”,然后将“生成器”字段设置为“RegularExpression”。 
- 在“属性”窗口中的“生成器”部分中,将**“表达式”**属性设置为“(Developer|Sr\.Developer|Tester|Sr\.Tester|Project Manager|Sales Associate|Sr\.Sales Associate)”。 
- 在“列详细信息”窗格中单击“BirthDate”。默认情况下,“生成器”字段会设置为“DateTime”。 
- 在“属性”窗口中的“生成器”部分中,将 Max 属性设置为距当天日期 18 年以前(例如,“10/30/1987 11:59:59 PM”)。另外,将 Min 属性设置为“1/1/1930 12:00:00 AM”。 
- 在“列详细信息”窗格中单击“MaritalStatus”,然后将“生成器”字段设置为“RegularExpression”。 
- 在“属性”窗口中的“生成器”部分中,将**“表达式”**属性设置为“(M|S)”。 
- 在“列详细信息”窗格中单击“Gender”,然后将“生成器”字段设置为“RegularExpression”。 
- 在“属性”窗口中的“生成器”部分中,将**“表达式”**属性设置为“(M|F)”。 
- 在“列详细信息”窗格中单击“HireDate”。默认情况下,“生成器”字段会设置为“DateTime”。 
- 在“属性”窗口中的“生成器”部分中,将 Max 属性设置为当天日期(例如,“10/30/2006 11:59:59 PM”)。另外,将 Min 属性设置为“1/1/2000 12:00:00 AM”。 
- 在“列详细信息”窗格中单击“VacationHours”。默认情况下,“生成器”字段会设置为“SmallInt”。 
- 在“属性”窗口中的“生成器”部分中,将**“分布”**属性设置为“Normal”。 
- 在“属性”窗口中的“生成器”部分中,将 Max 属性设置为 160 并将 Min 属性设置为 -10。 
- 在“列详细信息”窗格中单击“ModifiedDate”。默认情况下,“生成器”字段会设置为“DateTime”。 
- 在“属性”窗口中的“生成器”部分中,将**“分布”**属性设置为“ExponentialInverse”。另外,将 Max 属性设置为当天日期(例如,“10/30/2006 11:59:59 PM”)并将 Min 属性设置为“1/1/2000 12:00:00 AM”。 - 接下来,您将调整要为这些表生成的行数。 
调整要生成的行数
- 单击数据生成计划中的“[Person].[CountryRegion]”。 
- 在“要插入的行”字段中键入 10。 
- 单击数据生成计划中的“[HumanResources].[Employee]”。 
- 在“要插入的行”字段中键入 25。 
- 单击数据生成计划中的“[Person].[StateProvince]”。 
- 在“相关表”字段中单击“[Person].[CountryRegion]”。 
- 在“相关表的比率”字段中键入 2:1。 - 此步骤指定要为 [Person].[StateProvince] 表生成两倍于 [Person].[CountryRegion] 表的行数。 
- 在“文件”菜单上单击“保存 AWGenPlan.dgen”,保存对数据生成计划所做的更改。 
预览数据生成和生成测试数据
如果多次运行数据生成,则 HumanResources.Employee 表包含的触发器可能会影响数据生成。若要在自动测试运行过程中执行数据生成,必须在单元测试中禁用(稍后再启用)这些触发器。
若要在该过程中多次运行数据生成操作,则必须按照在生成数据时禁用和启用 Employee 表中的触发器过程操作。若要仅运行一次数据生成操作,请按照验证数据生成计划的结果过程操作。
预览数据生成和生成测试数据
- 在“数据”菜单上,指向“数据生成器”,然后单击“预览数据生成”。 - “数据生成预览”窗口随即出现,并显示将生成的数据的示例。如果数据符合指定的条件,请继续执行下一步。如果需要调整数据生成计划,请进行适当的更改,然后重复执行此步骤。 
- 在“数据”菜单上,指向“数据生成器”,然后单击“生成数据”。 - “为目标数据库生成数据”对话框随即出现。 
- 在“目标数据库”中,单击到 AdvWorksSandbox 数据库的连接,然后单击“确定”。 
- 当系统询问您“插入新行前是否清除所选表的内容?”时,请单击“是”。 - 数据是根据您的指定生成的。生成完成时,在每一行中将出现一个绿色的选中标记,指示所有数据已成功生成。如果未生成数据,“错误列表”窗口中将出现错误。 
- 跳到验证数据生成计划的结果过程。 
在生成数据时禁用和启用 Employee 表中的触发器
- 在生成数据之前,请打开“数据”菜单,指向“T-SQL 编辑器”,然后单击“新建查询连接”。 
- 如果独立开发环境中的数据库已存在连接,请转到步骤 7。 
- 单击“新建连接”。 - 随即出现“连接属性”对话框。 
- 在“服务器名称”中,键入或单击将数据库部署到的数据库服务器的名称,如 (local)\SQLExpress。 
- 在“登录到服务器”中,单击“使用 Windows 身份验证”。 
- 在“连接到一个数据库”中,单击“选择或输入一个数据库名”,键入“AdvWorksSandbox”,然后单击“确定”。 - 已创建了连接并将其添加到了“连接到数据库”对话框中的列表中。 
- 在“连接到数据库”对话框中,单击与独立开发环境中的数据库对应的连接字符串,然后单击“确定”。 - Transact-SQL (T-SQL) 编辑器随即出现,其中有一个到 AdvWorksSandbox 数据库的活动连接。 
- 单击“确定”。 - Transact-SQL (T-SQL) 编辑器随即出现。 
- 在 T-SQL 编辑器中,键入以下 T-SQL: - DISABLE TRIGGER dEmployee on [HumanResources].[Employee]; DISABLE TRIGGER uEmployee on [HumanResources].[Employee]; GO
- 在 T-SQL 编辑器工具栏上,单击“执行 SQL”。 - 在“消息”选项卡上,将出现以下内容: - /*----------------------------------------- - disable trigger dEmployee on HumanResources.Employee; - disable trigger uEmployee on HumanResources.Employee; - -----------------------------------------*/ 
- 单击包含数据生成计划的窗口。 
- 在“数据”菜单上,指向“数据生成器”,然后单击“预览数据生成”。 - “数据生成预览”窗口随即出现,并显示将生成的数据的示例。如果数据符合指定的条件,请继续执行下一步。如果需要调整数据生成计划,请进行适当的更改,然后重复执行此步骤。 
- 在“数据”菜单上,指向“数据生成器”,然后单击“生成数据”。 - “为目标数据库生成数据”对话框随即出现。 
- 在“目标数据库”中,单击到 AdvWorksSandbox 数据库的连接,然后单击“确定”。 
- 当系统询问您“插入新行前是否清除所选表的内容?”时,请单击“是”。 - 数据是根据您的指定生成的。生成完成时,在每一行中将出现一个绿色的选中标记,指示所有数据已成功生成。如果未生成数据,“错误列表”窗口中将出现错误。 
- 单击 T-SQL 编辑器窗口。 
- 在 T-SQL 编辑器中,将现有语句替换为以下 T-SQL: - ENABLE TRIGGER dEmployee on [HumanResources].[Employee]; ENABLE TRIGGER uEmployee on [HumanResources].[Employee]; GO
- 在 T-SQL 编辑器工具栏上,单击“执行 SQL”。 - 在“消息”选项卡上,将出现以下内容: - /*----------------------------------------- - enable trigger dEmployee on HumanResources.Employee; - enable trigger uEmployee on HumanResources.Employee; - -----------------------------------------*/ - 现在已启用触发器。 
验证数据生成计划的结果
- 在“数据”菜单上,指向“T-SQL 编辑器”,然后单击“新建查询”。 - 将出现“连接到数据库”对话框。 
- 如果在独立开发环境中您的数据库已存在连接,请转到步骤 8。 
- 单击“新建连接”。 - 随即出现“连接属性”对话框。 
- 在“服务器名称”中,键入或单击将数据库部署到的数据库服务器的名称,如 (local)\SQLExpress。 
- 在“登录到服务器”中,单击“使用 Windows 身份验证”。 
- 在“连接到一个数据库”中,单击“选择或输入一个数据库名”,键入“AdvWorksSandbox”,然后单击“确定”。 - 已创建了连接并将其添加到了“连接到数据库”对话框中的列表中。 
- 在“连接到数据库”对话框中,单击与独立开发环境中的数据库对应的连接字符串,然后单击“确定”。 - Transact-SQL (T-SQL) 编辑器随即出现,其中有一个到 AdvWorksSandbox 数据库的活动连接。 
- 在 T-SQL 编辑器中键入以下内容: - SELECT * from HumanResources.Employee;
- 按 F5 运行查询。 - 将出现结果窗格,其中显示数据生成的结果。 
- 在“文件”菜单上单击“关闭”,关闭 T-SQL 编辑器。 - 现在您已定义了数据库项目,从成品数据库中导入了架构,并指定了用于提供实际测试数据的数据生成规则。现在,可以将解决方案置于版本控制之下,以供团队使用。 
使项目可供团队使用
将项目添加到版本控制中
- 在“解决方案资源管理器”中单击“AdvWorksSandbox”节点。 
- 在“文件”菜单上,指向“源代码管理”,然后单击“将解决方案添加到源代码管理”。 - 此时,您将与已安装的版本控制软件进行交互。本演练提供了将项目添加到 Team Foundation Server 的步骤。如果要使用不同的版本控制软件,请替换等效步骤。如果您使用的是 Team Foundation Server,将出现“连接到 Team Foundation Server”对话框。 
- 在“连接到 Team Foundation Server”中,单击包含要将解决方案添加到其中的团队项目的服务器。 .gif) 说明: 说明:- 如果没有可将数据库项目添加到的团队项目,请参见在团队资源管理器中管理团队项目。 
- 在“团队项目”中单击要将数据库项目添加到其中的团队项目,再单击“确定”。 - 将出现“向源代码管理中添加解决方案 AdvWorksSandbox”对话框。 
- 单击“确定”接受默认值。 - 您的数据库项目及其包含的文件将置于版本控制之下。最初,它们仍处于签出状态。只有在您将它们签入后其他团队成员才能访问它们。 
- 在“视图”菜单上,指向“其他窗口”,然后单击“挂起的更改”。 - 将出现“挂起的更改”窗口。 
- 在“注释”字段中键入“初始数据库项目创建、架构导入和数据生成”。 
- 在“挂起的更改”窗口中,单击工具栏上的“签入”。 - 在签入数据库项目及其包含的文件时,将出现“签入进度”对话框。此外,还会更新“解决方案资源管理器”中的图标,以表明文件已签入到版本控制中。 
后续步骤
将数据库项目签入到版本控制中后,下一步便是制定一些质量保证措施,然后再让团队开始更改。在下一个介绍性演练演练:为独立开发环境建立基线中,您将创建单元测试并在独立数据库开发中生成、部署并运行它们。