演练:创建和部署受版本控制的新数据库

更新:2010 年 7 月

在本演练中,您将创建一个包含两个表和一个存储过程的简单数据库。 此过程要求您创建一个数据库项目,然后在该项目中创建数据库对象,最后生成该项目并将所做的更改部署到数据库服务器。 在创建数据库项目之后,可以通过将数据库项目置于版本控制之下来将数据库架构置于版本控制之下。

本主题不会演示如何部署到生产或预生产环境中。 若要部署到这些类型的环境中,您通常需要使用 VSDBCMD.EXE 实用工具,或者您可能会使用部署脚本进行手动部署。 有关更多信息,请参见下列主题:

本演练的主要步骤如下所示:

  • 创建一个数据库项目。

  • 创建数据库表。

  • 为这些表创建索引、键和约束。

  • 创建两个存储过程。

  • 配置数据库项目属性。

  • 生成数据库项目。

  • 部署数据库项目。

  • 将数据库项目置于版本控制之下。

系统必备

若要执行本演练,您必须以适当的帐户登录,该帐户应具有在运行 SQL Server 2008 的数据库服务器上创建数据库的权限。

创建数据库项目

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

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

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

    提示

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

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

  4. 在**“名称”**中,键入“OrdersDB”。

  5. 选中**“创建解决方案的目录”**复选框。

  6. 接受**“位置”“解决方案名称”“添加到源代码管理”的默认值,然后单击“确定”**。

    提示

    此时,可以将该解决方案添加到版本控制中。 在本演练中,您会在最后一个过程中将解决方案添加到版本控制系统中。

    新数据库项目“OrdersDB”出现在**“解决方案资源管理器”**中。

  7. 在**“视图”菜单上,单击“数据库架构视图”**。

    如果**“架构视图”**尚未显示,此时将显示该视图。

    接下来,您要向数据库项目中添加架构。

向数据库项目中添加 Sales 架构

  1. 在**“架构视图”**中,展开“OrdersDB”节点,再单击“架构”节点。

  2. 在**“项目”菜单上,单击“添加新项”**。

    将显示**“添加新项”**对话框。

    提示

    也可以在“架构视图”中右击“OrdersDB”项目,指向“添加”,然后单击“架构”

  3. 在**“模板”中,单击“架构”**。

    提示

    “类别”列表中,可以单击“表和视图”以更容易地找到表的模板。

  4. 在**“名称”**中,键入“Sales”作为要指定给新架构的名称。

  5. 单击**“添加”**将架构添加到数据库项目中。

    **“解决方案资源管理器”**会在数据库项目中显示新架构文件。 **“架构视图”**会显示新架构对象。 Transact-SQL 编辑器出现,其中显示新架构的定义。

    接下来将向该数据库项目中添加表。

向数据库项目添加 Customer 表

  1. 在**“架构视图”中,展开“销售”节点,右击“表”节点,指向“添加”,然后单击“表”**。

  2. 在**“名称”**中,键入“Customer”作为要指定给新表的名称。

  3. 单击**“添加”**将该表添加到数据库项目中。

    **“解决方案资源管理器”**会在数据库项目中显示新表的文件。 **“架构视图”**会显示新表对象。 Transact-SQL 编辑器出现,其中显示新表的定义。

  4. 在 Transact-SQL 编辑器中,修改表定义以匹配以下示例:

    CREATE TABLE [Sales].[Customer] (
        [CustomerID] INT IDENTITY (1, 1) NOT NULL,
        [CustomerName] NVARCHAR (40) NOT NULL,
        [YTDOrders] INT NOT NULL,
        [YTDSales] INT NOT NULL
    );
    
  5. 在**“文件”菜单上,单击“保存 Sales.Customer.table.sql”**。

  6. 在**“架构视图”中展开“Sales.Customer”**节点。

  7. 在“Sales.Customer”表中展开**“列”**节点。

    此时将显示 Transact-SQL 编辑器中定义的四个列。

    接下来将向 Customer 表添加主键。

向 Customer 表添加索引

  1. 在**“架构视图”中,右击“Sales.Customer”节点,指向“添加”,然后单击“索引”**。

    将显示**“添加新项”**对话框。

  2. 在**“模板”中,单击“索引”**。

  3. 在**“名称”**中,键入“IX_CustomerCustomerName”作为要指定给新索引的名称。

  4. 单击**“添加”**将该索引添加到“Categories”表中。

    **“解决方案资源管理器”**会在数据库项目中显示新索引的文件。 **“架构视图”**会显示新索引对象。 Transact-SQL 编辑器出现,其中显示新索引的定义。

    提示

    “架构视图”中,您会发现该索引的图标带有一个包含白色“x”的红色圆圈,这表示默认定义包含错误。 此行为是因默认定义引用了不存在的“column_1”列所导致的应有反应。

  5. 在 Transact-SQL 编辑器中,修改索引定义,匹配以下示例:

    CREATE INDEX [IX_CustomerCustomerName]
        ON [Sales].[Customer]
    (CustomerName)
    
  6. 在**“文件”菜单上,单击“保存 Sales.Customer.IX_CustomerCustomerName.index.sql”**。

    图标中的错误指示器即会消失,这表明该索引定义现在已有效。

    接下来将向 Customer 表添加主键。

