Cambia la modalità del database SQLite in lettura-scrittura


102

Come posso modificare un database SQLite da sola lettura a lettura-scrittura?

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

Errore SQL: tentativo di scrivere un database di sola lettura

Il file SQLite è un file scrivibile sul filesystem.


4
L'utente che esegue sqlite3 (o qualunque cosa tu stia utilizzando per eseguire la query) dispone dei permessi di scrittura sul db? Hai ricontrollato la proprietà del file?
Tim Post

1
Sono sicuro che hanno il permesso di farlo.
user143482

3
L'ho visto in un'app Web in cui ho dimenticato di impostare il GID sul file del database e all'account "www-data" (su cui gira Apache) è stato rifiutato l'accesso in scrittura al file.
finnw

Risposte:


87

Ci possono essere diversi motivi per questo messaggio di errore:

  • Diversi processi hanno il database aperto contemporaneamente ( vedere le FAQ ).

  • C'è un plugin per comprimere e crittografare il database. Non permette di modificare il DB.

  • Infine, un'altra FAQ dice: "Assicurati che la directory contenente il file di database sia scrivibile anche per l'utente che esegue lo script CGI." Penso che ciò sia dovuto al fatto che il motore deve creare più file nella directory.

  • L'intero filesystem potrebbe essere di sola lettura, ad esempio dopo un crash.

  • Su sistemi Unix, un altro processo può sostituire l'intero file.


27
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

1
Primo proiettile per me: D
Vinay

1
L'ultimo. Mi dimentico sempre sudo: P
Storm

4
Posso aggiungere a questo elenco: il file del database è stato sostituito durante l'utilizzo. Preferisco non dover spiegare la stupidità che ha portato a questa conclusione.
Wim Rijnders

1
Questo dovrebbe essere contrassegnato come risposta. Nel mio caso (un'app desktop), era correlato alla compressione del database di Windows a causa dello spazio insufficiente del disco rigido principale. Penso che Windows chiederà all'utente se desidera comprimere i file per ottenere spazio se l'utente dice di sì, potrebbe sorgere il problema del database di sola lettura.
Nandostyle

10

Ho risolto questo problema cambiando proprietario da root a me su tutti i file nella directory / db.

Basta farlo ls -lsu quella cartella, se uno qualsiasi dei filer è di proprietà, rootcambiarlo con te, usando:sudo chown user file


5

Questo errore di solito si verifica quando al tuo database accede già un'applicazione e stai tentando di accedervi con un'altra applicazione.


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

Penso che intendesse da un'altra applicazione
amaurymartiny

4

Se utilizzi Android.

Assicurati di aver aggiunto il permesso di scrivere al tuo EXTERNAL_STORAGEal tuo AndroidManifest.xml.

Aggiungi questa riga al tuo AndroidManifest.xmlfile sopra e fuori dal <application>tag.

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

Ciò consentirà alla tua applicazione di scrivere sulla scheda SD. Questo ti aiuterà se sei EXTERNAL_STORAGEdove hai archiviato il tuo database sul dispositivo.


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

molte grazie. ha risolto anche il mio problema. un voto alto per :)
Altaf Sami

4

Nella shell dei comandi di Linux, ho fatto:

chmod 777 <db_folder>

Dove contiene il file di database.

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


Quali sono le implicazioni per la sicurezza?
Peter Mortensen

In che modo è diverso dalla risposta di Adrian ?
Peter Mortensen

1
Funziona come una soluzione rapida ma deve scavare per trovare una soluzione migliore in seguito
troydo42

4
Ciò garantirà tutte le autorizzazioni a tutti gli utenti, il che probabilmente non è ciò che desideri dal punto di vista della sicurezza.
Renel Chesak

3

(questo messaggio di errore è in genere fuorviante e di solito è un errore di autorizzazioni generali)

