いくつかの観察
ストアドプロシージャは、コードの再利用とカプセル化(ソフトウェア開発の2つの柱)を提供します。
それらが使用されることになっているコンテキストでそれらを正しく使用する場合のみ。関数(構造化プログラミング)またはメソッド(オブジェクト指向プログラミング)についても同じ主張が言えますが、1K関数と巨大なオブジェクトがあります。
アーティファクトはあなたにそれらの利点を与えません。これらのアーティファクトを適切に使用することが、これらのメリットをもたらします。
セキュリティ(個々のストアドプロシージャに対する権限を付与/取り消しできます)、
はい。これは良い点であり、ストアドプロシージャが好きな主な理由の1つです。これらは、ビューとユーザーアカウントだけで通常達成できるものよりもきめ細かなアクセス制御を提供します。
SQLインジェクション攻撃から保護します。
パラメーター化されたSQLステートメントと入力スクラブで同じレベルの保護を実現できるため、これはSPに固有のものではありません。ただし、「セキュリティの詳細」の問題として、SPに加えてSPを使用します。
また、速度の向上にも役立ちます(ただし、DBAは、SQL Server 2008以降、通常のSQLクエリでも十分な回数実行されるとコンパイルされると述べています)。
これはデータベースベンダー固有のものですが、一般的にDBAは正しいです。SQLステートメント(静的またはパラメーター化されたもの)はコンパイルされます。SPは、単純なSQLステートメントでは実行できないデータを集計および計算する必要がある場合に役立ちますが、SQLと緊密に統合されており、アプリサーバーへのラウンドトリップを保証しません。
良い例は、別のSQL自体を実行するための一時的なカーソルにデータをクエリすることです。アプリサーバーでプログラムで実行することも、dbで実行することで複数のラウンドトリップを保存することもできます。
ただし、これは標準ではありません。これらのケースが多数ある場合、それは悪いデータベース設計の兆候です(または、部門間であまり互換性のないデータベーススキーマからデータを引き出しています)。
アジャイルソフトウェア開発方法論を使用して複雑なアプリを開発しています。
敏ility性は、テクノロジーではなく、ソフトウェアエンジニアリングプロセスと要件管理に関係しています。
誰もがストアドプロシージャを使用したくない理由を考えることができますか?
間違った質問
質問は間違っており、「GOTOを使用しない正当な理由はありますか?」このテーマに関しては、ダイクストラよりもニクラウス・ワースの側にいます。ダイクストラの感情はどこから来たのかは理解できますが、すべての場合に100%適用できるとは思いません。ストアプロシージャおよびその他のテクノロジでも同じです。
ツールは、意図した目的に適切に使用され、特定のタスクに最適なツールである場合に適しています。それ以外の方法で使用することは、ツールが間違っていることを示すものではありませんが、使用者は自分が何をしているかを知りません。
適切な質問は、「どのような種類のストアドプロシージャの使用パターンを避ける必要があるか」です。または、「条件はI(またはすべきでない)ストアドプロシージャを使用すべきか下」。テクノロジーを使用しない理由を探すのは、エンジニアの責任をエンジニアリングの責任に直接置くのではなく、単にツールに責任を負わせることです。
言い換えれば、それは警戒または無知の声明です。
私の推測では、DBAはこれらのストアドプロシージャを維持することを望んでいませんでしたが、そのような設計上の決定を正当化するには、あまりにも多くのネガが存在するようです。
そのとき彼らがしていることは、彼らの悪いエンジニアリング決定の結果を彼らが不十分に使用したツールに投影することです。
あなたの場合はどうしますか?
私の経験は、ローマにいるとき、ローマ人と同じようにしています。
戦わないでください。あなたの会社の人々がストアprocを悪い慣習として分類したいなら、彼らに任せましょう。ただし、これはエンジニアリングプラクティスの危険を招く可能性があることに注意してください。
悪い慣習としての物事の典型的なラベル付けは、通常、無能なプログラマーがたくさんいる組織で行われます。特定のものをブラックリストに登録することにより、組織は自分の無能によって内部的に与えられる損害を制限しようとします。クソじゃない
一般化は、すべてのねじ込みの母です。ストアドプロシージャ(または任意の種類のテクノロジ)は悪い習慣であると言って、それは一般化です。一般化は、無能な人のための警戒です。エンジニアはあからさまな一般化を行いません。彼らは、問題を解決することになっている状況で、ケースバイケースで分析を行い、分析のトレードオフを行い、手元の事実に応じてエンジニアリングの決定とソリューションを実行します。
優れたエンジニアは、このような一般化された方法で物事を悪い慣行として分類しません。彼らは問題を見て、適切なツールを選択し、トレードオフを行います。言い換えれば、彼らはエンジニアリングを行います。
それらを使用しない方法に関する私の意見
データ収集(およびおそらくいくつかの変換)以外の複雑なロジックを配置しないでください。それらにいくつかのデータマッサージロジックを配置したり、複数のクエリの結果を集約したりすることは問題ありません。しかし、それはそれについてです。それを超えるものは、ビジネスロジックとして適格であり、他の場所に存在する必要があります。
SQLインジェクションに対する唯一の防御メカニズムとしてそれらを使用しないでください。何か悪いことが起こった場合に備えてそこに残しますが、それらの前には多数の防御ロジックが必要です-クライアント側の検証/スクラビング、サーバー側の検証/スクラビング、おそらくあなたの中で意味のある型への変換ドメインモデル、最後にパラメータ化されたステートメント(パラメータ化されたSQLステートメントまたはパラメータ化されたストアドプロシージャ)に渡されます。
データベースを、ストアプロシージャを含む唯一の場所にしないでください。ストアプロシージャは、C#またはJavaソースコードを処理するのと同じように処理する必要があります。つまり、ソースはストアプロシージャのテキスト定義を制御します。人々は、ストアプロシージャをソースコントロールできないことをります-強気、彼らは単に彼らが話している血まみれの地獄を知りません。
それらをどのように/どこで使用するかについての私の意見
アプリケーションには、複数のクエリまたはビューから転置または集計する必要があるデータが必要です。これをアプリケーションからデータベースにオフロードできます。ここでは、a)データベースエンジンはこれらのことを行うアプリサーバーよりも効率的ですが、 b)アプリサーバーは(場合によっては)水平方向に拡張しやすいため、パフォーマンス分析を行う必要があります。
きめ細かいアクセス制御。データベースでデカルト結合を実行するバカは必要ありませんが、同様に任意のSQLステートメントを実行することを禁止することはできません。典型的なソリューションは、開発環境とUAT環境で任意のSQLステートメントを許可し、systestおよび実稼働環境ではそれらを禁止することです。systestまたはプロダクションに到達する必要があるステートメントは、開発者とdbasの両方によってコードレビューされたストアプロシージャに入ります。
ストアプロシージャにない SQLステートメントを実行する有効な必要性は、異なるユーザー名/アカウントと接続プールを使用します(使用状況は厳しく監視され、推奨されません)。
- Oracleのようなシステムでは、LDAPへのアクセスを得ることができ、または外部データベースへのシンボリックリンクを作成します(VPN経由でのビジネスパートナーのDBに格納PROCを呼び出すと言う。)スパゲッティコードを実行する簡単な方法を、それは、すべてのプログラミングパラダイムのために本当の、そして時には特定のビジネス/環境要件があり、これが唯一のソリューションです。ストアプロシージャは、アプリサーバーに移動することなく、データに近い1か所だけでその厄介さをカプセル化するのに役立ちます。
これをストアプロシージャとしてdbで実行するか、アプリサーバーで実行するかは、エンジニアとして行う必要があるトレードオフ分析に依存します。両方のオプションを分析し、何らかの分析で正当化する必要があります。単に他の選択肢を「悪い習慣」として非難することによって、何らかの形で進んでいくことは、単なる不十分なエンジニアリングのコップアウトです。
- アプリサーバーを単純にスケールアップできない状況(つまり、新しいハードウェアまたはクラウドインスタンスの予算がない)で、dbバックエンドに十分な容量がある場合(これは多くの人が認めたいと思うより一般的です) procを保存するためにビジネスロジックを移動します。きれいではなく、貧弱なドメインモデルにつながる可能性があります...しかし、それでも...トレードオフ分析、ほとんどのソフトウェアハックが吸い込むもの。
それが永続的な解決策になるかどうかにかかわらず、それはその特定の瞬間に観察される制約に固有のものです。
それが役に立てば幸い。