SQLite: Nur-Lese-Datenbank
Ich habe eine SQLite-Datenbank, die ich benutze für eine Webseite. Das problem ist, dass wenn ich versuche zu INSERT INTO
es, ich bekomme eine PDOException
SQLSTATE[HY000]: General error: 8 attempt to write a readonly database
Ich über SSH in den server und Berechtigungen überprüft, und die Datenbank hat die Berechtigungen
-rw-rw-r--
Ich bin nicht so vertraut mit *nix-Berechtigungen, aber ich bin mir ziemlich sicher, dass dies bedeutet
- Nicht ein Verzeichnis
- Besitzer hat lese - /Schreibrechte (das ist mir, nach
ls -l
) - Gruppe hat lese - /Schreibzugriff Berechtigungen
- Alle anderen nur lese-Berechtigungen
Ich auch überall geschaut ich wusste, dass Sie über die sqlite3
Programm, und nichts gefunden, was relevant ist.
Weil ich nicht wusste, mit was für Berechtigungen PDO versucht die Datenbank zu öffnen, habe ich
chmod o+w supplies.db
Nun bekomme ich einen anderen PDOException
:
SQLSTATE[HY000]: General error: 14 unable to open database file
Aber es tritt NUR auf, wenn ich versuche, führen Sie eine INSERT
Abfrage nach die Datenbank geöffnet ist.
Irgendwelche Ideen auf, was ist Los?
InformationsquelleAutor der Frage Austin Hyde | 2010-07-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem, wie sich herausstellt, ist, dass die PDO-SQLite-Treiber erfordert, dass, wenn Sie gehen zu tun eine write-operation (
INSERT
,UPDATE
,DELETE
DROP
etc), dann den Ordner, in dem die Datenbank sich befindet, muss Schreibrechte haben, sowie die eigentliche Datenbank-Datei.Fand ich diese Informationen in eine Kommentar am unteren Rand der PDO-SQLite-Treiber-Handbuch-Seite.
InformationsquelleAutor der Antwort Austin Hyde
Dies kann passieren, wenn der Besitzer der SQLite-Datei selbst ist nicht das gleiche wie der Benutzer, der das Skript ausführt. Ähnliche Fehler können auftreten, wenn der vollständige Pfad (d.h. jedes Verzeichnis auf dem Weg) kann nicht geschrieben werden.
Wem gehört die SQLite-Datei? Sie?
Wer wird das Skript ausgeführt, wie? Apache oder Niemand?
InformationsquelleAutor der Antwort Charles
Für mich war das Thema SELinux Durchsetzung anstatt Berechtigungen. Die "nur-Lesen-Datenbank" error ging Weg, sobald ich deaktiviert Durchsetzung, nach dem Vorschlag von Steve V. in einem Kommentar auf die akzeptierte Antwort.
Bei Ausführung dieses Befehls, alles funktioniert wie vorgesehen (CentOS 6.3).
Dem spezifischen Problem, das ich begegnet war, war während der Installation von Graphit. Ich hatte dreifach überprüft, dass der apache-Benutzer im Besitz von und schreiben könnte, um meine beiden Graphit.db und das übergeordnete Verzeichnis. Aber bis ich das "fixed" SELinux, alles, was ich bekam, war ein stack-trace, um die Wirkung: DatabaseError: attempt to write a readonly database
InformationsquelleAutor der Antwort Noah Sussman
Dies kann verursacht werden durch SELinux. Wenn Sie nicht möchten, deaktivieren Sie SELinux komplett, müssen Sie das Verzeichnis db fcontext zu httpd_sys_rw_content_t.
InformationsquelleAutor der Antwort Andy Fraley
Ich habe den gleichen Fehler von IIS unter windows 7. Um diesen Fehler zu beheben, die ich hatte, um full control Berechtigungen für das IUSR-Konto für sqlite-Datenbank-Datei. Sie nicht brauchen, um Berechtigungen zu ändern, wenn Sie verwenden sqlite unter webmatrix anstelle des IIS.
InformationsquelleAutor der Antwort l0pan
Bekam ich diese Fehlermeldung, wenn ich versuchte zu schreiben, um eine Datenbank auf einem Android-system.
Offenbar sqlite3 nicht nur benötigt Schreibzugriff auf die Datenbank-Datei und das übergeordnete Verzeichnis (wie @austin-hyde schon sagte in seiner Antwort), sondern auch die environment-variable
TMPDIR
hat, zu einem Punkt (evtl. beschreibbaren) Verzeichnis.Auf meinem Android-system habe ich es zu
TMPDIR="/data/local/tmp"
und jetzt mein Skript läuft, wie erwartet 🙂InformationsquelleAutor der Antwort Thilo
Habe ich diese in meinem browser, wenn ich wechselte von der Nutzung http://localhost zu http://my.local.ip.address und dann wieder zurück geändert auf "localhost" -- es war notwendig, um zu bleiben mit der IP-Adresse nachdem ich das geändert hatte, um, sobald
InformationsquelleAutor der Antwort kris