web-dev-qa-db-ja.com

LocalDB v14がmdfファイルの間違ったパスを作成する

最近、SQL Server Expressインストーラーとこの 手順 を使用してLocalDBをバージョン13から14にアップグレードしました。インストール後、バージョン13の既存のデフォルトインスタンス(MSSQLLOCALDB)を停止して、v14.0.1000サーバーエンジンを自動的に使用する新しいインスタンスを作成しました。

私はデータベース統合テストにLocalDBをよく使用します。つまり、xunitテストでは、テストが終了すると削除される(一時的な)データベースを作成します。新しいバージョン以降、残念ながら次のエラーメッセージのためにすべてのテストが失敗します。

物理ファイル 'C:\ Users\kepflDBd0811493e18b46febf980ffb8029482a.mdf'を開くか作成しようとしたときに、CREATE FILEでオペレーティングシステムエラー5(アクセスが拒否されました)が発生しました

奇妙なことに、mdfファイルのターゲットパスが正しくなく、C:\ Users\kepflDBd0811493e18b46febf980ffb8029482a.mdf(これは単一のテストのランダムデータベース名です)。データベースは単純なコマンドCREATE DATABASE [databaseName]を使用して作成されます-ここでは特別なことは何もありません。

SSMSで、データ、ログ、およびバックアップのターゲットの場所は次のとおりです。

LocalDB target locations

しかし、場所を更新しようとすると、別のエラーメッセージが表示されます。

Error message when trying to update

デフォルトの場所を更新して、LocalDBがデータベースを再度作成できるようにするにはどうすればよいですか?LocalDBがデフォルトの場所のディレクトリとデータベースを正しく組み合わせていないことは明らかですファイル名-編集できるレジストリエントリはありますか?または他に何か?

Dougの回答とsepupicのコメントの後に更新

このStackoverflowの質問 によると、デフォルトの場所もレジストリを介して変更できるはずです。ただし、対応するキー「DefaultData」、「DefaultLog」、「BackupDirectory」を見つけようとすると、レジストリでそれらを見つけることができません。 SQL Server v14はこれらのレジストリキーの名前を変更しましたか、それともこれらの情報をレジストリから移動しましたか?

37
feO2x

[〜#〜]更新[〜#〜]

SQL Server 2017のCU 6以降、このバグは修正されています。以下を正常に実行できるようになりました。

_CREATE DATABASE [CreateDatabaseTest];
DROP DATABASE [CreateDatabaseTest];
_

問題、およびCU6で修正されたという事実は、次のKB記事に記載されています。
FIX:SQL Server 2017 Express LocalDBでデータベースを作成しようとすると「アクセスが拒否されました」エラー

累積的な更新を取得するには、次のページに移動して、最上位(つまり最新)のビルドを取得してください。これは、これが表示されるタイミングによってはCU6よりも新しい場合があります。

SQL Server 2017ビルドバージョン


SQL Server 2017 CU6で廃止された情報(2018年4月17日リリース)

パス+ファイル名の組み合わせにバックスラッシュがないことは、SQL Server 2017のバグのようです。私は自分でそれに遭遇しました。レジストリを編集して、次のキーの両方にC:\ Users\MyAccountName \DefaultData文字列値を追加してみました( 3つのデフォルトパスは、私が調べたLocalDBレジストリキーのいずれにもありません):

  • Computer\HKEY_CURRENT_USER\Software\Microsoft\Microsoft SQL Server\UserInstances\{some-GUID-value}
  • Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL14E.LOCALDB\MSSQLServer

そして、はい、両方の試みでLocalDBインスタンスをシャットダウンして再起動しました。

ただし、デフォルトのパスを変更できないのはバグであり、ドキュメントとエラー処理の組み合わせが悪いため、バグだとは思いません。 SQL Server LocalDBバージョン2014、2016、2017のデフォルトの場所を編集しようとしたところ、まったく同じエラーが発生しましたが、RegCreateKeyEx()からのものであるため、それ自体は奇妙ですファイルシステムではなく、レジストリを処理する必要があります。

使用するファイルを指定せずに新しいデータベースを作成するときにバックスラッシュがないため、パスを変更できないのは残念です。ただし、次のように完全な_CREATE DATABASE_構文を使用して新しいデータベースを作成できました。

_CREATE DATABASE [XXXXX]
 CONTAINMENT = NONE
 ON PRIMARY 
( NAME = N'XXXXX_sys', FILENAME = N'C:\Users\MyAccountName\XXXXX_sys.mdf',
  SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB ), 
 FILEGROUP [Tables] DEFAULT
( NAME = N'XXXXX_data', FILENAME = N'C:\Users\MyAccountName\XXXXX_data.ndf',
  SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
 LOG ON 
( NAME = N'XXXXX_log', FILENAME = N'C:\Users\MyAccountName\XXXXX_log.ldf',
  SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
 COLLATE Latin1_General_100_CS_AS_KS_WS_SC;
GO
_
25
Solomon Rutzky

私は同じ問題に遭遇し、明らかな欠点がないはずの回避策を見つけました(私が何かを忘れている場合は、私を修正してください)。これはSolomonsの回答に基づいていますが、データベースファイルへの絶対パスを直接指定する必要はありません。

DECLARE @databaseName NVARCHAR(MAX) = 'MyDatabase'

DECLARE @dataFilePath NVARCHAR(MAX) = CAST(SERVERPROPERTY('InstanceDefaultDataPath') AS NVARCHAR) 
    + FORMATMESSAGE('\%s.mdf', @databaseName)

DECLARE @sql NVARCHAR(MAX) = FORMATMESSAGE(
    'CREATE DATABASE %s ON PRIMARY ( NAME = %s, FILENAME = ''%s'' )', 
    quotename(@databaseName), quotename(@databaseName), @dataFilePath
)

EXEC (@sql)

動的SQLを使用しており、正確ではありませんが、問題に対する正式な修正が行われるまで、その仕事は完了です。

5

私もこの問題に直面しています。私が見つけた唯一の回避策は、Everyone(またはそのようなもの)にc:\Users\への書き込みアクセスを許可し、必要な場所にmdfファイルを作成させることです。

4
abatishchev

この問題について簡潔に説明していただきありがとうございます。昨日、同じ問題に遭遇しました。私はまだ恒久的な解決策を見つけていませんが、これが私の現在の回避策です。

Database.EnsureCreated()関数を使用してデータベースを作成しています。

接続文字列を設定して、「AttachDBFilename =」設定を含めます。

Server=(LocalDB)\\MSSQLLocalDB;Database=ExploreCalifornia;AttachDbFilename=.\\ExploreCalifornia.mdf;Trusted_Connection=True;MultipleActiveResultSets=true

アプリケーションを実行します。エラーが発生します:

ファイル '。\ ExploreCalifornia.mdf'をデータベース 'ExploreCalifornia'として添付できません。

しかし、それはデータベースを作成します。

その後、接続文字列を変更し、「AttachDBFilename =」を削除します。

 Server=(localdb)\\MSSQLLocalDB;Database=ExploreCalifornia;Trusted_Connection=True;MultipleActiveResultSets=true

エラーなしでアプリケーションを再度実行すると、テーブルが作成されました。

2
Doug Abrahamson