最近、SQL Server Expressインストーラーとこの 手順 を使用してLocalDBをバージョン13から14にアップグレードしました。インストール後、バージョン13の既存のデフォルトインスタンス(MSSQLLOCALDB)を停止して、v14.0.1000サーバーエンジンを自動的に使用する新しいインスタンスを作成しました。
私はデータベース統合テストにLocalDBをよく使用します。つまり、xunitテストでは、テストが終了すると削除される(一時的な)データベースを作成します。新しいバージョン以降、残念ながら次のエラーメッセージのためにすべてのテストが失敗します。
物理ファイル 'C:\ Users\kepflDBd0811493e18b46febf980ffb8029482a.mdf'を開くか作成しようとしたときに、CREATE FILEでオペレーティングシステムエラー5(アクセスが拒否されました)が発生しました
奇妙なことに、mdfファイルのターゲットパスが正しくなく、C:\ Users\kepflとDBd0811493e18b46febf980ffb8029482a.mdf(これは単一のテストのランダムデータベース名です)。データベースは単純なコマンドCREATE DATABASE [databaseName]
を使用して作成されます-ここでは特別なことは何もありません。
SSMSで、データ、ログ、およびバックアップのターゲットの場所は次のとおりです。
しかし、場所を更新しようとすると、別のエラーメッセージが表示されます。
デフォルトの場所を更新して、LocalDBがデータベースを再度作成できるようにするにはどうすればよいですか?LocalDBがデフォルトの場所のディレクトリとデータベースを正しく組み合わせていないことは明らかですファイル名-編集できるレジストリエントリはありますか?または他に何か?
Dougの回答とsepupicのコメントの後に更新
このStackoverflowの質問 によると、デフォルトの場所もレジストリを介して変更できるはずです。ただし、対応するキー「DefaultData」、「DefaultLog」、「BackupDirectory」を見つけようとすると、レジストリでそれらを見つけることができません。 SQL Server v14はこれらのレジストリキーの名前を変更しましたか、それともこれらの情報をレジストリから移動しましたか?
[〜#〜]更新[〜#〜]
SQL Server 2017のCU 6以降、このバグは修正されています。以下を正常に実行できるようになりました。
_CREATE DATABASE [CreateDatabaseTest];
DROP DATABASE [CreateDatabaseTest];
_
問題、およびCU6で修正されたという事実は、次のKB記事に記載されています。
FIX:SQL Server 2017 Express LocalDBでデータベースを作成しようとすると「アクセスが拒否されました」エラー
累積的な更新を取得するには、次のページに移動して、最上位(つまり最新)のビルドを取得してください。これは、これが表示されるタイミングによってはCU6よりも新しい場合があります。
SQL Server 2017 CU6で廃止された情報(2018年4月17日リリース)
パス+ファイル名の組み合わせにバックスラッシュがないことは、SQL Server 2017のバグのようです。私は自分でそれに遭遇しました。レジストリを編集して、次のキーの両方にC:\ Users\MyAccountName \のDefaultData
文字列値を追加してみました( 3つのデフォルトパスは、私が調べたLocalDBレジストリキーのいずれにもありません):
そして、はい、両方の試みで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
_
私は同じ問題に遭遇し、明らかな欠点がないはずの回避策を見つけました(私が何かを忘れている場合は、私を修正してください)。これは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を使用しており、正確ではありませんが、問題に対する正式な修正が行われるまで、その仕事は完了です。
私もこの問題に直面しています。私が見つけた唯一の回避策は、Everyone(またはそのようなもの)にc:\Users\
への書き込みアクセスを許可し、必要な場所にmdfファイルを作成させることです。
この問題について簡潔に説明していただきありがとうございます。昨日、同じ問題に遭遇しました。私はまだ恒久的な解決策を見つけていませんが、これが私の現在の回避策です。
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
エラーなしでアプリケーションを再度実行すると、テーブルが作成されました。