向 Customer 表添加主键

  1. 在**“架构视图”中,右击“Sales.Customer”节点,指向“添加”,然后单击“主键”**。

    将显示**“添加新项”**对话框。

  2. 在**“模板”中,单击“主键”**。

  3. 在**“名称”**中,键入“PK_CustomerCustomerID”作为要给予新主键的名称。

  4. 单击**“添加”**将该主键添加到 Customer 表中。

    **“解决方案资源管理器”**会在该数据库项目中显示新主键的文件。 **“架构视图”**会显示新主键对象。 Transact-SQL 编辑器出现,其中显示新键的定义。

    提示

    该主键的图标带有一个包含白色“x”的红色圆圈,这表示默认定义包含错误。 此行为是因默认定义引用了不存在的“column_1”列所导致的应有反应。

  5. 在 Transact-SQL 编辑器中,修改主键定义,匹配以下示例:

    ALTER TABLE [Sales].[Customer]
    ADD CONSTRAINT [PK_CustomerCustomerID]
    PRIMARY KEY (CustomerID)
    
  6. 在**“文件”菜单上,单击“保存 Sales.Customer.PK_CustomerCustomerID.pkey.sql”**。

    图标中的错误指示器即会消失,这表明该主键定义现在已有效。

    接下来将添加 Orders 表。

添加 Orders 表

  1. 在**“架构视图”**中单击“OrdersDB”。

  2. 在**“项目”菜单上,单击“添加新项”**。

    将显示**“添加新项”**对话框。

    提示

    也可以在“架构视图”中右击“OrdersDB”项目,指向“添加”,然后单击“表”

  3. 在**“模板”中,单击“表”**。

  4. 在**“名称”**中,键入“Orders”作为要指定给新表的名称。

  5. 单击**“添加”**将该表添加到数据库项目中。

    **“解决方案资源管理器”**会在数据库项目中显示新表的文件。 **“架构视图”**会显示新表对象。 Transact-SQL 编辑器出现,其中显示新表的定义。

  6. 在 Transact-SQL 编辑器中,修改表定义以匹配以下示例:

    CREATE TABLE [Sales].[Orders] (
        [CustomerID] INT NOT NULL,
        [OrderID] INT IDENTITY (1, 1) NOT NULL,
        [OrderDate] DATETIME NOT NULL,
        [FilledDate] DATETIME NULL,
        [Status] CHAR (1) NOT NULL,
        [Amount] INT NOT NULL
    );
    
  7. 在**“文件”菜单上,单击“保存 Sales.Orders.table.sql”**。

  8. 在**“架构视图”中展开“Sales.Orders”**节点。

  9. 在“Sales.Orders”表中展开**“列”**节点。

    此时将显示 Transact-SQL 编辑器中定义的列。

    接下来将向 Products 表添加索引。

向 Orders 表添加主键

  1. 在**“架构视图”中,右击“Sales.Orders”,指向“添加”,然后单击“主键”**。

    将显示**“添加新项”**对话框。

  2. 在“模板”中,单击**“主键”**。

  3. 在**“名称”**中,键入“PK_OrdersOrderID”作为要给予新主键的名称。

  4. 单击**“添加”**将该主键添加到 Orders 表中。

    **“解决方案资源管理器”**会在该数据库项目中显示新主键的文件。 **“架构视图”**会显示新主键对象。 Transact-SQL 编辑器出现,其中显示新主键的定义。

    提示

    该主键的图标带有一个包含白色“x”的红色圆圈,这表示默认定义包含错误。 此行为是因默认定义引用了不存在的“column_1”列所导致的应有反应。

  5. 在 Transact-SQL 编辑器中,修改主键定义,匹配以下示例:

    ALTER TABLE [Sales].[Orders]
        ADD CONSTRAINT [PK_Orders_OrderID] PRIMARY KEY CLUSTERED ([OrderID] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF);
    
  6. 在**“文件”菜单上,单击“保存 Sales.Orders.PK_Orders_OrderID.pkey.sql”**。

    图标中的错误指示器即会消失,这表明该主键定义现在已有效。

    接下来将向 Orders 表添加外键。

