私のクエリは、変数 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 ステートメントを生成し、自動化スクリプトの生成をそのまま維持することはできますか? これらの問題は両方とも相互に関連していることを知っているため、一方の解決策はもう一方の解決策になります。
上記の議論について、良い提案や助けをありがとう。
よろしく
スメット