삽입하는 동안 SQLite 오류 '읽기 전용 데이터베이스 쓰기 시도'?
웹 사이트에 사용하는 SQLite 데이터베이스가 있습니다. 문제는 내가하려고 할 때이다 INSERT INTO
그것은, 내가 얻을PDOException
SQLSTATE[HY000]: General error: 8 attempt to write a readonly database
서버에 SSH로 접속하여 권한을 확인했으며 데이터베이스에 권한이 있습니다.
-rw-rw-r--
나는 * nix 권한에 익숙하지 않지만 이것이 의미하는 것은 확실합니다.
- 디렉토리가 아님
- 소유자 (에 따라, 나야하는 읽기 / 쓰기 권한이
ls -l
) - 그룹에 읽기 / 쓰기 권한이 있습니다
- 다른 사람에게는 읽기 권한 만 있습니다
나는 또한 sqlite3
프로그램 을 사용하기 위해 알고있는 모든 곳을 보았 으며 아무런 관련이없는 것을 발견했다.
PDO가 데이터베이스를 열려고하는 권한을 알지 못했기 때문에
chmod o+w supplies.db
이제 다른 것을 얻습니다 PDOException
.
SQLSTATE[HY000]: General error: 14 unable to open database file
그러나 데이터베이스가 열린 후INSERT
쿼리 를 실행하려고 할 때만 발생합니다 .
무슨 일이 일어나고 있는지에 대한 아이디어가 있습니까?
이 밝혀 문제는의 PDO SQLite는 드라이버 당신이 쓰기 작업을 수행하려는 경우 (해야한다는 것입니다 INSERT
, UPDATE
, DELETE
, DROP
, 등), 다음의 데이터베이스 폴더에 상주하는 실제뿐만 아니라, 쓰기 권한이 있어야합니다 데이터베이스 파일.
PDO SQLite 드라이버 매뉴얼 페이지 맨 아래 에있는 주석 에서이 정보를 찾았습니다 .
이는 SQLite 파일의 소유자 자체가 스크립트를 실행하는 사용자와 동일 하지 않은 경우에 발생할 수 있습니다 . 전체 디렉토리 경로 (길이에 따라 각 디렉토리를 의미)를 쓸 수없는 경우 유사한 오류가 발생할 수 있습니다.
누가 SQLite 파일을 소유합니까? 당신?
스크립트는 누구로 실행됩니까? 아파치 또는 아무도?
나에게 문제는 권한보다는 SELinux 시행 이었습니다 . 수락 된 답변 에 대한 의견에서 Steve V.의 제안에 따라 시행을 비활성화 하면 "읽기 전용 데이터베이스"오류가 사라졌습니다 .
echo 0 >/selinux/enforce
이 명령을 실행하면 모든 것이 의도 한대로 작동했습니다 (CentOS 6.3).
내가 만난 특정 문제는 Graphite를 설정하는 동안 발생했습니다. 나는 아파치 사용자가 소유하고 있고 흑연 .db와 부모 디렉토리 모두에 쓸 수 있는지 세 번 점검했다. 그러나 SELinux를 "수정"할 때까지 다음과 같은 효과에 대한 스택 추적 만있었습니다. DatabaseError : 읽기 전용 데이터베이스 작성 시도
이는 SELinux에 의해 발생할 수 있습니다. SELinux를 완전히 비활성화하지 않으려면 db 디렉토리 fcontext를 httpd_sys_rw_content_t로 설정해야합니다.
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/railsapp/db(/.*)?"
restorecon -v /var/www/railsapp/db
Windows 7의 IIS에서 동일한 오류가 발생했습니다.이 오류를 해결하려면 sqlite 데이터베이스 파일에 대한 IUSR 계정에 모든 제어 권한을 추가해야했습니다. IIS 대신 webmatrix에서 sqlite를 사용하는 경우 권한을 변경할 필요가 없습니다.
안드로이드 시스템의 데이터베이스에 쓰려고 할 때이 오류가 발생했습니다.
분명히 sqlite3은 데이터베이스 파일과 포함 디렉토리 (@ austin-hyde가 이미 답변에서 언급했듯이)에 대한 쓰기 권한이 필요할뿐만 아니라 환경 변수도 TMPDIR
(쓰기 가능) 디렉토리를 가리켜 야합니다.
내 안드로이드 시스템에서 그것을 설정 TMPDIR="/data/local/tmp"
했고 이제 스크립트가 예상대로 실행됩니다 :)
편집하다:
If you can't set environment variables you can use one of the other methods listed here: https://www.sqlite.org/tempfiles.html#temporary_file_storage_locations like PRAGMA temp_store_directory = 'directory-name';
In summary, I've fixed the problem by putting the database file (* .db) in a subfolder.
- The subfolder and the database file within it must be a member of the www-data group.
- In the www-data group, you must have the right to write to the subfolder and the database file.
I got this in my browser when I changed from using http://localhost to http://145.900.50.20 (where 145.900.50.20 is my local IP address) and then changed back to localhost -- it was necessary to stay with the IP address once I had changed to that once
'development' 카테고리의 다른 글
Moment.js로 현재 타임 스탬프를 반환하는 방법은 무엇입니까? (0) | 2020.07.25 |
---|---|
HTML : 파일 업로드를 이미지만으로 제한하는 방법? (0) | 2020.07.25 |
Apache VirtualHost 403 금지 (0) | 2020.07.25 |
파이썬에서 여러 목록을 하나의 목록으로 병합하는 방법은 무엇입니까? (0) | 2020.07.25 |
사용자 정의 정렬 순서를 사용하여 객체의 ArrayList 정렬 (0) | 2020.07.25 |