在 Orders 表和 Customer 表之间添加外键

  1. 在**“架构视图”中,右击“Sales.Orders”,指向“添加”,然后单击“外键”**。

    将显示**“添加新项”**对话框。

  2. 在**“模板”中,单击“外键”**。

  3. 在**“名称”**中,键入“FK_OrdersCustomer”作为要给予新外键的名称。

  4. 单击**“添加”**将该外键添加到 Orders 表中。

    **“解决方案资源管理器”**会在该数据库项目中显示新外键的文件。 **“架构视图”**会显示新外键对象。 Transact-SQL 编辑器出现,其中显示新外键的定义。

    提示

    该外键的图标带有一个包含白色“x”的红色圆圈,这表示默认定义包含错误。 此行为是因默认定义引用了不存在的“column_1”列所导致的应有反应。

  5. 在 Transact-SQL 编辑器中,修改外键定义,匹配以下示例:

    ALTER TABLE [Sales].[Orders]
        ADD CONSTRAINT [FK_Orders_Customer_CustID] 
        FOREIGN KEY ([CustomerID]) REFERENCES [Sales].[Customer] ([CustomerID]) 
        ON DELETE NO ACTION ON UPDATE NO ACTION;
    
  6. 在**“文件”菜单上,单击“保存 Sales.Orders.FK_OrdersCustomer.fkey.sql”**。

    图标中的错误指示器即会消失,这表明该外键定义现在已有效。

    接下来将向 Products 表添加 CHECK 约束。

向 Orders 表添加 CHECK 约束

  1. 在**“架构视图”中,右击“Sales.Orders”,指向“添加”,然后单击“CHECK 约束”**。

    将显示**“添加新项”**对话框。

  2. 在**“模板”中,单击“CHECK 约束”**。

  3. 在**“名称”**中,键入“CK_OrderStatus”作为要指定给新 CHECK 约束的名称。

  4. 单击**“添加”**将该约束添加到“Products”表中。

    **“解决方案资源管理器”**会在数据库项目中显示新约束的文件。 **“架构视图”**会显示新约束对象。 Transact-SQL 编辑器出现,其中显示新约束的定义。

    提示

    该约束的图标带有一个包含白色“x”的红色圆圈,这表示默认定义包含错误。 此行为是因默认定义引用了不存在的“column_1”列所导致的应有反应。

  5. 在 Transact-SQL 编辑器中,修改约束定义,匹配以下示例:

    ALTER TABLE [Sales].[Orders]
    ADD CONSTRAINT [CK_OrderStatus] 
    CHECK  ([Status] IN ('O','X','F','B'))
    
  6. 在**“文件”菜单上,单击“保存 Sales.Orders.CK_OrderStatus.chkconst.sql”**。

    图标中的错误指示器即会消失,这表明该约束定义现在已有效。

    接下来将向该项目添加两个存储过程。

创建添加客户的存储过程

  1. 在**“架构视图”中的“架构”下,右击“销售”,指向“添加”,然后单击“存储过程”**。

  2. 在**“名称”**中,键入“uspNewCustomer”作为要指定给新存储过程的名称。

  3. 单击**“添加”**将该存储过程添加到数据库项目中。

    **“解决方案资源管理器”**会在该数据库项目中显示新存储过程的文件。 **“架构视图”**会显示新存储过程对象。 Transact-SQL 编辑器出现,其中显示新存储过程的定义。

  4. 在 Transact-SQL 编辑器中,修改存储过程定义,匹配以下示例:

    CREATE PROCEDURE [Sales].[uspNewCustomer]
    @CustomerName NVARCHAR (40)
    AS
    BEGIN
    INSERT INTO [Sales].[Customer] (CustomerName) VALUES (@CustomerName);
    SELECT SCOPE_IDENTITY()
    END
    
  5. 在**“文件”菜单上,单击“保存 Sales.uspNewCustomer.proc.sql”**。

  6. 在**“架构视图”中,展开“可编程性”节点,然后展开“存储过程”**节点。

    Transact-SQL 编辑器中定义的过程随即显示。

    接下来,添加另一个为客户下订单的存储过程。

