1

問題: 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 を出力します。(ODBC 以外のスクリプトでは、Apache の設定は正常に機能します。)

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] データソース名が見つかりません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 ドライバー][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 が使用するデフォルトのアカウント

4

2 に答える 2

1

ODBC データソースが「システム DSN」ではなく「ユーザー DSN」の下にリストされている可能性があります。Web サーバーが実行する ID は、システム DSN にしかアクセスできないと思います。

私の投稿が意味をなさない場合に備えて、ユーザー DSN とシステム DSN の違いに関する情報へのリンクを追加するために編集しています: http://www.truthsolutions.com/sql/odbc/creating_a_new_odbc_dsn.htm

于 2010-11-23T22:24:13.280 に答える
0

Windows 7 ODBC接続に問題があり、私も理解できません。ODBCを設定すると、正常にテストされますが、表示されているのと同様のエラーが発生します。MS SQL Server Mgmt Studioを一部のSQLサーバーに接続する場合でも、追加の接続設定を明示的に入力する必要があります。一部のSQLサーバー(私が所有していない)でのみ問題が発生するため、サーバー側の問題だと思います。PERLで、私はついに諦め、上記の追加の接続設定を使用してDSNファイルを作成し、それを直接ポイントしました。サーバー名が2回存在することに注意してください。

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
于 2010-11-24T09:36:53.700 に答える