2009-10-05 9 views
48

Come posso modificare un database SQLite da sola lettura in lettura-scrittura?Modifica la modalità database SQLite in lettura/scrittura

Quando ho eseguito l'istruzione di aggiornamento, ho sempre avuto:

SQL error: attempt to write a readonly database

Il file SQLite è un file scrivibile sul filesystem.

+1

L'utente che esegue sqlite3 (o qualsiasi altra cosa si utilizzi per eseguire la query) ha i permessi di scrittura sul db? Hai ricontrollato la proprietà del file? –

+0

Sono sicuro che hanno il permesso di farlo. – user143482

+1

L'ho visto in un'app web in cui mi sono dimenticato di impostare il GID sul file del database e l'account "www-data" (che Apache funziona sotto) è stato rifiutato l'accesso in scrittura al file. – finnw

risposta

41

Ci possono essere diverse ragioni per questo messaggio di errore:

  • diversi processi hanno il database aperto allo stesso tempo (see the FAQ).

  • C'è un plug-in per comprimere e crittografare il database. Non consente di modificare il DB.

  • Infine, another FAQ dice: "Assicurarsi che la directory contenente il file di database sia anche scrivibile all'utente che esegue lo script CGI." Penso che questo sia dovuto al fatto che il motore ha bisogno di creare più file nella directory.

+12

Metterei la mia offerta sul terzo punto: anche la directory contenente il file DB dovrebbe essere scrivibile in modo da poter creare il file di blocco. – Kimvais

+0

Primo proiettile per me: D – Vinay

+0

Ultimo. Ho sempre dimenticato sudo: P – Storm

0

Dalla riga di comando, digitare la cartella in cui si trova il file di database ed eseguire il seguente comando:

chmod 777 databasefilename 

Ciò concedere tutte le autorizzazioni a tutti gli utenti.

+15

Che è abbastanza brutto. –

+0

risposta perfetta! – user392117

2

Ho avuto questo problema anche oggi.

E 'stato causato da ActiveSync su Windows Mobile - la cartella in cui stavo lavorando era sincronizzata in modo che il processo AS afferrasse il file DB di volta in volta causando questo errore.

4

Se si utilizza Android.

Accertarsi di aver aggiunto il permesso di scrivere sul numero al numero AndroidManifest.xml.

Aggiungi questa riga al tuo file AndroidManifest.xml sopra e all'esterno del tag <application>.

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

Ciò consentirà all'applicazione di scrivere sulla sdcard. Ciò sarà d'aiuto se il tuo EXTERNAL_STORAGE è dove hai memorizzato il tuo database sul dispositivo.

+0

Questo ha risolto il mio problema. Ho modificato la domanda per fornire maggiori dettagli ed essere più facile da leggere. – prolink007

+0

grazie mille. ha risolto anche il mio problema.one up vote for for :) –

2

Questo errore si verifica in genere quando si accede al database già da un'applicazione, e si sta tentando di accedervi con un altro database.

+0

Perché dovresti provare ad accedere a un database da un altro database? –

3

Ho risolto questo cambiando il proprietario da root a me su tutti i file su/db dir.

Basta fare ls -l su quella cartella, se uno dei filer è di proprietà di root basta cambiare a voi, utilizzando: sudo chown user file

2

In shell di comando di Linux, ho fatto:

chmod 777 <db_folder> 

Dove contiene il file di database.

Funziona. Ora posso accedere al mio database ed effettuare query di inserimento.

+0

Quali sono le implicazioni sulla sicurezza? –

+0

Com'è diverso da [la risposta di Adrian] (http://stackoverflow.com/questions/1518729/change-sqlite-database-mode-to-read-write/6961084#6961084)? –

+1

Funziona come soluzione rapida ma ha bisogno di scavare per una soluzione sicura migliore in seguito –

1

Su Linux, concedere autorizzazioni di lettura/scrittura all'intera cartella contenente il file di database.

Inoltre, SELinux potrebbe bloccare la scrittura. È necessario impostare le autorizzazioni corrette.

Nella GUI di SELinux Management (su Fedora 19), ho controllato la casella sulla riga etichettata httpd_unified (gestione Unify HTTPD di tutti i file di contenuto), ed ero a posto.

+0

Permessi di lettura/scrittura per chi? –

+0

Come verificare e impostare quello? – SynCap

-1

Modifica del DB: ho riscontrato problemi con la modifica del db. Ho finito per dover
sudo chown 'nome utente non root' ts3server.sqlitedb
finché non era root, potevo modificare il file. Username è il nome utente del mio account non root.

AUTO START TeamSpeak: il tuo account non di root
crontab -e
@reboot/percorso ts3server/aka /home/ts3server/ts3server_startscript.sh iniziare

-1

Su Ubuntu, cambiare il proprietario a il gruppo Apache e concedere le autorizzazioni a destra (no, non è 777):

sudo chown :www-data <path to db.sqlite3> 
sudo chown 664 <path to db.sqlite3> 
+3

Hai appena cambiato _group_, non _user_ (che va bene, e probabilmente _better_ piuttosto che cambiare utente, ma la tua risposta è fuorviante). – Auspex

0

Su Windows:

tl; dr: Prova ad aprire di nuovo il file.

Il nostro sistema stava soffrendo di questo problema, e sicuramente non era un problema di autorizzazioni, dal momento che il programma stesso sarebbe stato in grado di aprire il database come scrivibile da molti thread la maggior parte del tempo, ma occasionalmente (solo su Windows, non su OSX), un thread otterrebbe questi errori anche se tutti gli altri thread nel programma non avevano difficoltà.

Alla fine abbiamo scoperto che i thread che stavano fallendo erano solo quelli che stavano cercando di aprire il database immediatamente dopo che un altro thread lo aveva chiuso (entro 3 ms). Abbiamo ipotizzato che il problema fosse dovuto al fatto che Windows (o l'implementazione sqlite in Windows) non sempre ripulisce immediatamente le risorse file alla chiusura di un file. Abbiamo aggirato questo problema eseguendo una query di scrittura test contro il db all'apertura (ad es., Creando quindi una tabella con un nome stupido). Se la funzione di creazione/rilascio non è riuscita, abbiamo aspettato per 50 ms e ci ha provato di nuovo, ripetendo finché non ci siamo riusciti o trascorsi 5 secondi.

Ha funzionato; a quanto pare c'era solo bisogno di tempo sufficiente per le risorse da svuotare sul disco.

Problemi correlati