Cambiar el modo de la base de datos SQLite a lectura-escritura


101

¿Cómo puedo cambiar una base de datos SQLite de solo lectura a lectura-escritura?

Cuando ejecuté la declaración de actualización, siempre obtuve:

Error de SQL: intente escribir una base de datos de solo lectura

El archivo SQLite es un archivo grabable en el sistema de archivos.


3
¿El usuario que ejecuta sqlite3 (o lo que sea que esté usando para ejecutar la consulta) tiene permisos de escritura en la base de datos? ¿Ha verificado la propiedad del archivo?
Tim Post

Estoy seguro de que tienen permiso para hacerlo.
user143482

2
He visto esto en una aplicación web en la que olvidé establecer el GID en el archivo de la base de datos y se negó el acceso de escritura al archivo a la cuenta "www-data" (bajo la que se ejecuta Apache).
finnw

Respuestas:


86

Puede haber varias razones para este mensaje de error:

  • Varios procesos tienen la base de datos abierta al mismo tiempo ( consulte las preguntas frecuentes ).

  • Hay un complemento para comprimir y cifrar la base de datos. No permite modificar la base de datos.

  • Por último, otra pregunta frecuente dice: "Asegúrese de que el usuario que ejecuta el script CGI también pueda escribir en el directorio que contiene el archivo de la base de datos". Creo que esto se debe a que el motor necesita crear más archivos en el directorio.

  • Todo el sistema de archivos puede ser de solo lectura, por ejemplo, después de un bloqueo.

  • En los sistemas Unix, otro proceso puede reemplazar todo el archivo.


26
Pondría mi oferta en la tercera viñeta: el directorio que contiene el archivo de base de datos también debe poder escribirse para que se pueda crear el archivo de bloqueo.
Kimvais

Primera viñeta para mí: D
Vinay

El último. Siempre olvido sudo: P
Storm

2
Puedo agregar a esta lista: el archivo de la base de datos se reemplazó durante el uso. Prefiero no tener que explicar la estupidez que llevó a esta conclusión.
Wim Rijnders

Esto debe marcarse como la respuesta. En mi caso (una aplicación de escritorio), estaba relacionado con la compresión de la base de datos de Windows debido a que el disco duro principal se quedaba demasiado bajo en espacio. Creo que Windows le preguntará al usuario si desea comprimir archivos para obtener espacio si el usuario dice que sí, entonces podría surgir el problema de la base de datos de solo lectura.
Nandostyle

10

Resolví esto cambiando el propietario de root a mí en todos los archivos en / db dir.

Simplemente hágalo ls -len esa carpeta, si alguno de los archivadores es propiedad de rootsimplemente cámbielo a usted, usando:sudo chown user file


5

Este error suele ocurrir cuando una aplicación ya accede a su base de datos y está intentando acceder a ella con otra aplicación.


¿Por qué intentarías acceder a una base de datos desde otra base de datos?
Peter Mortensen

Creo que se refería a otra aplicación
amaurymartiny

4

Si usa Android.

Asegúrese de haber agregado el permiso para escribir a su EXTERNAL_STORAGEa su AndroidManifest.xml.

Agregue esta línea a su AndroidManifest.xmlarchivo arriba y fuera de su <application>etiqueta.

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

Esto permitirá que su aplicación escriba en la tarjeta SD. Esto ayudará si EXTERNAL_STORAGEes donde ha almacenado su base de datos en el dispositivo.


Esto resolvió mi problema. Modifiqué la pregunta para dar más detalles y ser más fácil de leer.
prolink007

muchas gracias. también resolvió mi problema. un voto a favor para :)
Altaf Sami

4

En el shell de comandos de Linux, lo hice:

chmod 777 <db_folder>

Donde contiene el archivo de la base de datos.

Funciona. Ahora puedo acceder a mi base de datos y realizar consultas de inserción.


¿Cuáles son las implicaciones de seguridad?
Peter Mortensen

¿En qué se diferencia esto de la respuesta de Adrian ?
Peter Mortensen

1
Funciona como una solución rápida, pero tiene que cavar para una mejor solución asegurada tarde
troydo42

4
Esto otorgará todos los permisos a todos los usuarios, lo que probablemente no sea lo que desea desde el punto de vista de la seguridad.
Renel Chesak

3

(este mensaje de error suele ser engañoso y suele ser un error de permisos general)

En Windows

  • Si está emitiendo SQL directamente contra la base de datos, asegúrese de que cualquier aplicación que esté utilizando para ejecutar SQL se esté ejecutando como administrador
  • Si una aplicación está intentando la actualización, la cuenta que usa para acceder a la base de datos puede necesitar permisos en la carpeta que contiene su archivo de base de datos. Por ejemplo, si IIS está accediendo a la base de datos, tanto IUSR como IIS_IUSRS pueden necesitar los permisos adecuados (puede intentar esto dando temporalmente a estas cuentas control total sobre la carpeta, verificando si esto funciona y luego atando los permisos según corresponda)

