存储过程和触发器优缺点分析

由于要给同学分享一些关于数据库中存储过程和触发器的知识,我想了想,这是很细节的技术,一般只要用了都会很快掌握其使用方法。经过这么多年,我一般在设计数据库的时候也都会或多或少的使用存储过程和触发器,原因很简单:良好的性能,业务也好实现。可是在做上次的项目的时候,由于业务很复杂,存储过程和触发器的数量均都达到上百之多,这是一件很恐怖的事情,尤其是在出了错调试维护的时候,就会想没有这些东西多好。下面我从经验角度梳理一下对存储过程和触发器的看法。

       1、触发器是特殊的存储过程。

这句话在教科书中会经常出现,这就说明二者是有很大的联系的,我的一般理解就是触发器是一个隐藏的存储过程,因为它不需要参数,不需要显示调用,往往在你不知情的情况下已经做了很多操作。从这个角度来说,由于是隐藏的,无形中增加了系统的复杂性,非DBA人员理解起来数据库就会有困难,因为它不执行根本感觉不到它的存在。再有,涉及到复杂的逻辑的时候,触发器的嵌套是避免不了的,如果再涉及几个存储过程,再加上事务等等,很容易出现死锁现象,再调试的时候也会经常性的从一个触发器转到另外一个,级联关系的不断追溯,很容易使人头大。其实,从性能上,触发器并没有提升多少性能,只是从代码上来说,可能在coding的时候很容易实现业务,所以我的观点是:摒弃触发器!触发器的功能基本都可以用存储过程来实现。

2、存储过程优点很多,可以经常使用

  • 可以封装数据逻辑和业务规则,以便用户可以仅通过开发人员和数据库管理员打算使用的方式访问数据和对象。
  • 验证所有用户输入的参数化存储过程可用于阻止 SQL 注入攻击。 如果使用动态 SQL,请确保将命令参数化,并绝对不能将参数值直接包括在查询字符串中。
  • 可禁止即席查询和数据修改。 这样将阻止用户恶意或无意中损坏数据或执行查询,以避免降低服务器或网络的性能。
  • 可以在过程代码中处理错误,而无需将错误直接传递给客户端应用程序。 这样可防止返回错误消息,以避免其可能有助于探测攻击。 在服务器上记录错误并对其进行处理。
  • 存储过程只能编写一次,可由很多应用程序访问。
  • 客户端应用程序不需要知道有关基础数据结构的任何信息。 只要更改不影响参数列表或返回的数据类型,就可以更改存储过程代码,而无需在客户端应用程序中进行更改。
  • 存储过程可通过将多个操作组合到一个过程调用中来减少网络通讯。
  • 安全性好—可以访问执行存储过程而不必拥有直接操作基础表的权限
  • 减少网络通信流—存储过程可以包含多条SQL语句,但只要用一条语句来执行该存储过程,从而减少了客户端应用程序对服务器的调用次数和长度
  • 快速执行—存储过程在第一次执行时进行语法检查和编译,编译好的版本存储在高速缓存中,用于再次调用
  • 保证一致性—如果用户只通过存储过程修改数据,则可以消除偶然修改带来的问题减少操作人员和编程人员的错误—由于传递信息少,因此执行复杂任务更容易,不易出现SQL错误

    3、考虑移植性,存储过程的致命伤

如果一个系统过多的使用了存储过程,那系统的业务逻辑过于依赖数据库,这样就会给系统额外的增加一层数据库中的业务逻辑层,如果开发的时候用的sql server,后来发现数据量过大,需要提高性能移植到oracle或者mysql,这样就会很麻烦,相当于把存储过程重写一遍,这是不能忍受的。我们平时在做项目的时候,往往一个功能在客户端实现起来很费劲,在服务端很容易就可以实现,这样好多人就会选择在服务端做,却为以后留下隐患。在分析项目的需求的时候,一定要考虑性能问题,多久有可能会升级, 如果数据量很小,几十年用sql server都没问题,那就可以多用存储过程;但是数据量有可能会逐渐累积成千万条甚至更多,就不得不考虑系统的可移植性,这时候尽量不要用存储过程,全部代码控制。

     4、存储过程的代码可复用性差。

面向对象的思维在存储过程这毫无用武之地,两个很相似的功能在也需要两个存储过程,因为他们是互相独立的,可以互相调用,但是不能继承等面向对象的操作,这也就增加了代码量。

  总结:

  缺点:
  1、可移植性是存储过程和触发器最大的缺点。
  2、占用服务器端太多的资源,对服务器造成很大的压力
  3、不能做DDL。
  4、触发器排错困难,而且数据容易造成不一致,后期维护不方便。
  优点:
  1、预编译,已优化,效率较高。避免了SQL语句在网络传输然后再解释的低效率。
  2、存储过程可以重复使用,减少开发人员的工作量。
  3、业务逻辑封装性好,修改方便。
  4、安全。不会有SQL语句注入问题存在。

 综上:在一般的小系统(逻辑简单)中,存储过程和触发器可以多用,毕竟ms设计的,可以很大程度上提升性能;在复杂的系统中,建议不用触发器,少用存储过程。

