Ubah mode database SQLite menjadi baca-tulis

102

Bagaimana cara mengubah database SQLite dari baca-saja menjadi baca-tulis?

Ketika saya menjalankan pernyataan pembaruan, saya selalu mendapat:

Kesalahan SQL: mencoba menulis database hanya-baca

File SQLite adalah file yang dapat ditulis pada sistem file.

pengguna143482
sumber
4
Apakah pengguna yang menjalankan sqlite3 (atau apa pun yang Anda gunakan untuk menjalankan kueri) memiliki izin tulis ke db? Sudahkah Anda memeriksa ulang kepemilikan file?
Pos Tim
1
Saya yakin mereka memiliki izin untuk melakukannya.
pengguna143482
3
Saya telah melihat ini di aplikasi web di mana saya lupa mengatur GID pada file database dan akun "www-data" (yang dijalankan Apache) ditolak akses tulis ke file tersebut.
finnw

Jawaban:

87

Ada beberapa alasan untuk pesan kesalahan ini:

  • Beberapa proses membuka database pada waktu yang sama ( lihat FAQ ).

  • Ada plugin untuk mengompres dan mengenkripsi database. Itu tidak memungkinkan untuk mengubah DB.

  • Terakhir, FAQ lain mengatakan: "Pastikan direktori yang berisi file database juga dapat ditulis oleh pengguna yang menjalankan skrip CGI." Saya rasa ini karena mesin perlu membuat lebih banyak file di direktori.

  • Seluruh sistem file mungkin hanya bisa dibaca, misalnya setelah terjadi crash.

  • Pada sistem Unix, proses lain dapat menggantikan seluruh file.

Aaron Digulla
sumber
27
Saya akan menempatkan tawaran saya pada poin ketiga - direktori yang berisi file DB juga harus dapat ditulis sehingga file kunci dapat dibuat.
Kimvais
1
Peluru pertama untuk saya: D
Vinay
1
Terakhir. Saya selalu lupa sudo: P
Storm
4
Saya dapat menambahkan ke daftar ini: file database diganti selama penggunaan. Saya lebih suka untuk tidak menjelaskan kebodohan yang menyebabkan kesimpulan ini.
Wim Rijnders
1
Ini harus ditandai sebagai jawabannya. Dalam kasus saya (Aplikasi desktop), ini terkait dengan Windows Mengompresi database karena hard disk utama menjadi terlalu rendah dalam ruang. Saya pikir windows akan menanyakan pengguna apakah dia ingin mengompres file untuk mendapatkan ruang jika pengguna mengatakan ya maka masalah database hanya-baca mungkin muncul.
Nandostyle
10

Saya menyelesaikan ini dengan mengubah pemilik dari root ke saya di semua file di / db dir.

Lakukan saja ls -ldi folder itu, jika salah satu filer dimiliki, rootcukup ubah ke Anda, menggunakan:sudo chown user file

Bruno Coelho
sumber
5

Kesalahan ini biasanya terjadi ketika database Anda sudah diakses oleh satu aplikasi, dan Anda mencoba mengaksesnya dengan aplikasi lain.

Geek_shiva
sumber
Mengapa Anda mencoba mengakses database dari database lain?
Peter Mortensen
Saya pikir yang dia maksud dari aplikasi lain
amaurymartiny
4

Jika menggunakan Android.

Pastikan Anda telah menambahkan izin untuk menulis EXTERNAL_STORAGEke Anda AndroidManifest.xml.

Tambahkan baris ini ke AndroidManifest.xmlfile Anda di atas dan di luar <application>tag Anda .

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Ini akan memungkinkan aplikasi Anda untuk menulis ke sdcard. Ini akan membantu jika Anda EXTERNAL_STORAGEadalah tempat Anda menyimpan database di perangkat.

Pranav
sumber
Ini memecahkan masalah saya. Saya memodifikasi pertanyaan agar lebih detail dan lebih mudah dibaca.
prolink007
Terima kasih banyak. itu memecahkan masalah saya juga. satu suara untuk :)
Altaf Sami
4

Di shell perintah Linux, saya melakukan:

chmod 777 <db_folder>

Dimana berisi file database.

Berhasil. Sekarang saya dapat mengakses database saya dan membuat kueri penyisipan.

JLavoie
sumber
Apa implikasi keamanannya?
Peter Mortensen
Apa bedanya dengan jawaban Adrian ?
Peter Mortensen
1
Ini berfungsi sebagai solusi cepat tetapi perlu menggali untuk solusi yang lebih aman nanti
troydo42
4
Ini akan memberikan semua izin kepada semua pengguna, yang mungkin bukan yang Anda inginkan dari sudut pandang keamanan.
Renel Chesak
3

(pesan kesalahan ini biasanya menyesatkan, dan biasanya merupakan kesalahan izin umum)

Di Windows

  • Jika Anda menerbitkan SQL langsung ke database, pastikan aplikasi apa pun yang Anda gunakan untuk menjalankan SQL dijalankan sebagai administrator
  • Jika aplikasi mencoba memperbarui, akun yang digunakan untuk mengakses database mungkin memerlukan izin di folder yang berisi file database Anda. Misalnya, jika IIS mengakses database, IUSR dan IIS_IUSRS mungkin memerlukan izin yang sesuai (Anda dapat mencoba ini dengan memberikan kontrol penuh sementara pada folder ini untuk sementara waktu, memeriksa apakah ini berfungsi, lalu mengikat izin yang sesuai)
