2010-11-19 107 views
3

它们对数据库管理员之外的任何内容都有用吗?如果我正确理解它们,它只是可以直接保存到MySQL中的查询,所以任何Web开发团队都无法使用它们。存储过程的要点是什么?

回答

11

存储过程是在数据库服务器上运行的代码。

它们有许多用途。认为:如果我可以直接在数据库服务器上运行代码,那我可以使用哪些代码?

在他们的许多用途,存储过程可以用来换挡一些处理负载到数据库服务器的,以减少网络流量,提高安全性。

http://en.wikipedia.org/wiki/Stored_procedure

+0

更不用说它允许你使用像PL/V8的东西,并写数据库端* javascript * – 2014-05-01 02:32:49

+0

对位:https://blog.codinghorror.com/who-needs-stored-procedures-anyways/ – mfrankli 2017-06-13 16:21:57

+0

@mfrankli:当然。我的回答并不建议使用存储过程的一切;只有在它们有用时才使用它们,而且效益大于成本。请记住,并非数据库服务器上发生的所有事情都涉及数据检索。 – 2017-06-13 16:40:45

1

存储过程可以做的远不止是查询数据库。它们可以包含任何T-SQL语句。因此,您可以使用它们来执行业务逻辑,执行查询,执行备份等。

许多公司都有一个策略,即所有数据库活动都要通过存储过程完成。所以,现在我会说Web开发团队对他们没有用处。他们可能会很好地利用它们。

另一方面,在我们公司,我们并没有将它们用于下一代制造应用。我们正在使用ORM(Linq-To-SQL),并且此时对存储过程的使用很少。我怀疑,尽管我们仍然会在某种程度上使用它们,以避免多次往返于服务器。如果你已经在服务器上工作了,那么在存储过程中完成某些事情会更有效率。

0

把它们想象成任何正常程序中的程序。一种在单一调用方法下封装逻辑块的方法。

如果您认为程序中的函数没用,那么这个对话在这里结束。如果你认为他们有用,那么无处可去。没有什么能够强制你使用它们,但是如果你应该选择的话,它们是可用的。

+0

功能是我的观点,我个人宁愿有一个函数,其中包含的SQL,以免混淆看到我的代码的其他人,所以他们知道一切都有一个地方......也许我只是不你们的水平... – Webnet 2010-11-19 18:09:45

+0

那么,一些项目将有常用的查询,到处都重复使用。而不是必须在一百万个地方嵌入相同的SQL,而是嵌入一个存储过程调用。这不仅仅是为了DBA ...... – 2010-11-19 19:09:26

1

早在90年代,存储过程是防止任何人直接访问数据表的最安全的方法。

第一手的是,他们更有可能对付安全问题。其次,由于目前没有ORM工具,因此它们更容易处理数据。

在这些日子里,它们主要是针对复杂的交易。当我说复杂时,我的意思是用简单的CRUD操作无法解决的问题,如NHibernate实体框架可以做的。

所以,当一个存储过程只执行SELECT,一个INSERT,一个UPDATEDELETE,你可能是正确的,他们现在没有用某种方式,你可以通过ORM工具执行这些基本的反复操作。但是,例如,当您必须构建报告时,需要绝望的信息数据以及执行的其他一些计算等,并且结果计算起来相当复杂,那么最好让数据库引擎按原样工作旨在计算这些数据。

+0

不妨将CRUD的东西放入存储过程中,因为很难知道哪里需要额外的业务规则,并且存储过程为您提供了额外的客户端程序和你的数据。 – ObiWanKenobi 2010-11-19 17:52:11

+0

+1提到安全性,这是一个好点 – Webnet 2010-11-19 18:10:07

+0

也许你的数据是'绝望',但我只是'不同'= P – 2010-11-19 19:49:51

3

思考的存储过程的库函数。每次你必须计算平方根还是你想调用一个函数来重写sqrt(例如)是否要重写sqrt?

这就是存储过程的好处(简而言之)。

+0

+1简而好的答案。 – 2011-06-20 23:29:56

+0

来吧人们,当你downvote,告诉我为什么(特别是事实后2年) – KevinDTimm 2012-12-18 02:44:12

2

存储过程有很多好处。除此之外,它们还帮助将应用程序代码与数据库表分离,简化数据库维护和版本控制,并帮助充分利用DBMS功能,如查询参数化,优化和安全性。

它会是无用的任何网络 开发团队使用他们

咦?对于任何需要使用支持它们的数据库的开发人员来说,存储过程都非常有用。

0

如果我理解正确的他们是 只是查询可保存 直接到MySQL,那么这将会是 没用任何Web开发团队 使用它们。

即使有了这个(有限)的定义,你暗示Web开发团队永远不需要查询数据库?真?

写得很好的一组存储过程可以完全删除客户端应用程序中的查询,并用调用过程替换所有这些查询。现在,我并不是说这是做事的唯一方式,甚至是正确的做法。总体来说,还有相当多的discussion。但这是使用它们的一种非常有效的方式。

那么,对于webdev团队来说没用?

6

