Проблема: Perl-скрипт отлично работает в командной строке, но не работает на ODBC как CGI-скрипт.
Настройки: Win XP Pro 64-битная версия 2003 SP2 Apache 2.2.17 Win32 Active Perl 5.12.2 (не Perl64) DSN ODBC создан для SQL SERVER
Подробно: из командной строки Phone.pl работает нормально - он получает результаты запроса, как и ожидалось - это означает, что DBI отлично работает
как CGI-сценарий,Phone.pl печатает HTML, как и ожидалось, перед кодом инициализации ODBC.(Настройки Apache работают нормально для сценария, отличного от ODBC.)
вот сообщение об ошибке в файле error.log Apache
[вторник, 23 13:27:57 2010] [ошибка] [клиент 127.0.0.1] Не удалось подключиться к DBI («SQLSVR206», «администратор», ...): [Microsoft] [Диспетчер драйверов ODBC] Не найдено имя источника данных и не указан драйвер по умолчанию (SQL-IM002) в C: / CGI / Phone.pl строка 32
Есть идеи, почему он ведет себя по-разному?
#!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 [Ср 24 Ноя 01:38:48 2010] [ошибка] [клиент 127.0.0.1] Соединение DBI (Ошибка «SQLSVR206-32», «, ...): [Microsoft] [Драйвер ODBC SQL Server] [SQL Server] Ошибка входа для пользователя« MYDOMAIN \ GARY $ ».(SQL-28000) в строке C: /CGI/test.pl 15
Я вошел в систему как MYDOMAIN \ administrator и запустил Apache.ODBC был настроен на использование «С аутентификацией Windows NT с использованием идентификатора входа в сеть». Откуда взято это «MYDOMAIN \ GARY $»?Спасибо!
=============================================================== ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ: Службы Apache работают с использованием «учетной записи локальной системы», и именно отсюда и происходит «MYDOMAIN \ GARY $».Дело в том, что GARY не связан с компанией, и его идентификатор был удален из SQL Server, но код ODBC в CGI унаследовал GARY от Apache, что привело к ошибке 28000. Таким образом, проблема заключалась в свертывании 1) 32/64 битного ODBC DSN и2) учетная запись по умолчанию, используемая Apache