如何在构建过程中管理特定于环境的值?

时间:2012-09-17 14:41:43

标签: sql-server build-process

我想自动化我维护的服务器实例的构建过程。在版本控制中,我有一个脚本,其中包含我用于在生产中构建实例的每个命令和配置。

现在我想编写一个主构建脚本,将所有这些脚本应用于目标实例。

虽然我尽量保持我的开发环境像生产一样,但有些值总是不同的。要处理此问题,构建脚本应接受特定于环境的值,并将值传递给相关的构建步骤。

服务器实例有一个用户数据库。在生产环境中,用户数据库文件是在我的开发环境中不存在的驱动器上创建的,文件大于我有可用于开发的空间。

当我在生产中设置实例时,我使用了这个脚本。这是我目前在版本控制中的作用:

USE [master]
GO

CREATE DATABASE [QuoteProcessor] ON  PRIMARY (
  NAME = N'System_Data',
  FILENAME = N'G:\SQLData\QuoteProcessor\System_Data.mdf',
  SIZE = 500 MB,
  MAXSIZE = UNLIMITED,
  FILEGROWTH = 10%
),
FILEGROUP [DATA]  DEFAULT (
  NAME = N'QuoteProcessor_Data',
  FILENAME = N'G:\SQLData\QuoteProcessor\QuoteProcessor_Data.ndf',
  SIZE = 600 GB,
  MAXSIZE = UNLIMITED,
  FILEGROWTH = 10%
)
LOG ON (
  NAME = N'QuoteProcessor_Log',
  FILENAME = N'G:\SQLLogs\QuoteProcessor\QuoteProcessor_Log.ldf',
  SIZE = 100 GB,
  MAXSIZE = UNLIMITED,
  FILEGROWTH = 10%
);

ALTER DATABASE [QuoteProcessor] SET COMPATIBILITY_LEVEL = 100
GO

ALTER DATABASE [QuoteProcessor] SET ANSI_NULL_DEFAULT OFF 
GO

ALTER DATABASE [QuoteProcessor] SET ANSI_NULLS OFF 
GO

ALTER DATABASE [QuoteProcessor] SET ANSI_PADDING OFF 
GO

ALTER DATABASE [QuoteProcessor] SET ANSI_WARNINGS OFF 
GO

ALTER DATABASE [QuoteProcessor] SET ARITHABORT OFF 
GO

ALTER DATABASE [QuoteProcessor] SET AUTO_CLOSE OFF 
GO

ALTER DATABASE [QuoteProcessor] SET AUTO_CREATE_STATISTICS ON 
GO

ALTER DATABASE [QuoteProcessor] SET AUTO_SHRINK OFF 
GO

ALTER DATABASE [QuoteProcessor] SET AUTO_UPDATE_STATISTICS ON 
GO

ALTER DATABASE [QuoteProcessor] SET CURSOR_CLOSE_ON_COMMIT OFF 
GO

ALTER DATABASE [QuoteProcessor] SET CURSOR_DEFAULT  GLOBAL 
GO

ALTER DATABASE [QuoteProcessor] SET CONCAT_NULL_YIELDS_NULL OFF 
GO

ALTER DATABASE [QuoteProcessor] SET NUMERIC_ROUNDABORT OFF 
GO

ALTER DATABASE [QuoteProcessor] SET QUOTED_IDENTIFIER OFF 
GO

ALTER DATABASE [QuoteProcessor] SET RECURSIVE_TRIGGERS OFF 
GO

ALTER DATABASE [QuoteProcessor] SET  DISABLE_BROKER 
GO

ALTER DATABASE [QuoteProcessor] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
GO

ALTER DATABASE [QuoteProcessor] SET DATE_CORRELATION_OPTIMIZATION OFF 
GO

ALTER DATABASE [QuoteProcessor] SET TRUSTWORTHY OFF 
GO

ALTER DATABASE [QuoteProcessor] SET ALLOW_SNAPSHOT_ISOLATION OFF 
GO

ALTER DATABASE [QuoteProcessor] SET PARAMETERIZATION SIMPLE 
GO

ALTER DATABASE [QuoteProcessor] SET READ_COMMITTED_SNAPSHOT ON 
GO

ALTER DATABASE [QuoteProcessor] SET HONOR_BROKER_PRIORITY OFF 
GO

