12

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 は元のデータベースの名前です (つまり、開発中に展開するデータベースであり、データベース プロジェクトのプロジェクト プロパティで設定されます)。これは、その正確なパスがターゲット マシン上で異なる可能性があるため、またはそのデータベースが既に存在するために私のマシン上であるために、展開が失敗する場所です。

これらの値は、生成されたスクリプトでハードコーディングされているように見えます。

4

2 に答える 2

5

これは、Database Schema Synchronization -> Database Projectを実行しているときに発生する可能性があります。(私の環境はVS2010 Enterprise RTMです)。

生成された ALTER DATABASE ステートメントは、置換値を考慮せずにソースデータベースをミラーリングするために生成されます (初期データベース サイズなども含まれます)。この問題は、最初のデータベース インポートでは発生しません。

以下にあるファイルを編集します...

スキーマ オブジェクト\データベース レベル オブジェクト\ストレージ\ファイル

$(DefaultDataPath)$(DatabaseName).mdf...そして、必要に応じて正しい/$(DefaultLogPath)$(DatabaseName)_log.ldf値 (またはその他)を含むように修正します。(スキーマ比較でそれらを「スキップ」としてマークします:-P)

上記の「修正」により、値を外部に保持することが再び機能し、そのようなプロパティを管理するための推奨される方法になります。

ハッピーコーディング。

于 2010-12-30T23:52:04.383 に答える
1

あなたの編集に基づいて、おそらくこれは役に立ちます。 https://blogs.msdn.com/gertd/Default.aspx?p=7

変数の追加

これまで、物事がどのように機能するかを見てきましたが、今度はいくつかの新しい変数を追加して、それらを機能させるときです。変数が役立つ場所の1つは、ファイルを定義するデプロイメント後のファイル、storage.sqlです。変数を使用すると、ロケーション環境を依存させることができます。

ストレージファイル内には、次のようなものがあります。

IF NOT EXISTS(SELECT 1 FROM dbo.sysfiles WHERE name ='fgdb_data')BEGIN ALTER DATABASE [$(databasename)] ADD FILE(NAME = N'fgdb_data'、FILENAME = N'C:\ Program Files \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ DATA \ fgdb_data.ndf'、MAXSIZE = 100MB、FILEGROWTH = 10MB)TO FILEGROUP [TABLES] END

これをパラメータ化して、ドライブとディレクトリが変数を介して次のように抽象化されるようにすることができます。

:setvarドライブ "C:":setvarディレクトリ "Program Files \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ DATA"

IF NOT EXISTS(SELECT 1 FROM dbo.sysfiles WHERE name ='fgdb_data')BEGIN ALTER DATABASE [$(databasename)] ADD FILE(NAME = N'fgdb_data'、 FILENAME = N'$(drive)\ $(directory)\ fgdb_data.ndf'、 MAXSIZE = 100MB、FILEGROWTH = 10MB)TO FILEGROUP [TABLES] END

スクリプトをパラメーター化したので、次に変数をプロジェクトファイルの一部にしたいので、:setvarステートメントを使用してコード内のさまざまな場所に散らばるのではなく、単一の場所で定義します。

申し訳ありませんが、私は東ドイツを自分で学び始めたばかりですが、これに対する答えが必要です。

于 2009-04-28T04:23:30.927 に答える