存储过程有什么意义?

时间:2010-11-19 17:25:59

标签: mysql sql-server

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

12 个答案:

答案 0 :(得分:11)

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

它们有很多用途。想想:如果我可以直接在数据库服务器上运行代码,我可以用它来做什么?

在众多用途中,存储过程可用于将部分处理负载转移到数据库服务器减少网络流量,改进安全

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

答案 1 :(得分:6)

以下是其他答案中未涵盖的两个优点,简单优点:

  • 安全性 - 参数化存储过程比SQL的字符串更安全(Google SQL注入大约有一百万个文档)但是,如果您的语言支持,参数化查询也适用于此
  • 简化维护 - 更新存储过程比重新编译代码和重新部署要容易得多。在我15年的发展过程中,我学到了很多东西。如果查询有可能发生变化,请将其放入存储过程中。与不得不重新编译和重新部署代码相比,它更容易使用。

<强>加

它们还可以减少网络抖动。如果您要运行许多复杂的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

我不能赞同这个答案,但我认为这句话是一个很好的观点,尽管我认为自己在方程式的两个方面都非常熟练 - 对于专业知识有一些东西可以说。

  

优势4:存储过程是   通常由数据库编写   开发商/管理员。人   持有这些角色通常更多   有效率的写作经验   查询和SQL语句。这释放了   GUI应用程序开发人员   利用他们的功能   和图形演示文稿   应用程序。如果你有你的   执行任务的人   他们最适合你,然后你会   最终产生更好的整体   应用

答案 2 :(得分:3)

将存储过程视为库函数。你是想在每次计算平方根时重写sqrt(例如)还是想调用函数来执行它?

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

答案 3 :(得分:2)

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

  

对任何网络来说都没用   开发团队使用它们

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

答案 4 :(得分:1)

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

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

另一方面,在我们公司,我们并没有将它们用于下一代制造应用。我们现在使用的是ORM(Linq-To-SQL),并且此时对存储过程几乎没有用处。我怀疑虽然我们仍然会稍微使用它们,以避免几次来回服务器。如果你已经在服务器上工作了,那么如果你在存储过程中完成某些事情会更有效。

答案 5 :(得分:1)

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

一方面,他们更有可能反击安全问题。其次,它们更容易使用数据,因为没有像今天这样的ORM工具。

在这些日子里,它们主要用于复杂的交易。当我说复杂时,我指的是使用简单的CRUD操作无法解决的问题,例如 NHibernate 实体框架

因此,当存储过程仅执行SELECTINSERTUPDATEDELETE时,您可能会认为它们现在无用,因为您可以通过ORM工具执行这些基本的重复操作。但是,当你必须构建一个报告时,例如,需要绝望的信息数据,以及执行的其他一些计算等,并且计算结果非常复杂,那么你最好让数据库引擎解决这个问题,因为它是旨在计算此类数据。

答案 6 :(得分:1)

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

我对MySQL没有多少经验,但据我所知,存储过程语言非常有限。

T-SQL(在Microsoft SQL Server中)功能更强,但与全功能编程语言相比有几个缺点。例如,不可能在T-SQL中声明一个常量值,直到最近没有异常处理,因此错误处理很痛苦。没有包的概念,因此除了良好的命名约定外,所有代码都是独立的程序,无法将它们组合在一起。 (尽管你可以用.NET语言编写存储过程。)

另一方面,PL / SQL(在Oracle中)是一种功能齐全的编程语言,具有复杂的数据类型,异常处理,用于分组过程的包(具有单独的公共和私有部分),对象类型和批次以及许多内置包处理从文件访问到压缩和生成网页的所有内容。所有这些,加上与数据库和SQL语言的无缝集成。可以使用PL / SQL构建整个应用程序,而不必“离开数据库”。查看http://apex.oracle.com以获取在纯PL / SQL中实现的大型(框架)应用程序的示例。

答案 7 :(得分: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

你去了数据库两次,两个服务器请求/响应。如果你可以在my_proc中的服务器上存储INSERT,@ id = insert id,INSERT all的过程,你只需要这样做一次。

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

答案 8 :(得分:0)

将它们视为任何常规程序中的程序。一种在单个调用方法下封装一大块逻辑的方法。

如果您认为程序中的功能无用,那么此对话将在此处结束。如果你认为它们有用,那么其他任何地方都没有。没有什么可以强迫你使用它们,但如果你应该选择它们,它们就可用了。

答案 9 :(得分:0)

  

如果我理解正确的话   只是可以保存的查询   直接进入MySQL,所以它就是   对任何Web开发团队都没用   使用它们。

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

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

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

答案 10 :(得分:0)

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

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

现在,如果在存储过程中封装了相同的查询,SQL Server就会保存该存储过程的执行计划,这样每次调用sproc时,都不必一直重新编译执行计划。 。 (它甚至可以根据传递给sproc的参数缓存数据,但我不确切知道它是如何工作的)

答案 11 :(得分:0)

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

我写了超过1000行的复杂触发器。尝试使用ORM编写这种SQL。然后尝试获取它,以便它可以在没有超时的情况下运行。