Perl-скрипт работает нормально в командной строке, но не работает на ODBC как CGI-скрипт
Проблема: 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 печатает 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] [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 \ Администратор и запустил Apache. ODBC был настроен на использование "С аутентификацией Windows NT с использованием идентификатора входа в сеть". Откуда взято это "MYDOMAIN\GARY$"? Спасибо!
================================================== ======== ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ: Службы Apache работают с использованием "Локальной системной учетной записи", и именно из этого и происходит "MYDOMAIN\GARY$". Дело в том, что GARY не связан с компанией, и его идентификатор был удален из SQL Server, но код ODBC в CGI унаследовал GARY от Apache, что привело к ошибке 28000. Таким образом, проблема заключалась в свертывании 1) 32/64 битного ODBC DSN и 2) учетная запись по умолчанию, используемая Apache
2 ответа
Возможно, источник данных ODBC указан в разделе "Пользовательский DSN", а не "Системный DSN". Я думаю, что личность, на которой работает ваш веб-сервер, имеет доступ только к System DSN.
Если мой пост не имеет смысла, я редактирую его, чтобы добавить ссылку на информацию о разнице между пользователями и системными DSN: http://www.truthsolutions.com/sql/odbc/creating_a_new_odbc_dsn.htm
Что-то не так с подключениями ODBC в Windows 7, которые я тоже не могу понять. Я бы настроил ODBC, и он будет работать нормально, но получит ту же ошибку, что и вы. Даже подключая MS SQL Server Mgmt Studio к некоторым SQL-серверам, я должен явно указать дополнительные параметры подключения. Так как у меня есть проблема только на некоторых серверах SQL (которыми я не владею), я думаю, что это проблема на стороне сервера. На PERL я наконец сдался и просто создал DSN-файл с указанными дополнительными настройками соединения и указал на него напрямую. Обратите внимание, как имя сервера там дважды.
use DBI;
use SQL::Abstract;
my $CONNECT = "FILEDSN=thefile.dsn";
my $dbh = DBI->connect("dbi:ODBC:$CONNECT", "myidsid", "passwordThatsNotUsed");
с файлом ODBC выглядит примерно так:
[ODBC]
DRIVER=SQL Server Native Client 10.0
UID=myidsid
Address=servername,3180
Network=DBMSSOCN
APP=Microsoft® Windows® Operating System
Trusted_Connection=Yes
SERVER=servername
PWD=someTextInPlaceOfPasswordAsItsNotUsed