1
Tuve que ejecutar "DB Browser" como administrador.
Eben Roux

1
Le di "control total" a "Todos" en Windows 10, y aún así no funcionaba. Sin embargo, como dijo @EbenRoux, es posible que también deba ejecutar "DB Browser" como administrador, lo que hizo que me funcionara.
peaceoutside

2

Hoy también tuve este problema.

Fue causado por ActiveSync en Windows Mobile: la carpeta en la que estaba trabajando estaba sincronizada, por lo que el proceso AS tomó el archivo de base de datos de vez en cuando y causó este error.


1

En Linux, otorgue permisos de lectura / escritura a toda la carpeta que contiene el archivo de base de datos.

Además, SELinux podría estar bloqueando la escritura. Debes configurar los permisos correctos.

En mi GUI de administración de SELinux (en Fedora 19), marqué la casilla en la línea etiquetada httpd_unified (Unificar el manejo HTTPD de todos los archivos de contenido), y estaba listo para comenzar.


¿Permisos de lectura / escritura para quién?
Peter Mortensen

¿Cómo comprobar y configurar eso?
SynCap

1

Para compartir la experiencia personal que encontré con este error que finalmente corrigió ambos. Puede que no esté necesariamente relacionado con su problema, pero parece que este error es tan genérico que puede atribuirse a miles de cosas.

  1. Instancia de base de datos abierta en otra aplicación. Mi base de datos parecía haber estado en un estado "bloqueado", por lo que pasó al modo de solo lectura. Pude rastrearlo deteniendo la segunda instancia de la aplicación que comparte la base de datos.

  2. Permiso del árbol de directorio: asegúrese de asegurarse de que la cuenta de usuario tenga permiso no solo a nivel de archivo, sino a todo el nivel de directorio superior hasta el nivel /.

Gracias


1

En Ubuntu, cambie el propietario al grupo Apache y otorgue los permisos adecuados (no, no es 777):

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

Actualizar

También puede configurar los permisos para el grupo y el usuario .

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

4
Acaba de cambiar el grupo , no el usuario (lo cual está bien, y probablemente sea mejor que cambiar el usuario, pero su respuesta es engañosa).
Auspex

¿Qué le hace pensar que el archivo debería pertenecer al usuario / grupo de Apache?
Murphy

0

Desde la línea de comando, ingrese la carpeta donde se encuentra su archivo de base de datos y ejecute el siguiente comando:

chmod 777 databasefilename

Esto otorgará todos los permisos a todos los usuarios.


22
Lo cual es bastante malo.
Marco Kerwitz

Respuesta perfecta !
Jitesh Prajapati

Podría resolver este problema, pero no se recomienda porque podría provocar problemas de seguridad.
kathir raja

0

En Windows:

tl; dr: Intente abrir el archivo nuevamente.

Nuestro sistema sufría este problema, y ​​definitivamente no era un problema de permisos, ya que el programa en sí podría abrir la base de datos como escribible desde muchos subprocesos la mayor parte del tiempo, pero ocasionalmente (solo en Windows, no en OSX), un hilo obtendría estos errores aunque todos los demás hilos del programa no tuvieran dificultades.

Finalmente descubrimos que los subprocesos que fallaban eran solo aquellos que intentaban abrir la base de datos inmediatamente después de que otro subproceso la había cerrado (en 3 ms). Especulamos que el problema se debía al hecho de que Windows (o la implementación de sqlite en Windows) no siempre limpia de inmediato los recursos del archivo al cerrar un archivo. Lo solucionamos ejecutando una consulta de escritura de prueba contra la base de datos al abrir (por ejemplo, crear y luego soltar una tabla con un nombre tonto). Si la creación / eliminación falló, esperamos 50 ms y lo intentamos nuevamente, repitiendo hasta que lo logramos o transcurrieron 5 segundos.

Funcionó; aparentemente, solo necesitaba tiempo suficiente para que los recursos se descargaran en el disco.


-1

Edite la base de datos: estaba teniendo problemas para editar la base de datos. Terminé teniendo que
sudo chown 'nombre de usuario no root' ts3server.sqlitedb
siempre que no fuera root, podría editar el archivo. El nombre de usuario es el nombre de usuario de mi cuenta no root.

Inicio automático TeamSpeak: como su cuenta no root
crontab -e
@reboot / ruta a ts3server / aka /home/ts3server/ts3server_startscript.sh start


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.