创建为客户下订单的存储过程

  1. 在**“架构视图”**中单击“OrdersDB”。

  2. 在**“项目”菜单上,单击“添加新项”**。

    将显示**“添加新项”**对话框。

    提示

    也可以在“架构视图”中右击“OrdersDB”项目,指向“添加”,然后单击“存储过程”

  3. 在**“类别”中,展开“数据库项目”,然后单击“可编程性”**。

  4. 在**“模板”中,单击“存储过程”**。

  5. 在**“名称”**中,键入“uspPlaceNewOrder”作为要指定给新存储过程的名称。

  6. 单击**“添加”**将该存储过程添加到数据库项目中。

    **“解决方案资源管理器”**会在该数据库项目中显示新存储过程的文件。 **“架构视图”**会显示新存储过程对象。 Transact-SQL 编辑器出现,其中显示新存储过程的定义。

  7. 在 Transact-SQL 编辑器中,修改存储过程定义,匹配以下示例:

    CREATE PROCEDURE [Sales].[uspPlaceNewOrder]
    @CustomerID INT, @Amount INT, @OrderDate DATETIME, @Status CHAR (1)='O'
    AS
    BEGIN
    DECLARE @RC INT
    BEGIN TRANSACTION
    INSERT INTO [Sales].[Orders] (CustomerID, OrderDate, FilledDate, Status, Amount) 
         VALUES (@CustomerID, @OrderDate, NULL, @Status, @Amount)
    SELECT @RC = SCOPE_IDENTITY();
    UPDATE [Sales].[Customer]
       SET
       YTDOrders = YTDOrders + @Amount
        WHERE [CustomerID] = @CustomerID
    COMMIT TRANSACTION
    RETURN @RC
    END
    
  8. 在**“文件”菜单上,单击“保存 Sales.uspPlaceNewOrder.proc.sql”**。

  9. 在**“架构视图”中,展开“可编程性”节点,然后展开“存储过程”**节点。

    Transact-SQL 编辑器中定义的过程随即显示。

    接下来将在生成和部署该项目之前配置其设置。

配置部署项目的设置

  1. 在**“解决方案资源管理器”**中,单击“OrdersDB”(请单击项目,而非解决方案)。

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

    将显示项目属性窗口。

    提示

    还可以在“解决方案资源管理器”中右击“OrdersDB”,然后单击“属性”

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

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

  5. 单击**“编辑”**指定目标连接。

  6. 指定相应信息,以连接到要向其部署 OrdersDB 数据库的数据库服务器。

  7. 在**“选择或输入一个数据库名”中,键入“OrdersDB”,然后单击“确定”**。

    将用连接字符串填充**“目标连接”。 注意,“目标数据库名称”**设置为“OrdersDB”。

  8. 接受其他选项的默认值。

  9. 在**“文件”菜单上,单击“保存选定项”**。

    将保存该项目的生成设置。

    接下来将生成数据库项目。

生成数据库项目

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

    即会生成数据库项目。 如果成功,会在状态栏中显示**“生成成功”,并会在“输出”**窗口中显示生成结果。

    最后,将部署数据库项目。

将数据库项目部署到数据库服务器

  1. 在**“解决方案资源管理器”**中,单击“OrdersDB”(请单击项目,而非解决方案)。

  2. 在**“生成”菜单上,单击“部署 OrdersDB”**。

    将使用在生成配置中指定的连接部署数据库项目。 随后会在**“输出”**窗口和状态栏中显示“部署已成功”消息。

将数据库项目签入到版本控制中

  1. 在**“解决方案资源管理器”**中单击“OrdersDB”(请单击解决方案)。

  2. 在**“文件”菜单上,指向“源代码管理”,然后单击“将解决方案添加到源代码管理”**。

    此时,您将与已安装的版本控制软件进行交互。 本演练提供了将项目添加到 Team Foundation Server 的步骤。 如果要使用不同的版本控制软件,请替换等效步骤。 如果您使用的是 Team Foundation Server,将出现**“连接到 Team Foundation Server”**对话框。

  3. 在**“连接到 Team Foundation Server”**中,单击包含要将解决方案添加到其中的团队项目的服务器。

    提示

    如果没有可将数据库项目添加到的团队项目,请参见计划和跟踪项目

  4. 在**“团队项目”中,单击要将数据库项目添加到其中的团队项目,再单击“确定”**。

    随即将出现**“向源代码管理中添加解决方案 OrdersDB”**对话框。

  5. 单击**“确定”**接受默认值。

    您的数据库项目及其包含的文件将置于版本控制之下。 最初,它们仍处于签出状态。 只有在您将它们签入后其他团队成员才能访问它们。

  6. 在**“视图”菜单上,指向“其他窗口”,然后单击“挂起的更改”**。

    将出现**“挂起的更改”**窗口。

  7. 在“注释”字段中键入“初始数据库项目创建”。

  8. 在**“挂起的更改”窗口中,单击工具栏上的“签入”**。

    在签入数据库项目及其包含的文件的过程中,将显示**“签入进度”**对话框。 **“解决方案资源管理器”**中的图标将更新,以表明文件已签入到版本控制中。

后续步骤

您可以使用其他演练了解如何使用已部署的现有数据库。

请参见

概念

配置数据库项目和执行测试部署

编写和更改数据库代码

生成数据库并将其部署到临时或生产环境中

修订记录

日期

修订记录

原因

2010 年 7 月

阐明演练目的,并添加旨在涵盖其他部署方案的主题的链接。

客户反馈