問題: Perl スクリプトはコマンド プロンプトでは正常に動作しますが、ODBC では CGI スクリプトとして失敗します
設定: Win XP Pro 64 ビット バージョン 2003 SP2 Apache 2.2.17 Win32 Active Perl 5.12.2 (Perl64 ではない) SQL SERVER 用の ODBC DSN が作成されます
詳細: コマンド プロンプトから、Phone.pl は正常に実行されます - 期待どおりのクエリ結果が得られます - これは、DBI が正常に動作することを意味します
CGI スクリプトとして、Phone.pl は、ODBC の初期化コードの前に期待どおりに HTML を出力します。(ODBC 以外のスクリプトでは、Apache の設定は正常に機能します。)
Apacheのerror.logのメッセージは次のとおりです
[Tue Nov 23 13:27:57 2010] [error] [client 127.0.0.1] DBI connect('SQLSVR206','administrator',...) failed: [Microsoft][ODBC Driver Manager] データソース名が見つかりませんC:/CGI/Phone.pl 行 32 でデフォルトのドライバーが指定されていません (SQL-IM002)
なぜそれが異なる動作をするのか考えていますか?
#!c:/perl/bin/perl.exe
use CGI qw(:standard);
use strict;
use warnings;
use DBI;
my ($sqlstr, $sql_UNITED, $dbh206);
# 206
# select * from getProvFINON('270762789')#TIN
my @colUNITED = qw/ADR_LN_1_TXT PROV_SYS_ID ZIP_CD FULL_NM SOURCE PROV_TIN BILL_TEL/;
sub Init(){
$dbh206 = DBI->connect ("dbi:ODBC:SQLSVR206",'USER','PASSWORD',{RaiseError=>1})
or die $DBI::errstr;
$sqlstr = qq/ select * from getProvFINON(?) /; #parameters TIN
$sql_UNITED = $dbh206->prepare($sqlstr)
or die "prepare failed: " . $dbh206->errstr();
}
sub test1{
my $tin = shift();
$sql_UNITED->execute($tin) or die $sql_UNITED->errstr;
my $row = $sql_UNITED->fetchrow_hashref;
while(defined ($row)){
foreach(@colUNITED){
print $row->{$_}."~~~";
}
print "<p>";
$row = $sql_UNITED->fetchrow_hashref;
}
}
print header;
print "test text<p>";
Init();
test1('270762789');
print "999999999999<p>";
================================================== ======== 更新: 問題の一部は 32 ビット VS 64 ビット ODBC の問題です。http://support.microsoft.com/kb/942976 を参照してください。
ただし、ODBC をセットアップした後も、Apache ログに次のエラーが表示されます [Wed Nov 24 01:38:48 2010] [error] [client 127.0.0.1] DBI connect('SQLSVR206-32','',.. .) 失敗しました: [Microsoft][ODBC SQL Server ドライバー][SQL Server]ユーザー 'MYDOMAIN\GARY$' のログインに失敗しました。(SQL-28000) C:/CGI/test.pl 行 15
MYDOMAIN\administrator としてログインし、Apache を起動しました。ODBC は、「ネットワーク ログイン ID を使用した Windows NT 認証」を使用するようにセットアップされました。この「MYDOMAIN\GARY$」はどこから来たのですか? ありがとう!
================================================== ======== 最終更新: Apache サービスは「ローカル システム アカウント」を使用して実行されます。「MYDOMAIN\GARY$」の由来はそこにあります。問題は、GARY が会社に所属しておらず、彼の ID が SQL Server から削除されていることですが、CGI の ODBC コードが Apache から GARY を継承したため、エラー 28000 が発生しました。したがって、問題は 1) 32/64 ビットの ODBC DSN と2) Apache が使用するデフォルトのアカウント