タグ付けされた質問 「stored-procedures」

22
ストアドプロシージャは、世界最大のITソフトウェアコンサルティング会社の1つで悪い習慣ですか?
私は世界のトップ3のITコンサルティング会社の1つのプロジェクトで働いており、DBAから、会社のベストプラクティスのステートストアドプロシージャは「ベストプラクティス」ではないと言われました。これは私が学んだことすべてに反している。 ストアドプロシージャにより、コードの再利用、カプセル化(ソフトウェア開発の2つの柱)、セキュリティ(個々のストアドプロシージャに対するアクセス許可の付与/取り消しが可能)、SQLインジェクション攻撃からの保護、スピードの向上(DBAによるとSQL Server 2008以降では、通常のSQLクエリでも十分な回数実行されるとコンパイルされます)。 アジャイルソフトウェア開発方法論を使用して複雑なアプリを開発しています。誰もがストアドプロシージャを使用したくない理由を考えることができますか?私の推測では、DBAはこれらのストアドプロシージャを維持することを望んでいませんでしたが、そのような設計上の決定を正当化するには、あまりにも多くのネガが存在するようです。

6
ストアドプロシージャは3層の分離に違反しますか?
データベースはデータレイヤーに属しているのに対し、ストアドプロシージャはビジネスロジックであるため、データベース内のストアドプロシージャにビジネスロジックがあると、3層分離アーキテクチャに違反するという話を私の同僚から受けました。 ストアドプロシージャがなければ、世界は非常に厳しい場所になると思います。 彼らは本当に3層分離に違反していますか?

