Подтвердить что ты не робот

Почему DBD:: SQLite не может вставляться в базу данных через мой Perl CGI script?

Я запускаю базу данных SQLite в Perl CGI script, к которой обращается DBD:: SQLite. Это выполняется как прямой CGI на Apache.

Соединение DBI работает отлично, и выбор может быть запущен. Однако, когда я пытаюсь сделать вставку, я получаю штамп со следующей ошибкой:

DBD::SQLite::st execute failed: unable to open database file(1) at dbdimp.c line 402 at index.cgi line 66

Я попытался изменить разрешение файла базы данных на 666, чтобы попытаться исправить это, но я все еще получаю ошибку.

Любые советы?

4b9b3361

Ответ 1

Похоже, что директория нуждается в разрешении на запись, причина в том, что:

SQLite должен иметь возможность создавать файл журнала в том же каталоге, что и БД, до того, как могут произойти какие-либо изменения. Журнал используется для поддержки отката транзакций.

От: похоже, требуется разрешение на запись в родительском каталоге db

Ответ 2

SQLite мгновенно блокирует весь файл, когда он делает вставки и обновления (нет блокировки на уровне записи как таковой). Вы уверены, что освобождаете блокировки?

В литературе SQLite рекомендуется начать транзакцию, собрать все свои вставки и обновления в jour в этой транзакции, а затем зафиксировать. Это позволяет избежать множества последовательных блокировок файлов и повышает производительность.

Ответ 3

Так как SQLite блокирует весь файл базы данных, вы можете использовать механизм повторной проверки на основе тайм-аута. Я работал над той же проблемой, когда я спросил об этом question.

В итоге я написал что-то похожее на Mark Fowler Attempt, который повторяет попытку, если исключение, созданное вспомогательным, соответствует регулярному выражению, в мой случай:

qr(already in a transaction|database is locked)i

Ответ 4

В пути к каталогу, в котором находится файл db, должны быть установлены как исполняемые, так и записываемые биты, чтобы получить доступ к нему из script.

Кроме того, если вы не хотите, чтобы db файл, который должен быть напрямую доступен (даже без использования специальных файлов сервера), он должен иметь разрешения доступа, такие как 600, и если содержащая директория не должна быть непосредственно просмотрена (опять же, даже без использования специальных файлов сервера), она должна иметь разрешения доступа, такие как 700.

Я использую эту настройку, и она отлично работает как локально, так и на сервере, где я размещаю свой сайт.

Конечно, разрешение содержащего каталог не может быть 700, если в нем есть какой-либо другой файл, который должен быть доступен через html, css или javascript. Это должно быть 755 вместо.