我想自动化我维护的服务器实例的构建过程。在版本控制中,我有一个脚本,其中包含我用于在生产中构建实例的每个命令和配置。
现在我想编写一个主构建脚本,将所有这些脚本应用于目标实例。
虽然我尽量保持我的开发环境像生产一样,但有些值总是不同的。要处理此问题,构建脚本应接受特定于环境的值,并将值传递给相关的构建步骤。
服务器实例有一个用户数据库。在生产环境中,用户数据库文件是在我的开发环境中不存在的驱动器上创建的,文件大于我有可用于开发的空间。
当我在生产中设置实例时,我使用了这个脚本。这是我目前在版本控制中的作用:
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
在开发环境中,我可以使用相同的文件组,但我必须为数据库文件使用不同的路径和不同的大小。
我看到了几个解决方案:
ALTER DATABASE
语句。我认为选项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文件会让它变得简单。
其他人可以就解决类似问题提出建议吗?我不确定这是否是我想要的最佳方式。是否有更简单或更好的方法来管理此问题的特定于环境的值?我应该使用一些管理此类事情的工具吗?
答案 0 :(得分:2)
这只是我对这些
的看法
1.为每个环境手动编辑脚本。我真的不能 自动执行此操作,或使用它来跟踪特定于环境的更改 值。
我会建议不要这样做。这允许人们意外地对您不打算触摸的代码进行更改。不是其他人阻止它,但这是最大的风险。
2.为每个环境制作一份脚本副本。我可以根据环境自动选择脚本。这将复制不应该独立更改的事物的规范,就像所有ALTER DATABASE语句一样。
这样可行,但是当服务器发生变化时会遇到问题,并且根据您确定什么是开发服务器或prod服务器的标准,脚本可能会过时。
3.使用脚本变量抽象出特定于环境的值,并在另一个位置定义这些值,如环境配置文件。
这是SSDT,microsoft sql server数据工具项目的工作方式。
还有一种混合方法,你可以通过使用模板参数(至少在sql server中)抽象出环境特定值但没有环境配置文件