2009-10-05 7 views
48

Wie kann ich eine SQLite-Datenbank von Nur-Lesen zu Lesen-Schreiben ändern?SQLite-Datenbankmodus in Lese-Schreib-Modus ändern

Wenn ich die Update-Anweisung ausgeführt, habe ich immer bekommt:

SQL error: attempt to write a readonly database

Die SQLite-Datei auf dem Dateisystem eine beschreibbare Datei.

+1

Hat der Benutzer, der sqlite3 ausführt (oder was auch immer Sie zum Ausführen der Abfrage verwenden) Schreibberechtigungen für die Datenbank? Haben Sie den Besitz von Dateien überprüft? –

+0

Ich bin sicher, sie haben die Erlaubnis, es zu tun. – user143482

+1

Ich habe das in einer Web-App gesehen, wo ich vergessen habe, die GID auf die Datenbankdatei zu setzen und das "www-data" Konto (unter dem Apache läuft) wurde Schreibzugriff auf die Datei verweigert. – finnw

Antwort

41

Es kann mehrere Gründe für diese Fehlermeldung sein:

  • Mehrere Prozesse die Datenbank offen zur gleichen Zeit haben (see the FAQ).

  • Es gibt ein Plugin zum Komprimieren und Verschlüsseln der Datenbank. Es erlaubt nicht, die DB zu ändern.

  • Zuletzt, another FAQ sagt: "Stellen Sie sicher, dass das Verzeichnis, das die Datenbankdatei enthält, auch für den Benutzer schreibbar ist, der das CGI-Skript ausführt." Ich denke, das liegt daran, dass die Engine mehr Dateien im Verzeichnis erstellen muss.

+12

Ich würde mein Gebot auf das dritte Aufzählungszeichen setzen - das Verzeichnis, das die DB-Datei enthält, sollte ebenfalls beschreibbar sein, damit die Sperrdatei erstellt werden kann. – Kimvais

+0

Erste Kugel für mich: D – Vinay

+0

Letzte. Ich vergesse immer Sudo: P – Storm

0

in der Befehlszeile, geben Sie den Ordner, in dem die Datenbankdatei befindet, und führen Sie den folgenden Befehl ein:

chmod 777 databasefilename 

Diese alle Berechtigungen für alle Benutzer gewähren.

+15

Das ist ziemlich schlecht. –

+0

perfekte Antwort! – user392117

2

Ich hatte dieses Problem heute auch.

Es wurde von ActiveSync auf Windows Mobile verursacht - der Ordner, in dem ich arbeitete, wurde synchronisiert, so dass der AS-Prozess von Zeit zu Zeit die DB-Datei ergriff, die diesen Fehler verursachte.

4

Bei Verwendung von Android.

Vergewissern Sie sich, dass Sie die Berechtigung zum Schreiben an Ihre EXTERNAL_STORAGE an Ihre AndroidManifest.xml hinzugefügt haben.

Fügen Sie diese Zeile zu Ihrer AndroidManifest.xml Datei oben und außerhalb Ihres <application> Tags hinzu.

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

Dadurch kann Ihre Anwendung auf die SD-Karte schreiben. Dies wird hilfreich sein, wenn Sie Ihre Datenbank auf dem Gerät unter EXTERNAL_STORAGE gespeichert haben.

+0

Das hat mein Problem gelöst. Ich änderte die Frage, um mehr Details zu geben und einfacher zu lesen. – prolink007

+0

vielen Dank. es hat mein Problem auch gelöst.one up vote for for :) –

2

Dieser Fehler tritt normalerweise auf, wenn auf Ihre Datenbank bereits von einer Anwendung zugegriffen wird und Sie versuchen, mit einer anderen Datenbank darauf zuzugreifen.

+0

Warum würden Sie versuchen, von einer anderen Datenbank auf eine Datenbank zuzugreifen? –

3

Ich löste dies, indem ich den Besitzer von root auf alle Dateien in/db dir änderte.

Just do ls -l auf diesen Ordner, wenn eine der Filer von root gehört es dir nur ändern, mit: sudo chown user file

2

In Linux Kommando-Shell, ich habe:

chmod 777 <db_folder> 

Wo enthält die Datenbankdatei.

Es funktioniert. Jetzt kann ich auf meine Datenbank zugreifen und Insert-Anfragen stellen.

+0

Was sind die Auswirkungen auf die Sicherheit? –

+0

Wie unterscheidet sich das von [Adrians Antwort] (http://stackoverflow.com/questions/1518729/change-sqlite-database-mode-to-read-write/6961084#6961084)? –

+1

Es funktioniert als schnelle Lösung, aber muss später für bessere gesicherte Lösung eingraben –

1

Unter Linux geben Sie Lese-/Schreibberechtigungen für den gesamten Ordner mit der Datenbankdatei ein.

Außerdem blockiert SELinux möglicherweise den Schreibvorgang. Sie müssen die richtigen Berechtigungen festlegen.

In meiner SELinux Management GUI (unter Fedora 19) habe ich das Kästchen in der Zeile httpd_unified (HTTPD-Behandlung aller Inhaltsdateien vereinheitlichen) angekreuzt, und es war gut zu gehen.

+0

Lese-/Schreibberechtigungen für wen? –

+0

Wie kann ich das überprüfen und einstellen? – SynCap

-1

Bearbeiten Sie die DB: Ich hatte Probleme beim Bearbeiten der Datenbank. Ich musste am Ende
sudo chown 'nicht Root-Benutzername' ts3server.sqlitedb
solange es nicht root war, konnte ich die Datei bearbeiten. Benutzername ist der Benutzername meines Nicht-root-Kontos.

Auto starten Teamspeak: als nicht root-Konto
crontab -e
@reboot/path/aka ts3server

-1

auf Ubuntu /home/ts3server/ts3server_startscript.sh zu starten, ändern Sie den Besitzer die Apache Gruppe und gewähren die richtigen Berechtigungen (nein, es ist nicht 777):

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

Sie haben gerade die _group_ geändert, nicht den _user_ (was in Ordnung ist und wahrscheinlich _besser_ als das Ändern des Benutzers, aber Ihre Antwort ist irreführend). – Auspex

0

Unter Windows:

tl; dr: Versuchen Sie erneut, die Datei zu öffnen.

Unser System hatte dieses Problem, und es war definitiv kein Berechtigungsproblem, da das Programm selbst in der Lage wäre, die Datenbank die meiste Zeit schreibbar von vielen Threads zu öffnen, aber gelegentlich (nur unter Windows) auf OSX), würde ein Thread diese Fehler bekommen, obwohl alle anderen Threads im Programm keine Schwierigkeiten hatten.

Wir fanden schließlich heraus, dass die fehlgeschlagenen Threads nur diejenigen waren, die versuchten, die Datenbank sofort zu öffnen, nachdem ein anderer Thread sie geschlossen hatte (innerhalb von 3 ms). Wir spekulierten, dass das Problem auf die Tatsache zurückzuführen ist, dass Windows (oder die sqlite-Implementierung unter Windows) beim Schließen einer Datei nicht immer sofort Dateiressourcen bereinigt. Wir umgehen das, indem wir beim Öffnen eine Test-Write-Abfrage gegen die db ausführen (z. B. Erstellen, dann Löschen einer Tabelle mit einem dummen Namen). Wenn das Erstellen/Ablegen fehlgeschlagen ist, haben wir 50 ms gewartet und es erneut versucht, bis wir erfolgreich waren oder 5 Sekunden verstrichen sind.

Es funktionierte; Offensichtlich brauchte es nur genug Zeit, um die Ressourcen auf die Festplatte zu übertragen.