1

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

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

虽然我试图让我的开发环境尽可能像生产环境,但有些价值观总是不同的。为了处理这个问题,构建脚本应该接受特定于环境的值并将这些值传递给相关的构建步骤。

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

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

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. 使用脚本变量抽象出特定于环境的值,并在另一个地方定义这些值,例如环境配置文件。

我认为选项 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 文件会更容易。

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

4

1 回答 1

2

这只是我对这些的看法

1. 为每个环境手动编辑脚本。我不能真正自动化这个,或者用它来跟踪环境特定值的变化。

我建议不要这样做。这允许人们意外地更改您不打算让他们接触的代码。并不是说其他​​人会阻止它,但这会带来最大的风险。

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

这可行,但是当服务器更改时您会遇到问题,并且根据您确定什么是开发服务器或产品服务器的标准,该脚本可能已过时。

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

这就是SSDT和 microsoft sql server 数据工具项目的做法。

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

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

于 2012-09-17T16:07:38.833 回答