保守しているサーバー インスタンスのビルド プロセスを自動化したいと考えています。バージョン管理には、本番環境でインスタンスを構築するために使用したすべてのコマンドと構成を含むスクリプトがあります。
ここで、これらすべてのスクリプトをターゲット インスタンスに適用するマスター ビルド スクリプトを書きたいと思います。
開発環境をできるだけ本番環境に近づけるようにしていますが、常に異なる値がいくつかあります。これを処理するには、ビルド スクリプトは環境固有の値を受け入れ、その値を関連するビルド ステップに渡す必要があります。
サーバー インスタンスには 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 つ作成します。環境に応じてスクリプトの選択を自動化できます。
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 に渡します。
本番用と開発用に 1 つの構成ファイルがあります。組織内の異なる環境ごとに 1 つ。
環境固有の値をどのように保存するかはまだ決めていませんが、INI ファイルまたは XML ファイルを使用すると簡単になると考えていました。
他の誰かが同様の問題を解決するためのアドバイスを提供できますか? これが私がやりたいことをするための最良の方法であるかどうかはわかりません。この問題の環境固有の値を管理するための、より簡単な、またはより適切にサポートされている方法はありますか? この種のことを管理するツールを使用する必要がありますか?