クラシック ASP 経由で別のストアド プロシージャからストアド プロシージャを呼び出す際の問題
-
01-07-2019 - |
質問
私たちは単純に動作する古典的な ASP アプリケーションを持っていますが、とうの昔に死んだギリシャの神々の怒りを招かないように、コードを変更することを嫌いました。
最近、アプリケーションに機能を追加する必要がありました。機能の実装は実際には単なるデータベース操作であり、UI への変更は最小限で済みます。
UI を変更し、新しいデータ値を sproc 呼び出し (sproc1) に送信するように若干の変更を加えました。
ASP から直接呼び出される sproc1 では、たまたま別のサーバー sproc2 にある別の sproc への新しい呼び出しを追加しました。
どういうわけか、これは ASP アプリ経由では機能しませんが、SQL Management Studio では機能します。
技術的な詳細は次のとおりです。
- 両方のデータベース サーバー上の SQL 2005。
- SQL Login は、ASP アプリケーションから SQL 2005 Server 1 への認証を行っています。
- サーバー 1 からサーバー 2 へのリンク サーバーは動作しています。
- SQL Management Studio から sproc1 を実行すると、正常に動作します。コードが使用する同じユーザー (アプリケーション SQL ログイン) として認証されている場合でも。
- sproc2 は、SQL Management Studio から sproc1 とは独立して呼び出された場合に機能します。
- VBScript (ASP) は、XML で出力されたエラーをキャプチャしてクライアントに返します。エラー番号は 0、エラーの説明は空白です。ADODB.Connection オブジェクトと、ASP 側の VBScript で生成される Err.Number/Err.Description の両方から。
したがって、エラーも再現性もありません(つまり、SQL Mgmt Studio 経由) - この問題を知っている人はいますか?
現在の計画は、ASP 側のコードを分解して詳しく調べ、sproc1 を介して便乗するのではなく、ASP から直接 Server 2.sproc2 への完全に別個の呼び出しを行うことです。
解決
私の最初の反応は、これはクロスサーバー呼び出しの問題ではなく、最初のプロシージャから 2 番目のプロシージャを呼び出すことの問題ではないかということです。 これ 2 つの異なる環境で動作が異なるのは、これが原因である可能性があります。
私の最初の質問は次のとおりです。方程式からクロスサーバーの側面を取り除くとどうなるでしょうか?最初のプロシージャが 2 番目のプロシージャを呼び出すテスト システムをセットアップできたとしても、2 番目のプロシージャが同じサーバー上または同じデータベース上にある場合でも、同じ問題が発生しますか?
これと同じ方針で:私の経験では、アプリケーションと SSMS でこのように異なる結果が得られる場合、ストアド プロシージャの設定に問題があることがよくあります。ルークが言うように、それはノーカウントかもしれません。コード内の無関係な PRINT ステートメントによってこの種の現象が発生したことがありますが、PRINT された値がエラーの説明の一部になっていたことは覚えているようです (非常に直感に反しています)。
もし 何でも SSMS でこれを実行すると、メッセージ ウィンドウに が返されます。メッセージの出所を特定して停止します。専門用語を調べる必要がありますが、私の記憶では、クエリ環境が異なれば「エラー」に対する感度も異なり、SSSM 経由のデフォルト接続では、スクリプト言語からの ADO 接続が特定の時点でエラーをスローしないということです。 。
最後にもう 1 つ考えてみましょう。環境に問題がある場合は、ASP ページの接続文字列で別の設定を試してください。たとえば、OLEDB 接続がある場合は、ODBC を試してください。ネイティブおよび非ネイティブの SQL Server ドライバーを試してください。プロバイダーがサポートしている接続文字列オプションを確認し、試してみる価値がありそうなものを試してください。
他のヒント
持っていますか ノーカウントをオンに設定する 両方のストアド プロシージャに設定しますか?私も似たような問題に遭遇したことがあり、どうやって解決したかは今となっては正確に思い出せませんが、それが関係していることはわかっています。
あなたは次のような症状に苦しんでいる可能性があります ダブルホップ問題
ダブルホップの問題は、ASP/X ページが IIS サーバーとは異なるサーバー上にあるリソースを使用しようとする場合に発生します。
Windows NT チャレンジ/レスポンス サポートしません ダブルホップ偽装 (IIS サーバーに渡されると、同じ資格情報を認証のためにバックエンド サーバーに渡すことはできません)。
SQL Profiler を使用して、試行された 2 番目の接続を確認する必要があります。
手動テストでは、IIS を介して認証しないことに注意してください。この問題が現れるのは、ASP/X ページ経由で SQL を開始した場合のみです。
その他のリソース:
私も同様の問題を抱えていましたが、nocount をオンに設定し、print コマンドを削除することで解決しました。
コード例が役立つかもしれません :) ストアド プロシージャから 2 つのテーブルを返そうとしていますか。ADO 2.6 は返される複数のテーブルを処理できないと思います。
私はそれ(ダブルホップ)を検討しましたが、私が言及しているような sproc-in-a-sproc 呼び出しとINNER JOIN による典型的なクロスサーバー結合?どちらも、リンク サーバーの資格情報を使用し、サーバー 2 に対して認証されて、サーバー 1 で実行されます。
サーバー間での sproc の呼び出しが、データ テーブルでの結合の実行とは異なることを確認できる人はいますか?なぜ?
リンク サーバー構成が SQL アカウントである場合、それはダブルホップとみなされます (NTLM ダブルホップであるため?)
複数の結果セットが返されるかどうかという点では、いいえ。Server1.Sproc1 と Server2.Sproc2 は両方とも、.net の世界では "ExecuteNonQuery()" となり、何も返しません (結果セットも戻り値もありません)。
接続文字列で指定されたユーザーのデータベースへのアクセス許可を確認してください。SQL mgmt Studio の使用中にデータベースにログインするには、接続文字列で同じユーザー名を使用します。
アプリケーションをデバッグする効果的な方法となるため、中間値と例外を書き込むための一時テーブルを作成します。
確認していただけますか:sproc2 を追加しましたか?それまでは何年も問題なく動作していました。
sproc2 の呼び出し元を変更できないでしょうか?sproc1 内から呼び出すのではなく、ASP から呼び出すことはできますか?こうすることで、コード内で SQL への認証を制御できるため、サーバー上での信頼や共有リモート認証の設定に依存する必要がなくなります。
リンクサーバーはどのように設定されていますか?通常、リモート サーバーに対する認証方法については、現在ログインしているユーザーとしてログインするか、常に使用する SQL ログインを指定するなど、いくつかのオプションがあります。常に特定のアカウントを使用するように設定してみましたか?これにより、リモート プロシージャを呼び出す際に発生する可能性のある権限の問題が排除されるはずです...