ALTER DATABASE [QuoteProcessor] SET RECOVERY SIMPLE 
GO

ALTER DATABASE [QuoteProcessor] SET  MULTI_USER 
GO

ALTER DATABASE [QuoteProcessor] SET PAGE_VERIFY CHECKSUM  
GO

ALTER DATABASE [QuoteProcessor] SET DB_CHAINING OFF 
GO

USE [master]
GO

ALTER DATABASE [QuoteProcessor] SET  READ_WRITE 
GO

在开发环境中,我可以使用相同的文件组,但我必须为数据库文件使用不同的路径和不同的大小。

我看到了几个解决方案:

  1. 为每个环境手动编辑脚本。我无法真正自动执行此操作,或使用它来跟踪特定于环境的值的更改。
  2. 为每个环境制作一份脚本副本。我可以根据环境自动选择脚本。这将复制不应该独立更改的事物的规范,例如所有ALTER DATABASE语句。
  3. 使用脚本变量抽象出特定于环境的值,并在其他位置定义这些值,如环境配置文件。
  4. 我认为选项3是最干净的解决方案。这是我在这里探索的那个。

    例如,我可以使用sqlcmd脚本变量来替换CREATE DATABASE语句:

    CREATE DATABASE [QuoteProcessor] ON  PRIMARY (
      NAME = N'System_Data',
      FILENAME = N'$(PrimaryDataFileFullPath)',
      SIZE = $(PrimaryDataFileSize),
      MAXSIZE = UNLIMITED,
      FILEGROWTH = 10%
    ),
    FILEGROUP [DATA]  DEFAULT (
      NAME = N'QuoteProcessor_Data',
      FILENAME = N'$(UserDataFileFullPath)',
      SIZE = $(UserDataFileSize),
      MAXSIZE = UNLIMITED,
      FILEGROWTH = 10%
    )
    LOG ON (
      NAME = N'QuoteProcessor_Log',
      FILENAME = N'$(LogFileFullPath)',
      SIZE = $(LogFileSize),
      MAXSIZE = UNLIMITED,
      FILEGROWTH = 10%
    );
    

    要在生产中创建数据库,我可以像这样调用脚本:

    sqlcmd -i QuoteProcessor.sql -v PrimaryDataFileFullPath="G:\SQLData\QuoteProcessor\System_Data.mdf" -v PrimaryDataFileSize="500 MB" -v UserDataFileFullPath="G:\SQLData\QuoteProcessor\QuoteProcessor_Data.ndf" -v UserDataFileSize="600 GB" -v LogFileFullPath="G:\SQLLogs\QuoteProcessor\QuoteProcessor_Log.ldf" -v LogFileSize="100 GB"
    

    主构建脚本将从配置文件中读取值并将它们传递给sqlcmd。

    将有一个用于生产的配置文件,一个用于开发;一个适用于我组织中每个不同的环境。

    我还没有决定如何存储特定于环境的值,但我认为INI文件或XML文件会让它变得简单。

    其他人可以就解决类似问题提出建议吗?我不确定这是否是我想要的最佳方式。是否有更简单或更好的方法来管理此问题的特定于环境的值?我应该使用一些管理此类事情的工具吗?

1 个答案:

答案 0 :(得分:2)

这只是我对这些

的看法

 1.为每个环境手动编辑脚本。我真的不能     自动执行此操作,或使用它来跟踪特定于环境的更改     值。

我会建议不要这样做。这允许人们意外地对您不打算触摸的代码进行更改。不是其他人阻止它,但这是最大的风险。

2.为每个环境制作一份脚本副本。我可以根据环境自动选择脚本。这将复制不应该独立更改的事物的规范,就像所有ALTER DATABASE语句一样。

这样可行,但是当服务器发生变化时会遇到问题,并且根据您确定什么是开发服务器或prod服务器的标准,脚本可能会过时。

3.使用脚本变量抽象出特定于环境的值,并在另一个位置定义这些值,如环境配置文件。

这是SSDT,microsoft sql server数据工具项目的工作方式。

还有一种混合方法,你可以通过使用模板参数(至少在sql server中)抽象出环境特定值但没有环境配置文件

http://msdn.microsoft.com/en-us/library/hh230912.aspx