2009-07-14 16 views
11

Używam bazy danych SQLite w skrypcie Perla CGI, do którego dostęp ma DBD::SQLite. Jest on uruchamiany jako prosty CGI na Apache.Dlaczego DBD :: SQLite nie można wstawić do bazy danych za pomocą mojego skryptu Perl CGI?

Połączenie DBI działa prawidłowo, a wybór można uruchomić. Jednak, gdy próbuję zrobić wkładkę mam matrycę z powodu następującego błędu:

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

Próbowałem zmienić uprawnienia pliku bazy danych do 666, aby spróbować rozwiązać ten jednak nadal jestem otrzymaniu błąd.

Każda rada?

+1

Czy można ustawić tymczasowo uprawnienia do katalogu i pliku na 777 i ponownie je sprawdzić? –

+0

Ah ha! Zmiana uprawnień do katalogu na 777 to naprawiła. Czy wiesz, dlaczego tak jest? –

+0

Prawdopodobnie zapomniałeś ustawić odpowiednie uprawnienia do katalogu. –

Odpowiedz

22

to wygląda potrzeby katalogu pisać pozwolenia, powodem jest:

SQLite needs to be able to create a journal file in the same directory as the DB, before any modifications can take place. The journal is used to support transaction rollback.

Od: seem to need write permission on db's parent directory

1

SQLite chwilowo blokuje cały plik podczas wprowadzania wstawek i aktualizacji (nie ma blokady rekordu jako takiej). Jesteś pewien, że zwalniasz blokady?

Literatura SQLite zaleca rozpoczęcie transakcji, zebranie wszystkich insertów i aktualizacji du jour w tej transakcji, a następnie zatwierdzenie. Pozwala to uniknąć wielu kolejnych blokad plików i poprawia wydajność.

1

Ponieważ SQLite blokuje cały plik bazy danych, można użyć czasu oczekiwania na bazie mechanizmu ponawiania . Pracowałem nad prawie ten sam problem, gdy zapytałem ten związany question.

skończyło się pisać coś podobnego do Mark Fowlera Attempt że ponawia jeśli wyjątek rzucony przez sub pasuje do wyrażenia regularnego, w moim przypadku:

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

ścieżka do katalogu, w której znajduje się plik db powinien ustawić zarówno bity wykonywalne, jak i zapisywalne, aby uzyskać do niego dostęp ze skryptu.

Ponadto, jeśli nie chcesz, aby plik db był bezpośrednio dostępny (nawet bez użycia specjalnych plików serwera), powinien mieć uprawnienia dostępu, takie jak 600, i jeśli katalog zawierający nie powinien być bezpośrednio przeglądany (ponownie, nawet bez użycia specjalnych plików serwera) powinien mieć uprawnienia dostępu, takie jak 700.

Używam tej konfiguracji i działa dobrze zarówno lokalnie, jak i na serwerze, na którym hostuję moją stronę.

Oczywiście zgoda katalogu zawierającego nie może być 700, jeśli istnieje w nim jakikolwiek inny plik, który powinien być dostępny przez html, css lub javascript. Zamiast tego powinno być 755.

Powiązane problemy