什么时候不使用ORM而更喜欢存储过程?


13

我正在使用PetaPoco微型ORM。使用ORM工具处理数据库确实非常容易且安全,但是我唯一讨厌的是额外的代码。我曾经将大多数代码放在数据库本身中,并使用了所有RDBMS功能(如存储过程,触发器等),这些功能旨在更好地处理。

我想知道何时不对存储过程/触发器使用ORM,反之亦然。


6
就我个人而言,触发器的问题(特别是不适用于存储过程)是触发器试图根据数据库数据的处理方式来“猜测”发生了什么“业务操作”。如果您在“ ARTICLES”表中修改PRICE列,那么您实际上并不知道为什么。用户是在更正错误输入的值吗?这是降价吗?它是仅持续一天的特别优惠吗?触发器必须猜测所有这些。
约阿希姆·绍尔

Answers:


16

ORM(对象关系映射)与存储过程不互斥。大多数ORM可以利用存储过程。如果您愿意,大多数ORM都会生成存储过程。因此,问题不是非此即彼。

ORM可能会生成不可接受的SQL(就性能而言),您有时可能希望使用手工制作的SQL覆盖该SQL。实现此目的的方法之一是使用SP(存储过程)。

在DotNet中,如果满足以下条件,则不要使用存储过程:

  • 如果您不熟悉存储过程(不是您的情况,而是出于完整性考虑而包括在内)。

  • 如果您不想在您的项目中引入一层复杂性并实现多功能化。

  • 您正在创建一个应与其他数据库一起使用的应用程序,或者必须在多个数据库服务器之间复制的应用程序(此最后的限制可能仅适用于某些数据库)。

请注意,不要将触发器与ORM进行比较。触发器执行的功能最好不在应用程序代码中(例如,跨数据库记录或同步数据)。

有些人出于各种原因(例如安全性(例如,防止SQL注入)和声称的速度)而不喜欢在代码中使用存储过程而不是SQL。但是,这有点值得商and,需要详细讨论。

如果您的ORM无法生成存储过程,而您必须编写一个大型系统,那么您需要根据情况来权衡额外的手工编码。


2
我认为安全性论点与SQL注入无关,而与权限有关(即,对于具有访问数据库权限的用户管理特定存储过程的权限,但管理表,列和表上的那些权限的管理,通常非常简单行更难或更不可能)。尽管如此,关于安全性的争论仍值得商bat。
Arseni Mourzenko 2012年

@MainMa,谢谢您的评论。我的理解是,使用SP可以通过使用带有嵌入式参数的参数化存储过程来降低SQL注入的风险,如本文所述:palpapers.plynt.com/issues/2006Jun/injection-stored-procedures
NoChance

2
存储过程实际上对sql注入攻击的脆弱性没有影响。古老的神话死了。
钻机2012年

@钻机1,谢谢您的评论,我想进一步了解您对此的看法。我的理解来自(至少)这篇文章:“您可以使用存储过程和参数化命令来阻止SQL Server注入攻击,避免使用动态SQL并限制所有用户的权限。” 出现在msdn.microsoft.com/en-us/library/bb669057.aspx
NoChance 2012年

@EmmadKareem参数化sql是使其变得安全的一大步骤。我认为这个人提出了一个合理的案例palpapers.plynt.com/issues/2006Jun/injection-stored-procedures。在其上搜索“存储过程SQL注入”将发现很多匹配项。清理您的输入总是好的,很多平台都提供了一种内置的方式来很好地做到这一点。
钻机

13

ORM 通常假定存在数据库来为ORM服务。但是通常数据库是为公司服务的,公司可能会用多种语言编写成百上千的应用程序。

但是,如果您使用的是无法调用存储过程的ORM,则这只是“ ORM与存储过程”的一种情况。否则,就需要确定在哪里编写业务逻辑代码。

无论您在何处编写业务逻辑,其工作都是确保数据库从一种一致状态变为另一种一致状态,而不管是哪个应用程序进行了更改。因此,您实际上只有两个实际选择-在数据库中对其进行一次编码,或在“不可渗透”的数据访问层中对其进行编码。

如果使用“不可渗透”的DAL,请注意dbms命令行界面。


4
我遇到了不止一种情况,由于现有的遗留应用程序,旧的SP和触发器必须与新应用程序一起使用。优点在于,该业务逻辑仅需保留在一个地方。
jfrankcarr 2012年

我绝对不能否认已经使用了“一个数据库来为所有数据库服务”,但这主要是过去的事情,特别是因为维护变成了纯粹的地狱,尤其是当多个应用程序需要维护自己的存储过程版本时。存在数据库以服务拥有它的应用程序是一种更现代的方法,因为它可以在应用程序和服务之间实施更松散的耦合。
扁平的

-1

简单查询-> ORM

复杂查询->存储过程


3
从简单的查询中分离出复杂的内容在哪里?
2013年

-2

触发器应用作记录的不变式,或由重要的业务规则(恕我直言)组成。

orms的问题:

  1. 您应该为每个表而不是每个“操作”设置权限(我是说SP)
  2. 要更改解决方案的逻辑,您需要更改应用程序内部的代码,然后通过网络将其重新分配给客户端

-5

不同意。如果您对ORM的了解比对SQL的了解更好,那么ORM查询只会更简单。ORM产生的代码更多,维护IMO的难度更大。唯一受益于ORM的人是出售ORM的公司的股东(例如Microsoft)。


1
遗憾的是,此答​​案中表达的观点既没有引用也没有经验支持。结果,对于可能偶然发现“反”主张(例如存储过程仅对DB供应商有利)的读者而言,这将毫无用处。让人明白为什么在指导真正的问题有答案中指出:“真正的问题都有答案没有项目想法意见 ......
蚊蚋
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.