7
ストアドプロシージャの代わりにORMの使用を提案するにはどうすればよいですか?
私は、すべてのデータアクセスにストアドプロシージャのみを使用している会社で働いています。そのため、新しいプロシージャを実行する必要があるコミットごとにローカルデータベースの同期を維持するのは非常に面倒です。私は過去にいくつかの基本的なORMを使用しましたが、この経験ははるかに優れており、よりクリーンです。今後の開発のために何らかのORMを使用することを検討していることを開発マネージャーとチームの残りに提案したいと思います(チームの残りはストアドプロシージャに精通しており、他のことは一度も使用していません)。現在のアーキテクチャは、.NET 1.1のように記述された.NET 3.5です。ActiveRecordの奇妙な実装を使用し、コードビハインドファイルでループされる型指定のないDataSetを返す「ゴッドクラス」を使用します。クラスは次のように機能します。 class Foo { public bool LoadFoo() { bool blnResult = false; if (this.FooID == 0) { throw new Exception("FooID must be set before calling this method."); } DataSet ds = // ... call to Sproc if (ds.Tables[0].Rows.Count > 0) { foo.FooName = ds.Tables[0].Rows[0]["FooName"].ToString(); // other properties set …

5
ORMはリッチドメインモデルの作成を可能にしますか?
私のほとんどのプロジェクトでHibernateを約8年間使用した後、私はその使用を思いとどまらせ、ストアドプロシージャを介してのみDBと対話するアプリケーションを求めている会社に行きました。 数週間これを行った後、私が構築し始めているアプリケーションのリッチドメインモデルを作成することができず、アプリケーションは(恐ろしい)トランザクションスクリプトのように見えます。 私が発見した問題のいくつかは次のとおりです。 ストアドプロシージャは最小量のデータを読み込むだけなので、オブジェクトグラフをナビゲートすることはできません。つまり、フィールドが異なる類似したオブジェクトがある場合があります。たとえば、顧客からすべてのデータを取得するストアドプロシージャと、顧客からアカウント情報といくつかのフィールドを取得するストアドプロシージャがあります。 多くのロジックは最終的にヘルパークラスになるため、コードはより構造化されます(エンティティは古いC構造体として使用されます)。 ストアドプロシージャから結果セットを抽出し、エンティティに配置するフレームワークがないため、より退屈な足場コード。 私の質問は: 誰もが同様の状況にあり、ストアプロシージャアプローチに同意しませんでしたか?あなたは何をした? ストアドプロシージャを使用する実際の利点はありますか?「誰もドロップテーブルを発行できない」という愚かな点は別として。 ストアドプロシージャを使用してリッチドメインを作成する方法はありますか?オブジェクトグラフをナビゲートできるように、AOPを使用してエンティティにDAO /リポジトリを挿入する可能性があることを知っています。ブードゥー教に非常に近いので、このオプションは好きではありません。 結論 まず、答えてくれてありがとう。私が到着した結論は、ORMは(一部の人が述べたように)リッチドメインモデルの作成を有効にしないが、(多くの場合繰り返し)作業の量を単純化するということです。以下は結論のより詳細な説明ですが、ハードデータに基づいていません。 ほとんどのアプリケーションは、情報を要求して他のシステムに送信します。これを行うには、モデル用語で抽象化(ビジネスイベントなど)を作成し、ドメインモデルがイベントを送受信します。通常、イベントにはモデルからの情報の小さなサブセットが必要ですが、モデル全体ではありません。たとえば、オンラインショップでは、支払いゲートウェイはユーザーに請求するためにユーザー情報と合計を要求しますが、購入履歴、利用可能な製品、およびすべての顧客ベースは必要としません。そのため、イベントには小規模で特定のデータセットがあります。 アプリケーションのデータベースを外部システムとして使用する場合は、ドメインモデルエンティティをデータベースにマッピングできる抽象化を作成する必要があります(NimChimpskyが言及したように、データマッパーを使用)。明らかな違いは、各モデルエンティティのデータベース(レガシースキーマまたはストアドプロシージャ)へのマッピングを手作業で作成する必要があることです。2つは同期していないため、1つのドメインエンティティが部分的にマッピングされる可能性がありますデータベースエンティティ(たとえば、ユーザー名とパスワードのみを含むUserCredentialsクラスが他の列を持つUsersテーブルにマップされる)、または1つのドメインモデルエンティティが複数のデータベースエンティティにマップされる場合があります(たとえば、1対1の場合テーブルに1つのマッピングがありますが、1つのクラスにすべてのデータが必要です)。 エンティティが少数のアプリケーションでは、エンティティを横断する必要がない場合、追加の作業量は少ないかもしれませんが、エンティティを横断する条件付きの必要がある場合は増加します(したがって、ある種の「怠lazな」読み込み」)。アプリケーションが成長してより多くのエンティティを持つようになると、この作業は増加するだけです(そして、非線形に増加すると感じています)。ここでの私の仮定は、ORMを再発明しようとしないことです。 DBを外部システムとして扱うことの利点の1つは、アプリケーションの2つの異なるバージョンを実行し、各アプリケーションのマッピングが異なる状況を回避できることです。これは、本番環境への継続的な配信のシナリオでより興味深いものになります...しかし、これは、ORMでもそれほどではないかもしれません。 開発者は、データベースにアクセスできなくても、悪意のあるコードを挿入するだけで、システムに格納されている情報のほとんどではなくてもほとんどを取得できることに基づいて、セキュリティの側面を無視します。親愛なる主よ、顧客のクレジットカードの詳細を記録する行を削除するのを忘れたとは信じられません!)。 小さな更新(6/6/2012) ストアドプロシージャ(少なくともOracleの場合)では、テーブルの構造を変更するとプロシージャとトリガーが無効になるため、ダウンタイムがゼロの連続配信のようなことはできません。したがって、DBが更新されている間、アプリケーションもダウンします。Oracleは、このためのEdition-Based Redefinitionと呼ばれるソリューションを提供しますが、この機能について私が尋ねた少数のDBAは、実装が不十分であり、運用DBに配置しないと述べました。

6
いつストアドプロシージャを使用する必要がありますか?
私は私が移動する方が良いだろう(もしあれば)どのような状況では、コードとEntity Frameworkののメイク使用されているすべての私のビジネス・ロジックを、持っている場合は、いくつかのストアドプロシージャにビジネスロジックを、代わりのコードでそれをすべて保ちますか? 明確にするために、代わりにではなく、現在のセットアップ(コード内のビジネスロジック)と組み合わせて意味します。ストアドプロシージャですべてのビジネスロジックを使用することの長所と短所を求めている同様の質問を多数見ましたが、ビジネスロジックの残りを保持しながら、エッジケースロジックでストアドプロシージャを控えめに使用することについてはあまり知りませんでしたコードで。 違いがある場合は、MSSQLとEntity Frameworkを使用しています。 これらは、以前にストアドプロシージャを使用したことがある状況です。 実行に数分かかっていた複雑なレポート(これはWebアプリのページでした)。LINQが提供するものよりもはるかに効率的な(実行に数秒しかかからない)SQLを作成できることがわかりました。 Webアプリケーションは、アプリケーションに関係のない他の多くの機密情報を含む別のデータベースのいくつかのテーブルを読み書きする必要がありました。すべてにアクセスするのではなく、必要なことだけを行い、限られた情報のみを返すストアドプロシージャを使用しました。Webアプリケーションは、テーブルなどにアクセスせずに、このストアドプロシージャのみにアクセスできます。 この質問をする前に私が見た他の投稿: ストアドプロシージャは、世界最大のITソフトウェアコンサルティング会社の1つで悪い習慣ですか? Webアプリケーションのストアドプロシージャにすべてのビジネスロジックを保持することの長所と短所 /programming/15142/what-are-the-pros-and-cons-to-keeping-sql-in-stored-procs-versus-code /dba/2450/what-are-the-arguments-against-or-for-putting-application-logic-in-the-database/2452#2452 ORMを使用せず、ストアドプロシージャを使用する場合

5
ORMを使用せず、ストアドプロシージャを好む場合
PetaPoco micro-ORMを使用しています。ORMツールを使用してデータベースを操作するのは確かに非常に簡単で安全ですが、私が嫌いなのは余分なコードだけです。以前はほとんどのコードをデータベース自体に配置し、ストアドプロシージャ、トリガーなど、RDBMSのすべての機能を使用していました。 ストアドプロシージャ/トリガーでORMを使用しない場合、またはその逆の場合を知りたいです。

3
正しい結果が返されるTDDの方法
私は新しいプロジェクトを開始し、TDDを使用して設計を推進することに非常に一生懸命取り組んでいます。私は何年もプッシュしてきましたが、ついにこのプロジェクトに余分な時間を費やして、それを適切に行う方法を学びながら、それを使用することを承認しました。 これは、既存のシステムに結び付ける新しいモジュールです。現在、すべてのデータアクセスはWebサービスを介して行われます。Webサービスは、ほとんどの場合、データベースストアドプロシージャの単なる薄いラッパーです。 1つの要件は、特定のストアについて、このアプリケーションに対して有効と見なされるすべての発注書を返すことです。出荷日が店舗のオープン日から特定の範囲内にある場合、POは有効であると見なされます(これは新しい店舗の場合です)。 上記の制約が与えられた場合、このストアに適用できるダースを取得するためだけに100万のPOを戻すつもりはないので、このロジックをアプリケーションコードに入れることはできません。 日付範囲をGetValidPOsプロシージャに渡し、それらの値を使用して有効なPOを返すことができると考えていました。しかし、有効なPOと見なされるものに別の要件を追加するとどうなりますか? そして、どのようにこれをテストし、機能し続けることを確認しますか?ORMを使用していないため、起こりそうにありません。また、テストでDBを呼び出すことはできません。 立ち往生しています。 私の考えでは、有効なデータを返すモック、不良データを返すモック、不良データが発生した場合にローカルリポジトリに例外をスローさせ、無効なデータがGetValidPOs procによって返された場合に例外がスローされることをテストしますテストで使用されるモック)。 これは理にかなっていますか?または、より良い方法はありますか? 更新: EFを使用できるようです。ストアドプロシージャと複数のデータベースにデータを散在させることの困難さに依存しながら、使用方法を把握し、テスト可能にする必要があります。

4
ストアドプロシージャの命名規則 [閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 シニア開発者の一人は、「verbObject」タイプの命名(「GetMemberByID」)ではなく、「objectVerb」スタイルの命名(「MemberGetById」)などのストアドプロシージャの命名規則を使用する必要があると述べています。この標準の理由は、関連するすべてのストアドプロシージャがアクションではなくオブジェクトごとにグループ化されることです。 このように名前を付ける方法のロジックはわかりますが、この方法で名前が付けられたストアドプロシージャを見たのは初めてです。命名規則についての私の意見は、名前は自然に読むことができず、単語が何を言っているのか、手順が何をするのかを判断するのに時間がかかるというものです。 これについてどう思いますか?ストアドプロシージャに名前を付けるより一般的な方法はどれですか?また、どのタイプのストアドプロシージャの命名規則を使用しましたか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.