Chris Halcrow
sumber
1
Saya harus menjalankan "DB Browser" sebagai administrator.
Eben Roux
1
Saya memberikan "kontrol penuh" ke "Semua Orang" di Windows 10, dan tetap tidak berhasil. Namun, seperti yang dinyatakan @EbenRoux, Anda mungkin juga perlu menjalankan "DB Browser" sebagai Administrator, yang membuatnya berfungsi untuk saya.
damai
2

Saya mengalami masalah ini hari ini juga.

Itu disebabkan oleh ActiveSync di Windows Mobile - folder tempat saya bekerja telah disinkronkan sehingga proses AS mengambil file DB dari waktu ke waktu menyebabkan kesalahan ini.

JRummler
sumber
1

Dari baris perintah, masukkan folder tempat file database Anda berada dan jalankan perintah berikut:

chmod 777 databasefilename

Ini akan memberikan semua izin kepada semua pengguna.

adrian
sumber
23
Itu sangat buruk.
Marco Kerwitz
1
jawaban yang sempurna!
Jitesh Prajapati
1
Ini mungkin menyelesaikan masalah ini tetapi tidak disarankan karena dapat menyebabkan masalah keamanan.
kathir raja
1

Di Linux, berikan izin baca / tulis ke seluruh folder yang berisi file database.

Selain itu, SELinux mungkin memblokir penulisan. Anda perlu mengatur izin yang benar.

Di GUI Manajemen SELinux saya (di Fedora 19), saya mencentang kotak pada baris berlabel httpd_unified (Unify HTTPD menangani semua file konten), dan saya siap melakukannya.

ISpitOnRepSystems
sumber
Izin baca / tulis untuk siapa?
Peter Mortensen
Bagaimana cara memeriksa dan mengaturnya?
SynCap
1

Di Windows:

tl; dr: Coba buka file lagi.

Sistem kami mengalami masalah ini, dan ini jelas bukan masalah izin, karena program itu sendiri akan dapat membuka database sebagai dapat ditulis dari banyak utas hampir sepanjang waktu, tetapi kadang-kadang (hanya di Windows, bukan di OSX), sebuah utas akan mendapatkan kesalahan ini meskipun semua utas lainnya dalam program tidak mengalami kesulitan.

Kami akhirnya menemukan bahwa utas yang gagal hanyalah utas yang mencoba membuka database segera setelah utas lain menutupnya (dalam 3 md). Kami berspekulasi bahwa masalahnya disebabkan oleh fakta bahwa Windows (atau implementasi sqlite di bawah windows) tidak selalu segera membersihkan sumber daya file setelah menutup file. Kami menyiasatinya dengan menjalankan kueri uji tulis terhadap db saat membuka (misalnya, membuat kemudian menjatuhkan tabel dengan nama yang konyol). Jika buat / jatuhkan gagal, kami menunggu selama 50 md dan mencoba lagi, mengulanginya hingga kami berhasil atau 5 detik berlalu.

Itu berhasil; tampaknya hanya perlu ada cukup waktu agar sumber daya dialirkan ke disk.

Steve Broberg
sumber
1

Untuk berbagi pengalaman pribadi saya mengalami kesalahan ini yang akhirnya memperbaiki keduanya. Mungkin tidak selalu terkait dengan masalah Anda, tetapi tampaknya kesalahan ini sangat umum sehingga dapat dikaitkan dengan trilyun hal.

  1. Instance database dibuka di aplikasi lain. DB saya tampaknya telah dalam keadaan "terkunci" sehingga transisi ke mode hanya baca. Saya dapat melacaknya dengan menghentikan instance kedua dari aplikasi yang membagikan DB.

  2. Izin pohon direktori - pastikan untuk memastikan akun pengguna memiliki izin tidak hanya di tingkat file tetapi juga di seluruh tingkat direktori atas sampai ke / level.

Terima kasih

Adiza Baakoe
sumber
1

Di Ubuntu, ubah pemilik ke grup Apache dan berikan izin yang tepat (tidak, ini bukan 777):

sudo chgrp www-data <path to db.sqlite3>
sudo chmod 664 <path to db.sqlite3>

Memperbarui

Anda juga dapat mengatur izin untuk grup dan pengguna .

sudo chown www-data:www-data <path to db.sqlite3>
Natalie Penso
sumber
4
Anda baru saja mengubah grup , bukan pengguna (yang bagus, dan mungkin lebih baik daripada mengubah pengguna, tetapi jawaban Anda menyesatkan).
Auspex
Apa yang membuat Anda berpikir bahwa file tersebut harus menjadi milik pengguna / grup Apache?
Murphy
0

Edit DB: Saya mengalami masalah saat mengedit db. Saya akhirnya harus
sudo chown 'non root username' ts3server.sqlitedb
selama itu bukan root, saya bisa mengedit file. Nama pengguna adalah nama pengguna akun non root saya.

Mulai otomatis TeamSpeak: sebagai
crontab akun non root Anda -e
@reboot / path ke ts3server / aka /home/ts3server/ts3server_startscript.sh start

GreenerRabbit
sumber
0

Di jalur proyek Terminal django_project #

sudo chown django:django *
mohamedewias abdalfatah
sumber