2

したがって、私は Perl も SQLite も初めてです。SQL の経験はありますが、この新しい Perl 構文には少し戸惑っています。

そのため、Perl スクリプトを使用して IPtable ログから DB を作成して、テーブルにあるデータを解析し、人々に通知を送信しようとしているという問題があります。このスクリプトはユーザーに通知も送信しますが、それがこの問題と関係があるとは思えません。

これは私が受け取っているエラーです。

DBD::SQLite::db の準備に失敗しました: そのようなテーブルはありません: ./send_notification_syslog.pl 行 251 の syslog_decom_notif。

以下は、エラーを受け取っているコードです。

2 sub select_contacts {
233         my @contact_info;
234         my $dbh = DBI->connect( DECOM_NOTIFICATION_DB ,"","");
235
236         my ( $where_clause, @exec_params ) = build_where_clause();
237
238         my $SQL = <<SQL;
239 select
240                 contact
241         ,       status
242         ,       contact_mngr
243         ,       hostname
244         ,       contact_type
245         ,       syslog_server
246 from
247         syslog_decom_notif
248 $where_clause
249 SQL
250         debug  ( __LINE__ . " Excuting SQL = \n[ $SQL ]\n" );
251         my $sth = $dbh->prepare( $SQL );
252         $sth->execute( @exec_params );
253         if ( $debug_mode ) {
254                 my @cols = @{$sth->{NAME}};
255                 print join '|', @cols;
256                 print "\n";
257         }
258         while (my @res = $sth->fetchrow) {
259                 for ( my $i=0; $i<@res; $i++ ) { $res[$i] = 'Null' if ! defined $res[$i]; }
260                 my $row = join '|', @res;
261                 debug "$row\n";
262                 push @contact_info, $row;
263         }
264         $sth->finish();
265         return @contact_info;
266 }

私は周りを検索しましたが、この問題に本当に役立つものを見つけることができないようです.

ありとあらゆるアイデアに感謝します。

よろしくお願いします

4

1 に答える 1

5

単純な真実は、それが言うように、DBI はsyslog_decom_notifあなたが開いたデータベースで呼び出されたテーブルを見つけることができないということです。が失敗した後は、prepare他に何も機能しません。

テーブル名は正しいと思いますので、 の値が気になりますDECOM_NOTIFICATION_DB。これはどこから来たのですか?おそらく で定義された文字列use constantですか?

SQLiteのconnect呼び出しでは、DBI は次のような DSN を期待しますdbi:SQLite:dbname=my_db_file。ファイルが存在しない場合は作成されます。この設定が間違っていて、空のデータベースで作業している可能性がありますか?


アップデート

接続したデータベースの内容を確認するには、呼び出しの直後にこれを追加しDBI->connectます。接続されたデータベース内のテーブルのリストを出力します。ENDターミネータが行頭にあり、その前後に空白がないことを確認してください。

my $tables = $dbh->selectcol_arrayref(<<END);
SELECT name FROM sqlite_master
WHERE type='table'
ORDER BY name
END

print "$_\n" for @$tables;
于 2012-06-13T16:45:12.973 に答える