ORMを使用せず、ストアドプロシージャを好む場合


13

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

ストアドプロシージャ/トリガーでORMを使用しない場合、またはその逆の場合を知りたいです。


6
個人的にトリガーに関する問題(特に、ストアドプロシージャには当てはまりません)は、DB上のデータがどのように操作されるかによって「ビジネスアクション」がどのように発生したかを「推測」しようとすることです。「ARTICLES」テーブルのPRICE列を変更した場合、それがなぜなのか本当にわかりません。ユーザーは入力ミスした値を修正するだけですか?それは値下げですか?1日だけの特別オファーですか?トリガーはそれらすべてを推測する必要があります。
ヨアヒムザウアー

回答:


16

ORM(オブジェクトリレーショナルマッピング)は、ストアドプロシージャと相互に排他的ではありません。ほとんどのORMはストアドプロシージャを利用できます。ほとんどのORMは、必要に応じてストアドプロシージャを生成します。したがって、問題はどちらでもありません。

ORMは(パフォーマンスの点で)許容できないSQLを生成する可能性があり、手作りのSQLでそのSQLをオーバーライドしたい場合があります。これを実現する方法の1つは、SP(ストアドプロシージャ)を使用することです。

DotNetでは、次の場合にストアドプロシージャを使用しないでください。

  • ストアドプロシージャに慣れていない場合(あなたの場合ではなく、完全を期すために含まれています)。

  • 複雑なレイヤーを導入したくない場合は、プロジェクトを複雑にします。

  • 異なるデータベースで動作するアプリケーション、または複数のデータベースサーバー間で複製する必要があるアプリケーションを作成しています(この最後の制限は一部のデータベースにのみ適用される場合があります)。

トリガーはORMと比較されないことに注意してください。トリガーは、アプリケーションコードにはない方がよい機能を実行します(データベース間でのデータのロギングや同期など)。

セキュリティなどのさまざまな理由(たとえば、SQLインジェクションを防ぐため)および要求される速度のために、コードではSQLよりもストアドプロシージャの使用を好む人もいます。ただし、これは多少議論の余地があり、詳細な議論が必要です。

ORMがストアドプロシージャを生成できず、大規模なシステムを作成する必要がある場合は、ケースに基づいて追加のハンドコーディングを重み付けする必要があります。


2
セキュリティの議論はSQLインジェクションに関連するのではなく、パーミッションに関連すると思います(つまり、データベースにアクセスするユーザーの特定のストアドプロシージャのパーミッションを管理するのは簡単ですが、テーブル、列、行はより困難または不可能です)。それでも、セキュリティの議論は議論の余地があります。
アルセニムルゼンコ

@MainMa、コメントありがとうございます。:私の理解では、この記事の通りのSPを使用して、1が埋め込まれたパラメータを持つパラメータ化ストアドプロシージャを使用することによって、SQLインジェクションのリスクを減らすことができるということですpalpapers.plynt.com/issues/2006Jun/injection-stored-procedures
NoChance

2
ストアドプロシージャは、SQLインジェクション攻撃に対する脆弱性にほとんど影響を与えません。古い神話は一生懸命に死にます。
リグ

@Rig 1、あなたのコメントをありがとう、私はあなたがこれについてどう思うかについてもっと学びたいです。私の理解は、少なくともこのテキストから得られます。「ストアドプロシージャとパラメーター化されたコマンドを使用し、動的SQLを回避し、すべてのユーザーのアクセス許可を制限することで、SQL Serverインジェクション攻撃を阻止できます。」表示されていることをmsdn.microsoft.com/en-us/library/bb669057.aspx
NoChance

@EmmadKareemパラメーター化されたsqlは、それを安全にするための大きなステップです。私はこの男がpalpapers.plynt.com/issues/2006Jun/injection-stored-proceduresを合理的なケースにしていると思います。「Stored Procedure SQL Injection」で検索すると、多くのヒットが見つかります。入力をサニタイズすることは常に良いことであり、多くのプラットフォームは合理的にそれを行うための組み込みの方法を提供します。
リグ

13

多くの場合、 ORMデータベースは、ORMを提供するために存在していることを前提としています。しかし、通常、データベースは会社にサービスを提供するために存在し、複数の言語で書かれた何百ものアプリがヒットする場合があります。

ただし、ストアドプロシージャを呼び出せないORMを使用している場合は、「ORMとストアドプロシージャ」の場合にすぎません。それ以外の場合は、ビジネスロジックをコーディングする場所を決定する場合です。

ビジネスロジックをコーディングする場所はどこでも、どのアプリケーションが変更を行ったかに関係なく、データベースが一貫性のある状態から別の一貫性のある状態に確実に変更されるようにします。したがって、実際には2つの選択肢しかありません。データベースに1回コーディングするか、「侵入できない」データアクセスレイヤーに1回コーディングするだけです。

「不可解な」DALを使用する場合は、dbmsコマンドラインインターフェイスに注意してください。


4
既存のレガシアプリのために、新しいアプリで古いSPとトリガーを使用する必要がある複数のケースに遭遇しました。利点は、このビジネスロジックを1か所で維持するだけで済むことです。
jfrankcarr

「すべてを提供する1つのデータベース」が使用されたことを間違いなく否定していませんが、特に複数のアプリケーションがストアドプロシージャの独自のバージョン管理を維持する必要がある場合、メンテナンスが完全に地獄になってしまうため、これはほとんど過去のものです。データベースを所有するアプリケーションを提供するためにデータベースが存在することは、アプリケーションとサービスの間の疎結合を強化するため、はるかに現代的なアプローチです。
Flater

-1

単純なクエリ-> ORM

複雑なクエリ->ストアドプロシージャ


3
どこで複雑な単純なクエリから分離されますか?
独立

-2

トリガーは、記録の不変条件として使用するか、重要なビジネスルールであるIMHOで構成する必要があります。

組織の問題:

  1. 「アクション」ごとではなく、テーブルごとにアクセス許可を設定する必要があります(SPを意味します)
  2. ソリューションのロジックを変更するには、アプリ内のコードを変更し、ネットワーク経由でクライアントに再配布する必要があります

-5

同意しない。ORMクエリは、SQLを知っているよりもORMをよく知っている場合にのみ簡単です。ORMを使用すると、コードがはるかに多くなり、IMOを維持するのがはるかに難しくなります。ORMの恩恵を受けるのは、ORMを販売している会社(Microsoftなど)の株主のみです。


1
この回答で表明された意見が参考資料でも経験でも裏付けられていないことは非常に残念です。その結果、ストアドプロシージャがDBベンダーのみに利益をもたらすという「逆の」主張につまずく読者にとっては役に立ちません。Real Questions Have Answersのガイダンスに「実際の質問には答えがありアイテムアイデア意見はない...」と言われている理由を実感できます
。– gnat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.