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
Другие вопросы по тегам