クエリは、変数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
SQLCMDの問題を回避するには、代わりにDACPACのデプロイメントを使用できますか? – LeedsDBA