2009-07-14 14 views
11

Tôi đang chạy cơ sở dữ liệu SQLite trong tập lệnh Perl CGI đang được truy cập bởi DBD::SQLite. Điều này đang được chạy như một CGI thẳng trên Apache.Tại sao không thể DBD :: SQLite chèn vào một cơ sở dữ liệu thông qua kịch bản Perl CGI của tôi?

Kết nối DBI hoạt động tốt và các lựa chọn có thể chạy. Tuy nhiên, khi tôi cố gắng thực hiện việc chèn, tôi nhận được thông báo lỗi sau:

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

Tôi đã cố gắng thay đổi quyền tệp cơ sở dữ liệu thành 666 để cố khắc phục điều này, tuy nhiên tôi vẫn gặp lỗi.

Bạn có lời khuyên nào không?

+1

Bạn có thể tạm thời đặt quyền thư mục và tệp cho 777 và kiểm tra lại không? –

+0

Ah ha! Thay đổi quyền truy cập thư mục thành 777 đã sửa lỗi này. Bạn có biết tại sao không? –

+0

Có thể bạn cũng đã quên đặt quyền thư mục phù hợp. –

Trả lời

22

Dường như nhu cầu thư viết cho phép, lý do là:

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.

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

1

SQLite tạm thời khóa toàn bộ tệp khi nó đang thực hiện chèn và cập nhật (không có khóa cấp bản ghi nào như vậy). Bạn có chắc là bạn đang giải phóng khóa?

Tài liệu SQLite khuyên bạn nên bắt đầu một giao dịch, thu thập tất cả các lần chèn và cập nhật của bạn trong giao dịch đó và sau đó cam kết. Điều này tránh được nhiều khóa tệp liên tiếp và cải thiện hiệu suất.

1

Kể từ SQLite khóa toàn bộ tập tin cơ sở dữ liệu, bạn có thể muốn sử dụng một cơ chế retry timeout dựa trên . Tôi đã làm việc trên khá nhiều vấn đề tương tự khi tôi hỏi điều này liên quan question.

tôi đã kết thúc viết một cái gì đó tương tự Mark Fowler của Attempt đó thử lại nếu ném ngoại lệ bởi các tiểu phù hợp với một biểu thức chính quy, trong trường hợp của tôi:

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

Đường dẫn đến thư mục nơi cư trú của tập tin db nên có cả hai tập tin thực thi và có thể ghi được, để truy cập nó từ tập lệnh. Ngoài ra, nếu bạn không muốn tệp db được truy cập trực tiếp (ngay cả khi không sử dụng các tệp máy chủ đặc biệt), nó phải có quyền truy cập như 600 và nếu thư mục chứa không được duyệt trực tiếp (một lần nữa, thậm chí mà không cần sử dụng các tập tin máy chủ đặc biệt) nó phải có quyền truy cập như 700.

Tôi sử dụng thiết lập này và nó hoạt động tốt cả cục bộ lẫn trên máy chủ nơi tôi lưu trữ trang web của mình.

Tất nhiên, sự cho phép của thư mục chứa không thể là 700 nếu có tồn tại bất kỳ tập tin nào bên trong nó có thể truy cập thông qua html, css hoặc javascript. Nó sẽ là 755 thay vào đó.

Các vấn đề liên quan