3

私のクエリは、変数 DefaultDataPath と DefaultLogPath を初期化するために、ハードコードされていないファイルの場所を使用することに関するものです。データベース プロジェクトを標準の配置およびデータベース管理ツールとして採用し、既存のスクリプトをデータベース プロジェクトに移行する前に、データベースのセットアップに CREATE および INITIALIZE スクリプトのセットを使用していました。次の SQL クエリを使用して、FILE の場所でデータベースを作成しています。

SET @data_path = (SELECT SUBSTRING(filename, 1, CHARINDEX(N'master.mdf', LOWER(filename)) - 1) 

          FROM sys.sysaltfiles WHERE dbid = 1 AND fileid = 1);

set @mdb_file=@data_path + 'CF_DB.mdf'
set @cfdata='CF_DB_Data'
set @cflog='CF_DB_Log'
set @ldf_file=@data_path + 'CF_DB_log.ldf'
declare @sql nvarchar(500)
set @sql = 'CREATE DATABASE [CF_DB]  ON (NAME = ' + quotename(@cfdata) + ',FILENAME =' + quotename(@mdb_file) + ',SIZE = 53, FILEGROWTH = 10%) LOG ON (NAME =' + quotename(@cflog) + ',FILENAME = ' + quotename(@ldf_file) + ', SIZE = 31, FILEGROWTH = 10%)COLLATE SQL_Latin1_General_CP1_CI_AS'
exec(@sql)

ここでは、MASTER DB の MDF ファイルの場所を特定し、同じ場所を使用して CREATE DATABASE を作成しようとしています。

問題: 生成されたスクリプト (展開アクションの後) には、自動生成された SQLCMD 変数があり、いくつかの既定のパス (ハードコードされたもの) または空の文字列 (SQL Server 2008 または 2005 で使用される既定のデータファイル パスを使用) で初期化されます。

:setvar DatabaseName "CF"
:setvar DefaultDataPath "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER2008\MSSQL\DATA\"
:setvar DefaultLogPath "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER2008\MSSQL\DATA\"

既存のシステムのように機能させる必要があります。MASTER DB データとログ ファイルのパスを把握し、同じパスを使用して DefaultDataPath と DefaultLogPath を初期化する必要があります。データベースの設定は、最終的なデプロイ スクリプトに PreDeploymentScript を埋め込む前に、データベース プロジェクトによって生成されたスクリプトによって行われるため、PreDeployment スクリプトを使用することはできません。

次の大きな問題: 開発者は、DB プロジェクトによって生成されたスクリプトを実行するために、SQL Server Management Studio で SQLCMD モードに切り替える必要があります。これは、DATBASE のセットアップに SQLCMD モードを使用しないという実装チームの要件です。これらのステップを克服するには、生成された SQL ファイルを変更し、SQLCMD 変数の代わりに SQL 変数を使用する必要があります。クリーンな SQL ステートメントを生成し、自動化スクリプトの生成をそのまま維持することはできますか? これらの問題は両方とも相互に関連していることを知っているため、一方の解決策はもう一方の解決策になります。

上記の議論について、良い提案や助けをありがとう。

よろしく

スメット

4

2 に答える 2

0

ファイル パスをどのように処理するのが最適かはわかりませんが、デフォルトのファイル パス設定を使用せずに、変数を介して制御できる新しいファイル パスを使用することをお勧めします。

開発者にローカルマシンを簡単に更新させようとしているように思えます。私の推奨事項は、次のことを行うバッチ ファイルを作成することです。

  • MSBuild.exe の場所を含むように PATH を設定します。
  • マスター データベースの場所を取得する
  • その場所を変数に渡します
  • MSBuild コマンドを実行して、パス変数をローカル マスター パスに設定し、データベース/変更を公開します。

全体として、それは本当に価値があるというよりも、より多くの問題のように聞こえます. すべての開発者に SQL スクリプトを送信して、デフォルトのデータ/ログ パスを適切に設定し、デフォルトのみを使用するようにすることをお勧めします。

MSBuild コマンドを実行するバッチ ファイルの設定を検討することをお勧めします。開発者がスクリプトを生成してローカルで実行しなくても、データベースのビルドを開発者に提供するのがはるかに簡単になります。または、SSMS の既定値を変更して、接続の SQLCMD モードをオンに設定することもできます。SSDT は、SQLCMD モードをオンにしないとまったく実行されないため、これを少し改善しました。VS2008/VS2010 DBProjects から多くの混乱を取り除きました。

DB プロジェクトを行っていたときに、次のようなものを使用してビルドおよびデプロイしました。

msbuild /m .\MyDB\MyDB.dbproj /t:build
msbuild /m .\MyDB\MyDB.dbproj /t:deploy /p:TargetConnectionString="Data Source=localhost;Integrated Security=True;Pooling=False;" /p:TargetDatabase="MyDB"
于 2013-05-01T14:58:21.520 に答える