Perl-скрипт работает нормально в командной строке, но не работает на ODBC как CGI-скрипт - PullRequest
1 голос
/ 24 ноября 2010

Проблема: 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

Ответы [ 2 ]

1 голос
/ 24 ноября 2010

Возможно, источник данных ODBC указан в разделе «Пользовательский DSN», а не «Системный DSN».Я думаю, что удостоверение, на котором работает ваш веб-сервер, имеет доступ только к System DSN.

Если мое сообщение не имеет смысла, я редактирую его, чтобы добавить ссылку на информацию о разнице.между DSN пользователя и системы: http://www.truthsolutions.com/sql/odbc/creating_a_new_odbc_dsn.htm

0 голосов
/ 24 ноября 2010

Что-то не так с подключениями 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
...