Su Windows

  • Se stai emettendo SQL direttamente sul database, assicurati che qualsiasi applicazione che stai utilizzando per eseguire SQL sia in esecuzione come amministratore
  • Se un'applicazione sta tentando l'aggiornamento, l'account che utilizza per accedere al database potrebbe richiedere le autorizzazioni per la cartella contenente il file del database. Ad esempio, se IIS sta accedendo al database, IUSR e IIS_IUSRS potrebbero entrambi necessitare delle autorizzazioni appropriate (puoi provare questo dando temporaneamente a questi account il pieno controllo sulla cartella, controllando se funziona, quindi vincolando le autorizzazioni come appropriato)

1
Ho dovuto eseguire "DB Browser" come amministratore.
Eben Roux

1
Ho dato il "controllo completo" a "Tutti" su Windows 10 e ancora non funzionava. Tuttavia, come affermato da @EbenRoux, potresti anche dover eseguire "DB Browser" come amministratore, che lo ha fatto funzionare per me.
peaceoutside

2

Anch'io oggi ho avuto questo problema.

È stato causato da ActiveSync su Windows Mobile: la cartella in cui stavo lavorando è stata sincronizzata, quindi il processo AS ha afferrato il file DB di volta in volta causando questo errore.


1

Dalla riga di comando, inserisci la cartella in cui si trova il tuo file di database ed esegui il seguente comando:

chmod 777 databasefilename

Ciò garantirà tutte le autorizzazioni a tutti gli utenti.


23
Che è piuttosto brutto.
Marco Kerwitz

1
risposta perfetta!
Jitesh Prajapati

1
Potrebbe risolvere questo problema ma non è consigliato perché potrebbe portare a problemi di sicurezza.
kathir raja

1

In 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 mia SELinux Management GUI (su Fedora 19), ho spuntato la casella sulla riga denominata httpd_unified (Unify HTTPD handling of all content files), ed ero a posto.


Autorizzazioni di lettura / scrittura per chi?
Peter Mortensen

Come controllarlo e impostarlo?
SynCap

1

Su Windows:

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

Il nostro sistema soffriva di questo problema e sicuramente non era un problema di autorizzazioni, poiché 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 avrebbe ricevuto 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 tentando 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 di sqlite in Windows) non sempre pulisce immediatamente le risorse dei file alla chiusura di un file. Abbiamo aggirato questo problema eseguendo una query di scrittura di prova sul database all'apertura (ad esempio, creando e poi rilasciando una tabella con un nome sciocco). Se la creazione / rilascio non è riuscita, abbiamo aspettato 50 ms e riprovato, ripetendo fino a quando non siamo riusciti o sono trascorsi 5 secondi.

Ha funzionato; apparentemente ci voleva solo tempo sufficiente per scaricare le risorse su disco.


1

Per condividere l'esperienza personale ho riscontrato questo errore che alla fine risolve entrambi. Potrebbe non essere necessariamente correlato al tuo problema, ma sembra che questo errore sia così generico che può essere attribuito a miliardi di cose.

  1. Istanza di database aperta in un'altra applicazione. Il mio DB sembrava essere in uno stato "bloccato", quindi è passato alla modalità di sola lettura. Sono stato in grado di rintracciarlo arrestando la seconda istanza dell'applicazione che condivide il DB.

  2. Autorizzazione albero di directory: assicurati che l'account utente disponga dell'autorizzazione non solo a livello di file ma a livello dell'intera directory superiore fino al livello /.

Grazie


1

Su Ubuntu, cambia il proprietario nel gruppo Apache e concedi le autorizzazioni corrette (no, non è 777):

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

Aggiornare

Puoi anche impostare le autorizzazioni per gruppo e utente .

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

4
Hai appena cambiato il gruppo , non l' utente (che va bene, e probabilmente è meglio che cambiare utente, ma la tua risposta è fuorviante).
Auspex

Cosa ti fa pensare che il file dovrebbe appartenere all'utente / gruppo Apache?
Murphy

0

Modifica il DB: avevo problemi a modificare il db. Ho finito per dover
sudo chown 'nome utente non root' ts3server.sqlitedb
fintanto che non era root, potevo modificare il file. Il nome utente è il nome utente del mio account non root.

Avvia automaticamente TeamSpeak: come account non root
crontab -e
@reboot / path to ts3server / aka /home/ts3server/ts3server_startscript.sh inizia


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.