2009-07-14 10 views
11

DBD::SQLiteによってアクセスされているPerl CGIスクリプト内でSQLiteデータベースを実行しています。これはApache上でまっすぐなCGIとして実行されています。なぜPerl CGIスクリプトを使ってDBD :: SQLiteをデータベースに挿入できないのですか?

DBI接続は正常に動作し、選択は実行可能です。私は、これはしかし、私はまだエラーが発生します修正しようとするために666にデータベースファイルのパーミッションを変更しようとしている

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

:私は挿入を行うにしようとすると、しかし、私は次のエラーを有するダイを取得します。

アドバイスはありますか?

+1

ディレクトリとファイルのアクセス許可を一時的に777に設定して再チェックすることはできますか? –

+0

ああ!ディレクトリアクセス権を777に変更するとこれが修正されました。なぜこれが分かっていますか? –

+0

あなたはおそらく、正しいディレクトリ許可を設定するのを忘れていました。 –

答えて

22

それはディレクトリのニーズは許可を書きのように、理由があるに見えます:SQLiteのデータベース全体のファイルをロックしているので、あなたはタイムアウトベースの再試行メカニズムを使用したい場合がありseem to need write permission on db's parent directory

1

SQLiteは、挿入と更新を実行しているときにファイル全体を一時的にロックします(レコードレベルのロックはありません)。あなたはロックを解除していますか?

SQLiteの文献では、トランザクションを開始し、そのトランザクションですべての挿入と更新を収集してコミットすることをお勧めします。これにより、多数の連続したファイルロックが回避され、パフォーマンスが向上します。

1

:から

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.

。私はこれに関連して尋ねたところ、ほぼ同じ問題に取り組んでいましたquestion

私はサブでスローされた例外は、私の場合には、正規表現に一致した場合に再試行するマーク・ファウラーのAttemptに似て何か書いてしまった:

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

デシベルファイルがすべきを存在するディレクトリへのパスをスクリプトからアクセスできるように、実行可能ビットと書き込み可能ビットの両方を設定してください。

さらに、特別なサーバーファイルを使用しなくてもdbファイルに直接アクセスしたくない場合は、600などのアクセス権を持ち、含まれているディレクトリを直接参照しないでください(再度、特別なサーバーファイルを使用せずに)700などのアクセス権を持っている必要があります。

私はこの設定を使用し、ローカルでも自分のサイトをホストしているサーバーでも正常に動作します。

もちろん、HTML、CSSまたはJavaScriptでアクセス可能な他のファイルが存在する場合、包含ディレクトリのアクセス権を700にすることはできません。代わりに755でなければなりません。

関連する問題