ストアドプロシージャで動的SQLを使用したくないのはなぜですか?


13

動的SQLを使用したくないと言った人がいました。具体的な例や実際の例を挙げていただけますか?個人的には、データベースに数回コーディングします。柔軟性があるので大丈夫だと思います。私の推測では、SQLインジェクションまたはパフォーマンスについてです。他に何か?

回答:


7

必要に応じて、動的SQLの使用に問題はありません。実際、状況によっては、それが唯一の選択肢です。入力がサニタイズされていない場合はSQLインジェクションにつながる可能性があり、頻繁に呼び出されるモジュールで動的SQLを使用するとパフォーマンスが低下する可能性があるため、これを使用しないことをお勧めします。

それ自体は具体的な例はないと思いますが、私はこう言います:最初に通常のクエリとステートメントを使用した後、現在の状態を達成するようにしてください。動的SQL文字列の実行は、それを呼び出しているモジュールへの別のユーザーセッションで行われることに注意してください。予期しないアクセス許可の問題が発生する可能性があります。

あなたがパフォーマンスを心配している場合; 試して。セキュリティが心配な場合; 入力を検証します。正しいか間違っているかはありません。それは、その時点で利用できる情報とツールに基づいて最善の判断をすることだけです。


5

動的SQLはツールです。そして、それはツールとして、いくつかのアプリケーションを持っています-たとえば、管理作業にとってそれは恵みです。

特に、生成されたコードのパラメーター化を管理しなかった場合は、アプリケーションが使用するSPではあまり良くありません(SQL Serverの最新バージョンは問題を軽減しましたが、まだ有効です)。

ここでは詳しく説明しませんので、動的SQLの問題に関する優れた記事、MVP Erland Sommarskogによる動的SQLの呪いと祝福をお勧めします。


1
私もそのリンクを共有するつもりでしたが、動的SQLの使用を検討している人は必ず読んでください。
HLGEM 2012

1

これはほとんどのdbms機能と同様です。適切な状況で使用するとうまく機能し、間違った状況では十分に機能しません。

長所:いくつかのことは、それなしでは実行できません。通常、これは管理作業用であり、アプリケーションコードではないことがわかりました。一部のシステムコマンドでは、パラメーターを入力として使用できません。したがって、たとえば、データベースが不明な多くのインスタンスで、すべてのデータベースに対してsprocを介して何かを実行する必要があり、コマンドがパラメーターを受け入れない場合、通常は動的SQLによってこれを解決します。ただし、これはMSSQLよりもSybase ASEの方が重要です。

短所:すでに知っていると思うので、詳しくは説明しませんが、SQLインジェクションを正しく使用しないと、リスクが生じる可能性があります。私にとってより大きなものは、クエリはそれが何であるか、ユニークなアドホッククエリのように扱われ、コンパイルされたクエリプランの一部ではないということです。たまに実行されるものについては、大したことはありません。1分間に数百回実行され、多くの一意のSQLが存在するものの場合、多くの新しい、潜在的に不要なクエリプランが生成され、サイクルを消費し、プランキャッシュの有効時間を短縮します。


Sybase ASEでのアプリケーションの優れた使用法は、ピボットする値がわからないピボットです。これはストアドプロシージャで動的SQLを使用して実行できますが、私の知る限り、Sybase ASEはこれをクエリとして直接実行する構文をサポートしていません。値がわかると、クエリを書き込んでデータをピボットできます。
richardcrossley

-7

動的SQLを使用しないでください。

ストアドプロシージャでオプションのパラメーターを使用する方法に関する知識がないため、動的SQLが使用される時間の99%、残りの1%は、顧客が理解していないレポートの非常に複雑なクエリの作成に使用されますさえ。動的SQLの呪いと祝福は、なぜそれを使用するのが良い考えの例を示していませんが、SQLのセキュリティリスクは言うまでもなく、デバッグ、保守が複雑になるため、問題があることを示唆しています。インジェクション、パフォーマンスの低下はないので、キャッシュが、一時テーブルとカーソルを使用してのようにそれに付属している悪い習慣どのコースの怠惰ナイーブプログラマーは虐待するでしょう。このようにクエリを作成する柔軟性などはありません。SQLは宣言型言語であり、そのように扱う必要があります。

怠惰はすべての悪の根です。

逆説的に言えば、この回答は最も投票数の少ないものにランクインすることになります


実際、この記事は、動的SQLの理想的な使用例の少なくとも1つの例を提供し、「そのようにクエリを記述する柔軟性はない...」は真実ではありません-動的SQLがまさにこれを可能にします柔軟性。
LowlyDBA

オプションのパラメーター?あなたは意味アンチパターンを?
フォレスト

@LowlyDBAこの記事は少なくとも1つの例を提供します。これまでに見た最も単純なSELECT、それが解決する複雑な問題は何ですか?そして柔軟性のために、はい、それらの素朴なプログラマのために。
Ivanzinho

@Forestを「アンチパターン」と呼ぶのはなぜですか?あなたが提供したリンクはそれを決して言っておらず、またロジックがダイナミックSQLに書き直された後にどれほどの改善がなされたかを示すことは決してないので(この場合、クエリを維持することの雪だるま式の影響と比較して重要ではありません)
Ivanzinho

これは(悪い)意見ベースの回答である。記述している問題の具体的な例を提供しておらず、動的SQLを使用するという
長所
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.