问题: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。(Apache 设置适用于非 ODBC 脚本。)
这是 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] Data source name not found并且在 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 Driver][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 使用的默认账户