web-dev-qa-db-ja.com

リモートで実行した場合のRAISERRORの大文字と小文字の区別の動作

SSMSのローカルインスタンスを使用して接続できるリモートSQLServerがあります。

エラーを発生させるときは、

RAISERROR( 'This works', 16, -1 )

リモートでは、これはすべて大文字の場合、または1文字が大文字の場合でも正常に機能します。

raiserRor( 'Still works', 16, -1 )

ただし、すべて小文字を使用して実行しようとすると、機能しません

raiserror( 'Error', 16, -1 )

エラーメッセージを返します

メッセージ121、レベル20、状態0、行3
サーバーから結果を受信するときにトランスポートレベルのエラーが発生しました。 (プロバイダー:TCPプロバイダー、エラー:0-セマフォのタイムアウト期間が終了しました。)

小文字のraisrrorステートメントをコメントアウトしても、同じエラーメッセージで失敗します。

サーバーにログオンしてこれらのステートメントを実行すると、すべて機能します。これが問題になるのは、リモート接続したときだけのようです。

RAISERRORを完全に小文字にできないのはなぜですか?コメントしても?


サーバーは、Windows Server2012にSQLServer 2012 DeveloperEditionをインストールしたものです。

Microsoft SQL Server 2012-11.0.5058.0(X64)
2014年5月14日18:34:29
著作権(c)Windows NT 6.2(ビルド9200:)(ハイパーバイザー)上のMicrosoft Corporation Developer Edition(64ビット)

SQL Server Management Studio 2012および2014のローカルインストールを使用し、2005および2012の互換性レベルのデータベースに対してテストしましたが、同じ動作が発生します。

他のマシンでテストしたところ、同じ結果が得られました。私は現在、会社のネットワークの外でテストするためのマシンを持っていません。

2
Brandon

この問題は、実際にはSQL Serverの非常に古いバグに関連している可能性がありますが、SQLServer自体が直接原因ではありません。

私は見つけました このMSDNスレッド これはまったく同じ動作を説明しています

これの奇妙なことに注意してください:コメントに含まれていても、RAISERRORはコンパイルされません(接続がタイムアウトします)。

これは受け入れられた答えでした

SQLServerが接続されているネットワークには侵入防止システムがあることがわかりました。そのシステムには、次の説明を持つフィルターがあります。

このフィルターは、ポート1433でraisrrorプロシージャへのアクセスを検出します。MicrosoftSQLServerのraisrrorプロシージャには、バッファオーバーフローの脆弱性が含まれています。この脆弱性をリモートで悪用して、影響を受けるシステムで任意のコンピュータコードを実行できるため、攻撃者はサーバー。脆弱であることがわかっているプロシージャは、xp_sprintf、raiseerror()、およびformatmessage()です。オーバーランが悪用されると、コードはローカル管理者アカウントのコンテキストで実行されます。

このバグには古い MS Security Bulletin があり、同じ問題を説明している最近の TechNetスレッド があります。

ネットワーク上に、テキストraiserrorが含まれているものを除外していることに気付いていない可能性があります(ただし、チェックでは大文字と小文字が区別されるため、うまく機能していません)。バグが修正されたので、それは重要ではありません。

これはSQLServerの認識された動作ではないため、ネットワーク構成の問題である可能性があります。

3
Brandon