他の答えを要約する
ここに他の人が以前にここで言ったことの簡単な要約があります。
プロ企業ポリシー:
- データベースオブジェクト間の依存関係と、計画された変更がスキーマに与える影響の概要を追跡できます。
- DBAチームは、アプリケーションのアクセス権を確認および制御できます。
- DBAチームは、変更によるパフォーマンスへの影響を予測できます。
- アプリケーションコードからデータベースを分離します。
- 壊れたウィンドウ理論...それは彼らがコードを編成する方法であり、一貫性を壊すことはインフラストラクチャーを新規参入者が理解することを困難にし、彼らが品質を尊重し、努力することを少なくします。
- あなたはあなたにあなたがするように頼まれた事をするための給料をもらいます。これは会社の方針であり、現在、あなたにはそれを変更する権限がありません。
対会社方針:
- この会社の考え方は非常に厳格で独断的であり、そのポリシーは開発者の作業を不必要に面倒なものにします。残念ながら、長所セクションの最後のポイントを参照してください。
- 以下のようback2dosは言って、それを指し、「データベースに対して行われたすべてのクエリの場合、ストアドプロシージャをルックアップする必要があり、」別の開発者がストアドプロシージャが自分のために再利用することができないアイデアを持っていないため、ストアドプロシージャのみのポリシーは、多くの場合、コードの重複になり手元の問題;
- また、皮肉にも前のケースとは逆に、あるアプリケーションがsprocを所有し、別のアプリケーションがそれを再利用し、最初のアプリケーションが他の誰がそれに依存し始めたかを知らずにそれを更新すると、問題も発生します。DBAは、DBサーバールームの壁よりも先に依存関係を追跡しないため、どのアプリがそれ以外に依存しているのかを気にしてはいけません。問題がアプリケーションチーム間で追跡されない場合、DBAが対象になります。
THOSE 2セント
まず、ここでの多くの回答では、標準という単語を使用しています。直接クエリを禁止し、sprocのみを許可する慣行は、標準と呼ばれていません。これはポリシーです(jzdの回答を参照)。
第二に、あなたの問題に固有です:ストアドプロシージャを排他的に使用するというこのような制限的なポリシーに対する私の主な反対の議論は、SQL言語自体であり、必ずしもそれが促進する集中型のビジネスロジックリポジトリインフラストラクチャではありません(反対論もあります)。 。
SQLはかなり厳密で構成できない言語であり、表現力は非常に限られています。これは、コードの再利用性に関して、非常に早い段階で行き止まりに直面することを意味します。この厳格さの理由の1つは、(ポリモーフィズムを使用するOOP言語のように)ファーストクラスの関数を渡す方法がないため、構成可能性が大幅に制限されるためです。表現力でそれに最も近い方法は、文字列連結を使用して構築された動的SQLクエリを記述することです。きちんとしたことではありません。動的クエリは、DBオブジェクト間の依存関係の追跡など、「長所」セクションのいくつかのポイントを無効にし、通常はパフォーマンスが低下し、エラーが発生しやすく、デバッグが困難で、SQLインジェクション攻撃のリスク。残念ながら、SQLを使用すると、壁にぶつかって動的に実行されるクエリに頼らざるを得ずに、sproc間で共通の再利用可能なロジックを抽出することは非常に困難です。
更新:最初のクラス関数のほかに、ストアドプロシージャのもう1つの大きな制限は、リスト、セット、レコード、またはキーと値のペアのいずれであっても、複合データ型を引数として渡すことと返すことです。これは、コンポーザビリティを著しく損ないます。
最後に、上記のプロポイントの1つであるJorgeの「DBをアプリケーションから切り離す」に必ずしも同意するわけではありません。カスタムAPIを使用するのではなく。SprocはこのようなカスタムAPIであり、ユーザーとプリミティブリレーショナルデータの中間にあり、一般的な構成可能なデータ操作プリミティブ(select、join、where、group by)を使用してクエリします。、など)。SQL自体は、上記の厳格性のため、構成可能なデータ操作プリミティブのDSLとして理想的な選択ではありませんが、より適切な言語の選択(.NET Linq ...またはLisp / Clojureなど)を使用すると、単純なリストに対するロジックは、DB ResultSetに対するものと同じです。明らかに、それによってテストが容易になります。これは良いことです。単純なCSVでスタブできるように、データストアは単純でプリミティブであることが望ましいと私は言います。ご覧のように、このモデルはDBをアプリケーションからも切り離しますが、抽象化のより低いレベルで線を引くだけです。
次はどうする?
これは質問とは少し関係ありませんが、上記の観察のいくつかに沿って、データの保存とクエリを行う興味深い斬新なアプローチであるDatomicをご覧になることをお勧めします。(もちろん、私はそれで平均を見厳密外の作業環境最初に...間違いない、NOT翌日CTOのオフィスに行くと言うやあみんな、私はDatomicであなたのストアドプロシージャの一部を書き直しました」と比べてこのピカピカのprodサーバー上に展開します!、そこは本当にクール」を見ています彼らは、そうでない場合は、完全に理解興奮を理解していないかもしれません。)