3

クエリは、変数DefaultDataPathとDefaultLogPathを初期化するために、ハードコードされていないファイルの場所を使用します。標準のデプロイメントとデータベース管理ツールとしてデータベースプロジェクトを採用し、既存のスクリプトをデータベースプロジェクトに移行する前に、データベースのセットアップにCREATEとINITIALIZEスクリプトのSETを使用しています。私たちは、ファイルの場所にデータベースを作成するには、次のSQLクエリを持っていますDefaultDataPathとDefaultLogPathをプログラムで設定する(SQL文を使用してパスを初期化する)

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

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

set @[email protected]_path + 'CF_DB.mdf' 
set @cfdata='CF_DB_Data' 
set @cflog='CF_DB_Log' 
set @[email protected]_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ファイルの場所を把握しようとしてデータベースを作成するには、同じ場所を使用しています。

問題:SQL Server 2008または2005で使用される既定のデータファイルパスを使用している既定のパス(ハードコードされたもの)または空の文字列で初期化された自動生成SQLCMD変数が、 )。

: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を初期化する必要があります。 PreDeploymentスクリプトは、最終的なDeploy ScriptsにPreDeploymentScriptを埋め込む前にDatabase Projectによって生成されたスクリプトによってデータベース設定が行われるため、実行できません。

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

上記のディスカッションにご協力いただきありがとうございます。

よろしく

Sumeet

答えて

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" 
    
    0

    SSDT/VSは、SQLファイルを生成するとき、それは実際にあなたがそれを言ったサーバーに対していくつかのクエリを実行しますに接続する。ここで設定しているのは...

    :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\" 
    

    パブリッシュファイル/プロファイルで指定したターゲットデータベース接続のサーバー設定から取得されます。マイクロソフト \ HKEY_LOCAL_MACHINE \ソフトウェアの下

    あなたのスクリプトを生成するために使用しているサーバーで

    、オープンregedit.exeをしてキーを検索し、「DefaultLog」と「DefaultData」 - 彼らはにする必要があります同じ場所。スクリプトが生成している設定と一致するかどうか確認してください。

    あなたはサーバー/あなたのPC(あなたが指しているところ)でこれらを変更することができ、あなたはSQLスクリプト生成で入力した場所を生成します。あなたが所有していないサーバーやプロダクション用に使用されているサーバーの周りには自然に注意してください。これは、SQL Serverが新しいデータベースを配置する場所を指すサーバーの設定を変更するためです。これは、SQL Serverのプロパティ - >データベース設定で入力する設定とは異なる設定です。

    希望に役立ちます!

    +0

    SQLCMDの問題を回避するには、代わりにDACPACのデプロイメントを使用できますか? – LeedsDBA

    関連する問題