Eu tenho um banco de dados SQLite que estou usando para um site. O problema é que, quando eu tento INSERT INTO
, recebo umaPDOException
SQLSTATE[HY000]: General error: 8 attempt to write a readonly database
Eu fiz o SSH no servidor e verifiquei as permissões, e o banco de dados tem as permissões
-rw-rw-r--
Não conheço as permissões * nix, mas tenho certeza de que isso significa
- Não é um diretório
- O proprietário tem permissões de leitura / gravação (sou eu, de acordo com
ls -l
) - O grupo tem permissões de leitura / gravação
- Todos os outros só têm permissões de leitura
Eu também procurei em todos os lugares que sabia usar o sqlite3
programa e não encontrei nada relevante.
Como não sabia com que permissões o PDO está tentando abrir o banco de dados, fiz
chmod o+w supplies.db
Agora, eu recebo outro PDOException
:
SQLSTATE[HY000]: General error: 14 unable to open database file
Mas isso ocorre apenas quando tento executar uma INSERT
consulta depois que o banco de dados é aberto.
Alguma idéia do que está acontecendo?
sqlite
permissions
Austin Hyde
fonte
fonte
sudo chgrp www-data test.db
com permissões adicionando funcionou para mimRespostas:
O problema, como se vê, é que o driver PDO SQLite exige que se você estiver indo para fazer uma operação de gravação (
INSERT
,UPDATE
,DELETE
,DROP
, etc), então a pasta do banco de dados reside em deve ter permissões de gravação, bem como o real arquivo de banco de dados.Encontrei essas informações em um comentário na parte inferior da página do manual do driver DOP SQLite .
fonte
.db
e a.db-shm
e.db-wal
, é claro, o diretório pai dos três, que devem ser todos graváveis para o usuário que está executando o programa.Isso pode acontecer quando o proprietário do arquivo SQLite em si não é o mesmo que o usuário executando o script. Erros semelhantes podem ocorrer se todo o caminho do diretório (ou seja, cada diretório ao longo do caminho) não puder ser gravado.
Quem possui o arquivo SQLite? Vocês?
Para quem o script está sendo executado? Apache ou ninguém?
fonte
file_put_contents('./foo.txt', 'Hello, world');
), que mostre a você como ele está sendo executado. Provavelmente, você precisará que o script crie o banco de dados SQLite. Isso pode ser um exercício divertido, se você já possui dados em seu arquivo atual ... #posix_getuid()
também não funciona.Para mim, o problema era a imposição do SELinux, e não as permissões. O erro "banco de dados somente leitura" desapareceu assim que eu desabilitei a aplicação, seguindo a sugestão feita por Steve V. em um comentário sobre a resposta aceita.
Ao executar este comando, tudo funcionou como planejado (CentOS 6.3).
O problema específico que encontrei foi durante a instalação do Graphite. Eu tinha verificado três vezes se o usuário do apache possuía e podia escrever no meu graphite.db e no diretório pai. Mas até eu "consertar" o SELinux, tudo o que consegui foi um rastreamento de pilha com o efeito de: DatabaseError: tentativa de escrever um banco de dados somente leitura
fonte
Isso pode ser causado pelo SELinux. Se você não deseja desabilitar o SELinux completamente, precisa configurar o diretório db fcontext como httpd_sys_rw_content_t.
fonte
Eu recebi esse erro quando tentei gravar em um banco de dados em um sistema Android.
Aparentemente, o sqlite3 não apenas precisa de permissões de gravação para o arquivo do banco de dados e o diretório que contém (como @ austin-hyde já disse em sua resposta), mas também a variável de ambiente
TMPDIR
deve apontar para um diretório (possivelmente gravável).No meu sistema Android, eu o defino
TMPDIR="/data/local/tmp"
e agora meu script é executado conforme o esperado :)Editar:
Se você não puder definir variáveis de ambiente, poderá usar um dos outros métodos listados aqui: https://www.sqlite.org/tempfiles.html#temporary_file_storage_locations como
PRAGMA temp_store_directory = 'directory-name';
fonte
Eu obtive o mesmo erro do IIS no Windows 7. Para corrigir esse erro, tive que adicionar permissões de controle total à conta IUSR para o arquivo de banco de dados sqlite. Você não precisa alterar as permissões se usar o sqlite no webmatrix em vez do IIS.
fonte
Em resumo, corrigi o problema colocando o arquivo de banco de dados (* .db) em uma subpasta.
fonte
Eu obtive isso no meu navegador quando mudei de http: // localhost para http://145.900.50.20 (onde 145.900.50.20 é o meu endereço IP local) e depois mudei de volta para localhost - era necessário permanecer com o Endereço IP uma vez que eu mudei para aquele uma vez
fonte
Eu usei:
para descobrir quem está executando o script (por exemplo, nome de usuário) e, em seguida, concedeu ao usuário permissões para todo o diretório do aplicativo, como:
Espero que isto seja útil a alguém.
fonte