时间: 2024-10-10 19:11:24

存储过程和触发器优缺点分析的相关文章

oracle 存储过程 ,触发器练习

/*以下代码是对emp表进行显示宽度设置 */col empno for 9999;col ename for a10;col job for a10;col mgr for 9999;col hiredate for a12;col sal for 9999;col comm for 9999;col deptno for 99;col tname for a12;set pagesize 50; //----------------------------------------------

存储过程和触发器——MySQL

从MySQL5.0版本开始就对存储过程和触发器进行了支持,在MySQL进行学习前,先查看您所使用的版本吧,方法有: 1.$mysql -V  //linux终端下 2.select version();  //mysql下 3. mysql --help | grep Distrib  //linux终端下 在了解您所使用的版本支持情况下再下一步 存储过程  sql语句执行的时候要先编译,然后执行.存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数

mysql 自定义存储过程和触发器

mysql 自定义存储过程和触发器 --存储过程示范 DROP PROCEDURE IF EXISTS PRO_TEST; CREATE PROCEDURE PRO_TEST(IN NUM_IN INT,OUT NUM_OUT INT,INOUT NUM_INOUT) BEGIN //DO ANYTHING YOU WANT END; 参数解释: in : 就是输入参数,输入参数是会被传入到存储过程作为参数使用,改变它的值将不会改变其原本值,相当于是值传递 out: 此为输出参数,在存储过程中为

MSSQL 事务,视图,索引,存储过程,触发器

事务 事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行. 在数据库系统上执行并发操作时事务是作为最小的控制单元来使用的.这特别适用于多用户同时操作的数据通信系统.例如:订票.银行.保险公司以及证券交易系统等. 如果某一事务成功,则在该事务中进行的所有数据修改均会提交,成为数据库的永久组成部分,如果事务遇到错误且必须取消或回滚,则所有数据修改均会被清除. 开始事务 BEGIN TRANSACTION 提交事务 COMMIT TRANSACTION 回

android 原生应用、Web应用、混合应用优缺点分析

最近开发几个项目,牵涉到android的几种开发模式.对于原生态开发.web 应用开发以及混合模式开发,本人认为并不是哪一种就是最好的,哪一种就是最差的,这个完全是根据自己的需求,选择一种合适的开发模式.他们同时具备自己的有点,同时也有自身的缺点,我们根据实际情况,取其中的优点,尽量避免掉缺点,才是最好的开发模式.下面,我们就一同看看,这三种开发模式,到底有什么区别. 一.原生应用 (也称本地开发 Native App) 你使用过微软PowerPoint 或者 Word吧?这些可直接在你电脑上运

mysql的存储过程和触发器的使用 以及php中的调用方法

存储过程顾名思义,相当于一组为了完成特定功能的sql语句集,经编译后存储在数据库中.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程. 存储过程的书写格式:  CREATE PROCEDURE [拥有者.]存储过程名[;程序编号]  [(参数#1,-参数#1024)]  [WITH  {RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}  ] 

SQL基本编程,分支语句,循环语句,存储过程,触发器

基本编程: 定义变量 declare @变量名 数据类型 赋值 set @变量名 = 值 select @变量名 = 值 取值打印 select @变量名 print @变量名 映射到结果集 打印到消息框 分支语句if @a>@bbegin 语句....endelsebeginend 循环语句注意循环四要素:初始条件,循环条件,循环体,状态改变 declare @a int;select @a = 1; while 循环条件 @a<=10begin 循环体end 存储过程: 存储过程是集中存储

Sqlserver中存储过程,触发器,自定义函数(一)

Sqlserver中存储过程,触发器,自定义函数 1.存储过程有关内容存储过程的定义:存储过程的分类:存储过程的创建,修改,执行:存储过程中参数的传递,返回与接收:存储过程的返回值:存储过程使用游标. 1.1存储过程的定义:存放在服务器上预先编译好的sql语句,可以给存储过程传递参数,也可以从存储过程返回值. 优点:提供了安全访问机制,比如可以将不同的存储过程的执行权限赋予权限不同的用户:改进了执行性能,因为存储过程是预编译的:减少了网络流量,因为在调用存储过程时,传递的字符串很短,没有很长的s

T-SQL应用,视图、存储过程、触发器、游标、临时表等

sqlserver常用操作: 视图.存储过程.触发器.函数 --*********************批处理********************* --[在一个批处理中存有一个语法错误,则所有的语句都无法通过编译] USE flowershopdb SELECT * FROM tb_category SELECT * FROM tb_detailed SELECT * FROM tb_product SELECT * FROM tb_shopping SELECT * FROM tb_u