DBI と FreeTDS (Ubuntu 上) を使用して SQL Azure にデータを挿入する Perl で断続的な問題が発生しました。問題が発生し、一部の行が無視される可能性がありますが、問題なく再度実行できます。
脚本:
print "Importing File $file: to Staging Table\n";
open my $info, $file or die "Could not open $file: $!";
$dbh->do("EXEC DWTOOLS.InitStage;") or die $DBI::errstr ; #truncates the table
my $sth = $dbh->prepare("INSERT INTO DWSTAGE.CDRImport (LINE) VALUES(?);") or die $DBI::errstr ;
my $counter = 0;
while( my $line = <$info>) {
$line =~ s/\r?\n$//;
$counter++;
print "Loading line $counter: $line\n" ;
my $rc = $sth->execute($line) or die $DBI::errstr ;
print "Result: $rc\n";
}
close $info;
print "\nChecking Data Warehouse: $counter lines expected\n" ;
my $checksth = $dbh->prepare("EXEC DWTOOLS.CheckStage ?;") or die $DBI::errstr ;
my $checkrc = $checksth->execute($counter) or die $DBI::errstr ;
my @row;
while ( @row = $checksth->fetchrow_array( ) ) {
print "Row: @row\n";
}
出力を与えます:
Importing File filename: to Staging Table
Loading line 1: data redacted
Result: 1
Loading line 2: data redacted
Result: 1
etc. etc. with no indication of errors
Loading line 165: data redacted
Result: 1
Loading line 166: data redacted
Result: 1
Checking Data Warehouse: 166 lines expected
Row: 35 166
Row: 35 166
Loading to Data Warehouse
したがって、テーブルを見ると、すべての最初の行が、動作を開始した特定の時点まで (確実に - 最後まで) 欠落していることがわかります。つまり、基本的に、ファイルの最後の 35 行が読み込まれ、1 から始まります。行 1 が実際には行 (166-35+1) などである 35 まで上がります。Azure のテーブルには PK、クラスター化された IDENTITY 列があり、これは 1 から始まり、ギャップがないため、最初のように多くの挿入がエラーの兆候なしに削除されました。これは、さまざまなファイル、さまざまなサイズ、およびファイル内のさまざまな場所で発生します。
ファイルはループで処理され、各ファイルが開かれ、処理され、閉じられます。これは、この奇妙な動作に関係がある場合に備えています。ステートメントはファイルごとに 1 回再準備されますが、問題が発生する可能性がある場合、SQL Azure 接続はプログラムの存続期間中維持されます。接続障害が発生した場合、プログラムが停止することは依然として予想されますが、実行から返されるエラー コードがないことから判断すると、エラーの兆候が得られるとは確信が持てません。
先に進んでプログラムを再実行すると、すべての行が表示され、すべて問題ありません。
どのような結論を導き出すかはわかりません。現時点での私の結論は、FreeTDS にはバグが多く、信頼性が低いということです。