3

単純に機能する古典的なASPアプリケーションがあり、長い間亡くなったギリシャの神々の怒りを呼び起こさないように、コードを変更することを嫌がっています。

最近、アプリケーションに機能を追加する必要がありました。機能の実装は、実際には単なるデータベース操作であり、UIへの変更は最小限で済みます。

UIを変更し、小さな変更を加えて、新しいデータ値をsproc呼び出し(sproc1)に送信しました。

ASPから直接呼び出されるsproc1で、別のサーバーsproc2にある別のsprocへの新しい呼び出しを追加しました。

どういうわけか、これはASPアプリでは機能しませんが、SQLManagementStudioでは機能します。

技術的な詳細は次のとおりです。

  1. 両方のデータベースサーバー上のSQL2005。
  2. SQLログインは、ASPアプリケーションからSQL 2005Server1への認証を行っています。
  3. サーバー1からサーバー2にリンクされたサーバーが機能しています。
  4. SQLManagementStudioからsproc1を実行する場合-正常に動作します。コードが使用するのと同じユーザーとして認証されている場合でも(アプリケーションのSQLログイン)。
  5. sproc2は、SQLManagementStudioからsproc1とは独立して呼び出された場合に機能します。
  6. VBScript(ASP)は、XMLでクライアントに返されるエラーをキャプチャします。エラー番号は0、エラーの説明は空白です。ADODB.Connectionオブジェクトから、およびASP側からVBScriptで生成されるErr.Number/Err.Descriptionからの両方。

したがって、エラーも再現性もありません(つまり、SQL Mgmt Studioを使用)-誰かが問題を知っていますか?

現在の計画では、ASP側のコードを分解して掘り下げ、sproc1を介してピギーバックしようとするのではなく、ASPから直接サーバー2.sproc2を完全に個別に呼び出します。

4

9 に答える 9

3

両方のストアド プロシージャで set nocount を設定しましたか? 私はかつて同様の問題を抱えていましたが、現時点でどのように解決したか正確には思い出せませんが、それが何か関係があることはわかっています!

于 2008-09-20T10:55:50.247 に答える
1

あなたはダブルホップの問題に苦しんでいる可能性があります

ダブルホップの問題は、ASP/XページがIISサーバーとは異なるサーバーにあるリソースを使用しようとした場合に発生します。

Windows NTチャレンジ/レスポンスは、ダブルホップの偽装をサポートしていません(IISサーバーに渡されると、認証のために同じ資格情報をバックエンドサーバーに渡すことはできません)。

SQLプロファイラーを使用して、試行された2番目の接続を確認する必要があります。

手動テストでは、IISを介して認証していないことに注意してください。この問題が発生するのは、ASP/Xページを介してSQLを開始した場合のみです。

その他のリソース:

于 2008-09-20T08:16:32.547 に答える
0

リンクサーバーはどのように設定されていますか?通常、リモートサーバーへの認証方法については、現在ログインしているユーザーとしてログインする方法や、常に使用するSQLログインを指定する方法などのオプションがあります。常に特定のアカウントを使用するように設定してみましたか?これにより、リモートプロシージャを呼び出す際に発生する可能性のあるアクセス許可の問題が解消されます。

于 2008-09-20T14:04:56.920 に答える
0

私の最初の反応は、これはクロスサーバーの呼び出しの問題ではなく、最初のprocの呼び出しの問題であり、2つの異なる環境で異なる動作をし ている可能性があるということです。

私の最初の質問はこれです:方程式からクロスサーバーの側面を削除するとどうなりますか?最初のprocが2番目のprocを呼び出すテストシステムをセットアップできたが、2番目のprocが同じサーバー上および/または同じデータベース内にある場合でも、同じ問題が発生しますか?

これらの同じ方針に沿って:私の経験では、アプリケーションとSSMSがそのように異なる結果を取得した場合、それは多くの場合、ストアドプロシージャの設定の問題でした。ルークが言うように、それはNOCOUNTかもしれません。この種のことは、コード内の無関係なPRINTステートメントから発生しましたが、PRINTされた値がエラーの説明の一部になったことを覚えているようです(非常に直感に反します)。

SSMSでこれを実行したときにメッセージウィンドウに何かが返された場合は、それがどこから来ているのかを調べて停止させます。専門用語を調べる必要がありますが、クエリ環境が異なれば「エラー」に対する感度も異なり、SSSMを介したデフォルトの接続では、スクリプト言語からのADO接続が発生する特定の時間にエラーが発生しないことを思い出します。 。

最後に、環境に問題がある場合は、ASPページの接続文字列でさまざまな設定を試してください。たとえば、OLEDB接続がある場合は、ODBCを試してください。ネイティブおよび非ネイティブのSQLServerドライバーを試してください。プロバイダーがサポートしている接続文字列オプションを確認し、試してみる価値があると思われるオプションを試してください。

于 2008-09-20T22:14:21.440 に答える
0

接続文字列で指定されたユーザーのデータベースへのアクセス許可を確認してください。sql mgmt studioを使用しているときにデータベースにログインするには、接続文字列で同じユーザー名を使用します。

アプリケーションをデバッグする効果的な方法になる可能性があるため、中間値と例外を書き込むための一時テーブルを作成します。

于 2008-09-20T10:44:39.007 に答える
0

サンプルコードが役立つかもしれません:)ストアドプロシージャから2つのテーブルを返そうとしていますか。ADO2.6は返される複数のテーブルを処理できないと思います。

于 2008-09-20T08:24:13.153 に答える
0

私はそれを考慮しました(ダブルホップ)が、私が言及しているようなsproc-in-a-sproc呼び出しと、INNER JOINを介した一般的なクロスサーバー結合の違いは何ですか?どちらも、リンクサーバーの資格情報を使用してサーバー1で実行され、サーバー2への認証が行われます。

sprocクロスサーバーを呼び出すことは、データテーブルで結合を行うこととは異なることを誰かが確認できますか?なぜ?

リンクサーバーの構成がSQLアカウントである場合、それはダブルホップと見なされます(参照しているのはNTLMダブルホップであるため)。

複数の結果セットが戻ってくるかどうかという点では、いいえ。Server1.Sproc1とServer2.Sproc2はどちらも.netワールドでは「ExecuteNonQuery()」であり、何も返しません(結果セットも戻り値もありません)。

于 2008-09-20T08:26:00.480 に答える
0

確認できますか: sproc2 を追加しましたか? それ以前は、何年もの間正常に機能していました。

sproc2 の呼び出し元を変更できませんか? sproc1 内から呼び出すのではなく、ASP から呼び出すことはできますか? そうすれば、コード内で SQL に対する認証を制御でき、サーバー上での信頼や共有リモート認証の設定に依存する必要がなくなります。

于 2008-09-20T12:44:43.073 に答える