Baru-baru ini, saya memutakhirkan LocalDB dari versi 13 ke 14 menggunakan penginstal SQL Server Express dan instruksi ini . Setelah instalasi, saya menghentikan instance default yang ada (MSSQLLOCALDB) versi 13 dan membuat yang baru, yang secara otomatis menggunakan mesin server v14.0.1000.
Saya sering menggunakan LocalDB untuk tes Integrasi Basis Data, yaitu dalam tes xunit saya, saya membuat database (sementara) yang dihapus ketika tes selesai. Sejak versi baru, sayangnya semua pengujian saya gagal karena pesan kesalahan berikut:
BUAT FILE menemukan kesalahan sistem operasi 5 (Akses ditolak.) Saat mencoba membuka atau membuat file fisik 'C: \ Users \ kepflDBd0811493e18b46febf980ffb8029482a.mdf'
Yang aneh adalah bahwa path target untuk file mdf tidak benar, backslash hilang antara C: \ Users \ kepfl dan DBd0811493e18b46febf980ffb8029482a.mdf (yang merupakan nama database acak untuk satu tes). Basis data dibuat melalui perintah sederhana CREATE DATABASE [databaseName]
- tidak ada yang istimewa di sini.
Di SSMS, saya melihat bahwa lokasi target untuk data, log, dan cadangan adalah sebagai berikut:
Namun, ketika saya mencoba memperbarui lokasi, saya mendapatkan pesan kesalahan lain:
Bagaimana saya bisa memperbarui lokasi default sehingga LocalDB dapat membuat database lagi? Sudah jelas bahwa LocalDB tidak menggabungkan direktori lokasi default dan nama file database dengan benar - apakah ada entri registri yang dapat saya edit? Atau sesuatu yang lain?
Update setelah jawaban Doug dan komentar sepupic
Menurut pertanyaan Stackoverflow ini , lokasi default juga harus dapat diubah melalui registri. Namun, jika saya mencoba menemukan kunci yang sesuai "DefaultData", "DefaultLog" dan "BackupDirectory", saya tidak dapat menemukannya di registri saya. Apakah SQL Server v14 mengubah nama kunci registri ini, atau memindahkan informasi ini dari registri?
Jawaban:
MEMPERBARUI
Pada CU 6 untuk SQL Server 2017, bug ini telah diperbaiki. Sekarang dimungkinkan untuk menjalankan yang berikut ini dengan sukses:
Masalahnya, dan fakta bahwa itu diperbaiki di CU6, didokumentasikan dalam artikel KB berikut:
PERBAIKI: Kesalahan "Akses ditolak" ketika Anda mencoba membuat database di SQL Server 2017 Express LocalDB
Untuk mendapatkan Pembaruan Kumulatif, silakan kunjungi halaman berikut dan ambil build teratas (yaitu terbaru), yang mungkin lebih baru dari CU6 tergantung pada saat Anda melihat ini:
SQL Server 2017 membangun versi
DI BAWAH INFO OBSOLETE SEBAGAI SQL SERVER 2017 CU6 (Dirilis 2018-04-17)
Kurangnya backslash dalam gabungan Path + Nama file tampaknya menjadi bug dengan SQL Server 2017. Saya hanya berlari sendiri. Saya bahkan mencoba mengedit Registry untuk menambahkan
DefaultData
Nilai string untuk C: \ Users \ MyAccountName \ di kedua Kunci berikut (3 jalur default tidak ada di salah satu kunci registri LocalDB yang saya perhatikan):Dan ya, saya melakukan shutdown dan memulai lagi contoh LocalDB dalam kedua upaya.
Namun, saya tidak yakin bahwa tidak dapat mengubah jalur default adalah bug karena mungkin saja dokumentasi yang buruk dan penanganan kesalahan yang buruk digabungkan. Saya mengatakan ini karena saya baru saja mencoba mengedit lokasi default untuk SQL Server versi LocalDB 2014, 2016, dan 2017, dan semua menghasilkan kesalahan yang sama persis, yang dengan sendirinya aneh karena berasal dari
RegCreateKeyEx()
, yang seharusnya berurusan dengan Registry dan bukan sistem file.Tidak dapat mengubah jalur sangat disayangkan karena kurangnya backslash ketika membuat Database baru tanpa menentukan file yang akan digunakan. Namun, saya dapat membuat Database baru menggunakan
CREATE DATABASE
sintaks lengkap sebagai berikut:sumber
LOG ON
bagian dariCREATE DATABASE
pernyataan itu. File LDF tampaknya dibuat, secara default, di lokasi yang sama dengan file MDF. (Kasus penggunaan kami dari LocalDb terutama untuk digunakan dalam tes otomatis.)Saya mengalami masalah yang sama dan menemukan solusi yang seharusnya tidak memiliki kekurangan yang jelas (jika saya lupa sesuatu, tolong perbaiki saya) . Ini didasarkan pada jawaban Solomon, tetapi tanpa perlu menentukan jalur absolut ke file database secara langsung.
Ini menggunakan sql dinamis dan tidak persis cantik, tetapi menyelesaikan pekerjaan sampai ada perbaikan resmi untuk masalah ini.
sumber
QUOTENAME
ke 2 param dariFORMATMESSAGE
dan menempatkan tanda kutip ganda di sekitar path file:FORMATMESSAGE(N'CREATE DATABASE %s ON PRIMARY ( NAME = %s, FILENAME = "%s" )', QUOTENAME(@databaseName), QUOTENAME(@databaseName), @dataFilePath);
. Tetapi tampaknya berfungsi seperti yang Anda miliki sekarang, jadi beri +1 untuk pendekatan ini. Masih ada kasus untuk pengkodean nama atau melewati jalur: ketika Anda tidak ingin menggunakanUSERPROFILE
root. Tapi Anda bisa membiarkannya di sini dan hanya defaultInstanceDefaultDataPath
jika@Path IS NULL
. :-)Saya menghadapi masalah ini juga. Satu-satunya solusi yang saya temukan adalah memberikan akses tulis
c:\Users\
ke Semua Orang (atau sesuatu seperti itu) dan biarkan ia membuat file mdf di mana pun ia mau.sumber
Terima kasih atas penjelasan singkat Anda tentang masalah ini. Saya mengalami masalah yang sama kemarin. Saya masih belum menemukan solusi permanen, tetapi inilah solusi saya saat ini.
Saya menggunakan fungsi Database.EnsureCreated () untuk membuat database.
Setel string koneksi untuk memasukkan pengaturan ' AttachDBFilename = '.
Jalankan aplikasi. Ini akan menghasilkan kesalahan:
tetapi itu akan membuat database.
Setelah itu, ubah string koneksi dan hapus ' AttachDBFilename = '.
Saya menjalankan aplikasi lagi tanpa kesalahan dan tabel dibuat.
sumber
CREATE DATABASE [databasename]
terhadap LocalDB dan pernyataan ini menyebabkan masalah karena LocalDB salah menggabungkan direktori lokasi default dengan nama database yang dibuat secara acak (lihat paragraf 3 dan 4 pertanyaan saya). Saya perlu cara untuk memperbaiki lokasi default agar masalah penggabungan ini tidak terjadi.AttachDBFilename
.