这里是不包括在其他的答案两个不错的,简单的优点:

  • 安全 - 参数化存储过程是不是(在这个谷歌SQL注入约一亿个文档)contencating的SQL字符串但更安全,如果你的语言支持这些查询,参数化查询也是很好的
  • 简化维护 - 更新存储过程比重编译代码和重新部署要容易得多。在我15年的发展过程中,我已经学会了这个艰难的道路。如果查询可能发生变化,请将其存储在存储过程中。与重新编译和重新部署代码相比,SOOO的工作容易得多。

新增

他们还减少网络喋喋不休。如果你有很多复杂的wueries可以运行,你可以在一个存储过程中使用它们,你的应用程序只需要一个电话就可以完成所有的工作。

此外,在大多数平台中,存储过程具有性能优势。例如,在SQL Server中,数据库引擎优化并保存执行计划以加快速度。 这些链接也回答你的问题:

http://blog.sqlauthority.com/2007/04/13/sql-server-stored-procedures-advantages-and-best-advantage/

http://searchsqlserver.techtarget.com/news/1052737/Why-use-stored-procedures

我不能邀功这个答案,但我认为这句话是一个很好的点,即使我认为自己是在方程的两边都非常熟练 - 对于专业知识有一些要说的东西。

优势四:存储过程 通常由数据库 开发商/管理员。持有这些角色的人员 通常更有 在编写高效的 查询和SQL语句方面经验丰富。这释放了 的GUI应用程序开发人员到 利用他们的技能在功能 和图形演示文稿 该应用程序。如果你有你的 人员执行他们最适合的任务 最终会产生一个更好的整体 应用程序。

+0

我只在PHP工作,所以编译不是一个问题。我可以看到哪里会很痛苦...... +1对于“Advantage 4”包容性,非常好。 – Webnet 2010-11-19 18:13:52

0

除了这里给出的所有答案,我还想指出,存储过程是保存查询执行计划的一种方式。

您可能拥有一组您刚刚从应用程序中调用的SQL语句,但每次执行查询时,SQL服务器都无法知道您刚刚调用的查询与您调用的查询完全相同几分钟前(这将在Web应用程序中频繁发生)。所以SQL服务器必须重复所有的处理(构建查询计划并执行它)。

现在,如果相同的查询被封装在一个存储过程中,SQL服务器会保存该存储过程的执行计划,以便每次调用该sproc时,都不必重新编译执行计划时间。 (它甚至可以缓存基于传递给存储过程的参数数据,但我不知道这是怎样工作)

1

除了其他人所说安全性,封装,性能等的存储过程,我我想补充一点,存储过程的有用性随着存储过程语言的丰富性而增加。

我对MySQL没有太多的经验,但据我所知存储过程语言相当有限。

T-SQL(在Microsoft SQL Server中)功能更强大,但与全功能编程语言相比有一些缺点。例如,不可能在T-SQL中声明一个常量值,直到最近才没有异常处理,所以错误处理是一件很痛苦的事情。没有包的概念,所以你的所有代码都是独立的程序,没有办法将它们组合在一起,除了一个好的命名约定。 (尽管确实可以使用.NET语言编写存储过程。)另一方面,PL/SQL(在Oracle中)是一种功能全面的编程语言,它具有复杂的数据类型,异常处理,用于分组程序(带独立的公共和私人部门),对象类型,以及很多很多,与一切从文件访问压缩和生成的网页处理内置封装。所有这一切,再加上与数据库和SQL语言的无缝集成。可以使用PL/SQL构建整个应用程序,而不用“离开数据库”。查看http://apex.oracle.com获取以纯PL/SQL实现的大规模(框架)应用程序的示例。

1

假设你在不同的表中插入两行,第二个插入需要第一个ID。

$sql = "INSERT INTO t1 (f1,f2...) VALUES (v1, v2...)"; 
mysql_query($sql, $conn); 
$id = mysql_insert_id(); 
$sql2 = "INSERT INTO t2 (f1,f2,id,f3...) VALUES (v1,v2,$id,v3....); 
mysql_query($sql2,$conn)l 

您到数据库两次,两个服务器请求/响应。如果你可以存储INSERT,@ id = insert id,INSERT全部在my_proc服务器上的进程,你只需要做一次。

$sql = "CALL my_proc(arguments)"; 
mysql_query($sql); 
+0

在这篇文章中陈述的其他原因真的没有关系,如果你用另一种语言连接到mysql,你可以使用该语言编写函数。谢谢。 – 2014-12-03 23:40:42

0

与大多数ORM创建的代码相比,更容易调整存储过程中的代码。当有多个应用程序访问同一个数据库并且可能需要做同样的事情时,使用存储过程更容易。当所有代码都存储在proc中时,重构数据库要容易得多,因为您可以轻松地看到需要进行更改的位置。对于通常不会连接到像SSIS或报告应用程序这样的ORM的事物,使用存储过程更加容易。使用存储过程可以限制只有proc执行的操作,并且不允许直接访问表或视图。这对于强化财务数据的内部控制至关重要,并有助于防止欺诈行为。

我写了超过1000行的复杂特效。尝试让ORM编写这种SQL。然后尝试获取它,以便它在没有超时的情况下运行。

相关问题