Visual Studio データベース エディションには、vsdbcmd.exe ツールが付属しています。このツールを使用すると、.dbschema ファイル (ビルド時にデータベース プロジェクトによって生成される) をデータベースに配置できます。これは、最初にスクリプトをビルドしてから実行することによって行われます。
vsdbcmd.exe /a:Deploy /cs:"Data Source=(local);Integrated Security=True;Pooling=False" /dsp:Sql /dd /model:"..\Database.dbschema" /p:TargetDatabase=TargetDB /マニフェスト:"..\Database.deploymanifest"
問題なく別のデータベース サーバーにスクリプトを展開できると思います。ただし、実際の .mdf ファイルへの完全なパスは、元のデータベースへの他の参照とともにスクリプトにエンコードされます。これを制御するオプションがないか、見つけられません。
誰かがこれを使用していますか?どのように展開しますか? 別の種類のデータベース プロジェクトを使用する必要がありました (「データベース プロジェクト」と「サーバー プロジェクト」のどちらかを選択したことを覚えていますが、それが重要かどうかはわかりません)。
編集
.sqlcmdvars をうまくオーバーライドできますが、これで問題は解決しません。これは、上記のようなコマンドを使用して生成された .sql ファイルから抽出したものです。
GO
:setvar DatabaseName "TargetDB"
:setvar DefaultDataPath "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\"
そのため、「targetdb」ターゲット データベースが正しく記録されます。しかし、さらに数行:
CREATE DATABASE [$(DatabaseName)]
ON
PRIMARY(NAME = [Original], FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\Original.mdf', SIZE = 3072 KB, MAXSIZE = UNLIMITED, FILEGROWTH = 1024 KB)
LOG ON (NAME = [Original_log], FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\Original_log.ldf', SIZE = 1024 KB, MAXSIZE = 2097152 MB, FILEGROWTH = 10 %)
ここで、Original.mdf は元のデータベースの名前です (つまり、開発中に展開するデータベースであり、データベース プロジェクトのプロジェクト プロパティで設定されます)。これは、その正確なパスがターゲット マシン上で異なる可能性があるため、またはそのデータベースが既に存在するために私のマシン上であるために、展開が失敗する場所です。
これらの値は、生成されたスクリプトでハードコーディングされているように見えます。