1

保守しているサーバー インスタンスのビルド プロセスを自動化したいと考えています。バージョン管理には、本番環境でインスタンスを構築するために使用したすべてのコマンドと構成を含むスクリプトがあります。

ここで、これらすべてのスクリプトをターゲット インスタンスに適用するマスター ビルド スクリプトを書きたいと思います。

開発環境をできるだけ本番環境に近づけるようにしていますが、常に異なる値がいくつかあります。これを処理するには、ビルド スクリプトは環境固有の値を受け入れ、その値を関連するビルド ステップに渡す必要があります。

サーバー インスタンスには 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. 環境ごとにスクリプトのコピーを 1 つ作成します。環境に応じてスクリプトの選択を自動化できます。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 に渡します。

本番用と開発用に 1 つの構成ファイルがあります。組織内の異なる環境ごとに 1 つ。

環境固有の値をどのように保存するかはまだ決めていませんが、INI ファイルまたは XML ファイルを使用すると簡単になると考えていました。

他の誰かが同様の問題を解決するためのアドバイスを提供できますか? これが私がやりたいことをするための最良の方法であるかどうかはわかりません。この問題の環境固有の値を管理するための、より簡単な、またはより適切にサポートされている方法はありますか? この種のことを管理するツールを使用する必要がありますか?

4

1 に答える 1

2

これは私の見解です

1.すべての環境でスクリプトを手動で編集します。これを実際に自動化することも、環境固有の値への変更を追跡するために使用することもできません。

私はこれに反対することをお勧めします。これにより、ユーザーが意図しないコードに誤って変更を加える可能性があります。他の人がそれを防ぐというわけではありませんが、これは最もリスクを歓迎します。

2.環境ごとにスクリプトのコピーを1つ作成します。環境に応じてスクリプトの選択を自動化できました。これにより、すべてのALTER DATABASEステートメントのように、独立して変更してはならないものの仕様が複製されます。

これは機能しますが、サーバーが変更されると問題が発生します。開発サーバーまたは製品サーバーを決定する方法に関する基準に基づいて、スクリプトが古くなっている可能性があります。

3.スクリプト変数を使用して環境固有の値を抽象化し、環境構成ファイルなどの別の場所でそれらの値を定義します。

これは、SSDT、マイクロソフトSQLサーバーデータツールプロジェクトがそれを行う方法です。

テンプレートパラメータを使用して、環境固有の値を抽象化できるが、環境構成ファイルを持たないハイブリッドアプローチもあります(少なくともSQLサーバーでは)

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

于 2012-09-17T16:07:38.833 に答える