2009-07-14 21 views
11

DBD::SQLite tarafından erişilen bir Perl CGI betiği içinde bir SQLite veritabanı çalıştırıyorum. Bu Apache üzerinde düz bir CGI olarak çalıştırılıyor.Neden DBD :: SQLite Perl CGI betiğimde bir veritabanına eklenemiyor?

DBI bağlantısı düzgün çalışıyor ve seçilebilir. Bu ancak hala hata alıyorum düzeltmeye 666 veritabanı dosyası izni değiştirmeyi denedi

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

: Ben bir ekleme yapmak istediğinizde Ancak, aşağıdaki hatayı içeren bir kalıp olsun.

Herhangi bir öneri?

+1

Dizini ve dosya iznini geçici olarak 777 olarak ayarlayabilir ve yeniden kontrol edebilir misiniz? –

+0

Ah ha! Dizin izinlerini 777 olarak değiştirmek bunu düzeltdi. Bunun neden olduğunu biliyor musun? –

+0

Büyük olasılıkla doğru dizin iznini de ayarlamayı unutmuşsunuzdur. –

cevap

1

SQLite, ekler ve güncelleştirmeler yaparken tüm dosyayı anlık olarak kilitler (bu şekilde kayıt düzeyinde kilitleme yoktur). Kilitleri serbest bıraktığına emin misin?

SQLite literatürü, bir işlemi başlatmanızı, tüm eklerinizi toplamanızı ve bu işlemdeki du jour'ları güncellemenizi ve sonra da taahhütte bulunmanızı önerir. Bu sayısız ardışık dosya kilitlenmesini önler ve performansı artırır. Dizin ihtiyaçları yazma iznine gibi

Bu nedenle
1

, bir zaman aşımı tabanlı yeniden deneme mekanizmasını kullanmak isteyebilirsiniz: Dan

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.

. Ben bu ilgili question sorduğumda hemen hemen aynı sorun üzerinde çalışıyordum.

Ben benzer bir şey yazma sona erdi Mark Fowler alt tarafından atılan özel durum benim durumumda, normal bir ifade eşleşirse dener Attempt:

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

dizinin yolunu nerede db dosyası bulunduğu gerektiği komut dosyasından erişmek için hem çalıştırılabilir hem de yazılabilir bits kümesine sahip olmalıdır.

Ayrıca, db dosyasının doğrudan erişilmesini istemiyorsanız (özel sunucu dosyalarının kullanımı olmasa bile), 600 gibi erişim izinlerine sahip olmalı ve içeren dizin doğrudan göz atılmamalıdır. özel sunucu dosyalarının kullanımı olmadan) 700 gibi erişim izinlerine sahip olmalıdır.

Bu kurulumu kullanıyorum ve hem yerel hem de sitemi barındırdığım sunucuda gayet iyi çalışıyor.

Elbette, içerdiği dizinin izni, içinde html, css veya javascript yoluyla erişilebilecek başka bir dosya varsa 700 olamaz. Bunun yerine 755 olmalı.

İlgili konular