SQLite: base de données en lecture seule

J'ai une base de données SQLite que j'utilise pour un site web. Le problème est que lorsque j'essaie de INSERT INTO, je reçois un PDOException

SQLSTATE[HY000]: General error: 8 attempt to write a readonly database

J'ai SSH dans le serveur et vérifié les autorisations, et la base de données a les autorisations

-rw-rw-r--

Je ne suis pas familier avec les autorisations * nix, mais je suis sûr que cela signifie

  • pas un répertoire
  • propriétaire a des autorisations de lecture/écriture (c'est moi, selon ls -l)
  • Le Groupe a lu / écrit autorisations
  • Tout le monde a seulement des autorisations de lecture

J'ai aussi regardé partout où je savais utiliser le programme sqlite3, et n'ai rien trouvé de pertinent.

Parce que je ne savais pas avec quelles autorisations PDO essaie d'ouvrir la base de données, j'ai fait

chmod o+w supplies.db

Maintenant, je reçois un autre PDOException:

SQLSTATE[HY000]: General error: 14 unable to open database file

Mais cela ne se produit que lorsque j'essaie d'exécuter une requête INSERT après que La base de données est ouverte.

Des idées sur ce qui se passe?

100
demandé sur Dorian 2010-07-23 18:31:03

7 réponses

Le problème, comme il s'avère, est que le pilote PDO SQLite l'exige si vous allez faire une opération d'écriture (INSERT,UPDATE,DELETE,DROP, etc), alors le dossier dans lequel réside la base de données doit avoir des autorisations d'écriture, ainsi que le fichier de base de données réel.

J'ai trouvé cette information dans un commentaire tout en bas de la page de manuel du pilote SQLite PDO.

264
répondu Austin Hyde 2010-07-25 19:08:13

Cela peut se produire lorsque le propriétaire du fichier SQLite lui-même est pas le même que l'utilisateur exécutant le script. Des erreurs similaires peuvent se produire si le chemin du répertoire entier (ce qui signifie que chaque répertoire en cours de route) ne peut pas être écrit.

À qui appartient le fichier SQLite? Vous?

Qui est le script en cours d'exécution? Apache, ou de Personne?

12
répondu Charles 2010-07-23 14:35:52

Pour moi, le problème était l'application SELinux plutôt que les autorisations. L'erreur "read only database" a disparu une fois que j'ai désactivé l'application, suite à la suggestion faite par Steve V. Dans un commentaire sur la réponse acceptée.

echo 0 >/selinux/enforce

Lors de l'exécution de cette commande, tout a fonctionné comme prévu (CentOS 6.3).

Le problème spécifique que j'avais rencontré était lors de la configuration du Graphite. J'avais vérifié trois fois que l'utilisateur apache possédait et pouvait écrire à mes deux graphite.db et son répertoire parent. Mais jusqu'à ce que je" fixe " SELinux, tout ce que j'ai eu était une trace de pile à l'effet de: DatabaseError: tentative d'écrire une base de données en lecture seule

4
répondu Noah Sussman 2017-05-23 11:55:07

Cela peut être causé par SELinux. Si vous ne voulez pas désactiver complètement SELinux, vous devez définir le répertoire DB fcontext sur httpd_sys_rw_content_t.

semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/railsapp/db(/.*)?"
restorecon -v /var/www/railsapp/db
2
répondu Andy Fraley 2016-12-13 23:37:06

J'ai eu la même erreur D'IIS sous windows 7. Pour corriger cette erreur, j'ai dû ajouter des autorisations de contrôle total au compte IUSR pour le fichier de base de données sqlite. Vous n'avez pas besoin de modifier les autorisations si vous utilisez sqlite sous webmatrix au lieu D'IIS.

1
répondu l0pan 2014-03-09 18:07:51

J'ai eu cette erreur quand j'ai essayé d'écrire dans une base de données sur un système Android.

Apparemment, sqlite3 a non seulement besoin d'autorisations d'écriture sur le fichier de base de données et le répertoire contenant (comme @austin-hyde l'a déjà dit dans sa réponse), mais aussi la variable d'environnement TMPDIR doit pointer vers un répertoire (éventuellement inscriptible).

Sur mon système Android, je l'ai mis à TMPDIR="/data/local/tmp" et maintenant, mon script s'exécute comme prévu :)

0
répondu Thilo 2017-04-03 06:36:51

Je l'ai eu dans mon navigateur quand j'ai changé d'utilisation de http://localhost à http://my.local.IP.adresse et puis changé à localhost - il était nécessaire de rester avec l'adresse IP une fois que j'avais changé à cette fois

-1
répondu kris 2016-08-31 02:08:09