精华内容
下载资源
问答
  • 分享一些关于数据库中存储过程和触发器的知识,我想了想,这是很细节的技术,一般只要用了都会很快掌握其使用方法。我一般在设计数据库的时候也都会或多或少的使用存储过程和触发器,原因很简单:良好的性能,业务...

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

    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设计的,可以很大程度上提升性能;在复杂的系统中,建议不用触发器,少用存储过程。

    展开全文
  • 存储过程和触发器的取舍问题(优缺点分析)由于要给同学分享一些关于数据库中存储过程和触发器的知识,我想了想,这是很细节的技术,一般只要用了都会很快掌握其使用方法,1、触发器是特殊的存储过程。这句话在教科书...

    存储过程和触发器的取舍问题(优缺点分析)

    由于要给同学分享一些关于数据库中存储过程和触发器的知识,我想了想,这是很细节的技术,一般只要用了都会很快掌握其使用方法,

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

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

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

    可以封装数据逻辑和业务规则,以便用户可以仅通过开发人员和数据库管理员打算使用的方式访问数据和对象。

    验证所有用户输入的参数化存储过程可用于阻止 SQL 注入攻击。 如果使用动态 SQL,请确保将命令参数化,并绝对不能将参数值直接包括在查询字符串中。

    可禁止即席查询和数据修改。 这样将阻止用户恶意或无意中损坏数据或执行查询,以避免降低服务器或网络的性能。

    可以在过程代码中处理错误,而无需将错误直接传递给客户端应用程序。 这样可防止返回错误消息,以避免其可能有助于探测攻击,存储过程和触发器的取舍问题(优缺点分析)》(https://www.unjs.com)。 在服务器上记录错误并对其进行处理。

    存储过程只能编写一次,可由很多应用程序访问。

    客户端应用程序不需要知道有关基础数据结构的任何信息。 只要更改不影响参数列表或返回的数据类型,就可以更改存储过程代码,而无需在客户端应用程序中进行更改。

    存储过程可通过将多个操作组合到一个过程调用中来减少网络通讯。

    安全性好—可以访问执行存储过程而不必拥有直接操作基础表的权限

    减少网络通信流—存储过程可以包含多条SQL语句,但只要用一条语句来执行该存储过程,从而减少了客户端应用程序对服务器的调用次数和长度

    快速执行—存储过程在第一次执行时进行语法检查和编译,编译好的版本存储在高速缓存中,用于再次调用

    保证一致性—如果用户只通过存储过程修改数据,则可以消除偶然修改带来的问题减少操作人员和编程人员的错误—由于传递信息少,因此执行复杂任务更容易,不易出现SQL错误

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

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

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

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

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

    展开全文
  • 首先说存储过程吧: 存储过程: 是一组SQL语句集,从开头到结尾包含这许多的SQL语句,然后中间对于有需要的业务逻辑处理,进行逻辑控制。解决一些复杂的业务时比较实用。 比如说我在service层处理业务逻辑的虎,...

    首先说存储过程吧:

    存储过程:

    是一组SQL语句集,从开头到结尾包含这许多的SQL语句,然后中间对于有需要的业务逻辑处理,进行逻辑控制。解决一些复杂的业务时比较实用。 比如说我在service层处理业务逻辑的虎,可能会涉及到多次数据库的连接。这就相当的耗费资源,但如果你用存储过程的话,就只有一次,从响应来说,时间上很有优势,而且性能也会提高,也就是说存储过程可以给我们带来运行效率提高的好处。 存储过程解决业务的逻辑,就相当于我们写java时一样的道理,如果我们过多在java写业务处理,势必需要经常连接数据库,如果将一些复杂的逻辑交给数据库去处理,就可以减少连接的次数。

    触发器:

    触发器与存储过程类似,里面也是一些SQL语句集,触发器可以控制表与表之间的数据同步更新,删除等操作。比如我们给一张学生表写一个触发器,当插入一条记录的时候,同时也向成绩表插入一条记录。触发器可以分为操作前执行或者操作后执行。关键字是before与after。  for  each  row 语句 是铺抓每一条都会触 发,就算是批操作,也会一条条的触 发。不加,就是一次的触发,如果是批操作,就只会触发一次。当然也可以使用控制逻辑语句,进行筛选触发,比如

     BEGIN

         IF (new.name = ‘demo’) THEN
             insert into tab2(tab2_id) values(new.tab1_id);

    END;

    判断插入的值,然后再执行触发器的操作。

    优点:

    存储过程只要编译一次,就可以永久使用,可以复用。比一般的sql执行快。可以提高运行速度,但是对于简单的SQL执行,存储就没有什么明显优势。可以减少网络流量,当我们需要一次执行上百条SQL时,而存储过程只需使用一条执行语句调用即可,可以减少网络流量。

    触发器:(转载)

    1.自动执行:触发器不用像存储过程一样需要手动调用,是自动触发的,只有当对表进行更新,删除等操作的时候会立即触发。

    2.级联更新:触发器可以通过数据库中的相关表进行层叠更改,这比直接将代码写在前端的做法更安全合理。

    3强化约束:触发器可以引用其他表的列,能够实现比check约束更为复杂的约束。

    4跟踪变化:触发器可以阻止数据库中未经允许的指定更新和变化。

    5强制业务逻辑:触发器可用于执行管理任务,并强制影响数据库的复杂业务规则。

     

    缺点:(参考之存储过程的优缺点)

    不同数据库,语法差别很大,移植困难,换了数据库,需要重新编写;

    不好管理,把过多业务逻辑写在存储过程不好维护,不利于分层管理,容易混乱,一般存储过程适用于个别对性能要求较高的业务,其它的必要性不是很大;

    触发器要用的恰到好处,一个大型应用里,触发器越少越好,触发器会使编程时源码的结构被迫打乱,为将来的程序修改、源码阅读带来很大不便。

    展开全文
  • 触发器优缺点

    千次阅读 2017-07-05 20:31:41
    触发器,主要是用来同步更新数据的,触发器是一种特殊的存储过程。 一般的存储过程是通过存储过程名直接调用,而触发器主要是  通过事件(增、删、改)进行触发而被执行的。其在表中数据发生变化时自动强制...

    触发器,主要是用来同步更新数据的,触发器是一种特殊的存储过程。

    一般的存储过程是通过存储过程名直接调用,而触发器主要是

      通过事件(增、删、改)进行触发而被执行的。其在表中数据发生变化时自动强制执行。

      常见的触发器有两种:after(for)、instead of,用于insert、update、delete事件。

      after(for)        表示执行代码后,执行触发器

      instead of        表示执行代码前,用已经写好的触发器代替你的操作

    触发器语法:

      create trigger 触发器的名字   on 操作表

      for|after         instead of

      update|insert|delete

      as

      SQL语句


    举个例子吧: 


    假设有两个表,tab_1 , tab_2 
    再假设两个表里都有“人员性别”这个字段 

    tab_1的数据例如: 张三```男```1978`````2002 
    tab_2的数据例如: 张三```男```销售科```科长 

    我要改tab_1中张三的性别为“女”的话,那么tab_2的性别也该改为“女”,对吧,总不能两张表的性别不同吧。 

    如果不用触发器的话,我们就要改完tab_1,再去改tab_2,使性别都变成女 

    于是这里可以用到触发器了: 

    原理是:当tab_1中某人的性别发生变更后, 数据库 自动将tab_2的性别进行同步修改 

    触发器也可以这样应用: 
    1、当删除tab_1中的某人信息时,触发器一并删除该人的tab_2中的数据 
    2、在tab_1中新插入一个人员时,触发器在tab_2中一并新增一条该人的数据 

    =================================================================================== 
    所以在你建立触发器时,就要指定该触发器的用途,是同步更新,还是删除、插入,由你指定。 

    基本的语法规则是: 
    create trigger 触发器名称(你自己命名的) on 表 for 用途(delete|update|insert) 
    as 
    delete|update|insert语句 
    ---------------------------------------------------------------------- 
    例如: 
    create trigger tri_A on tab_1 FOR DELETE 
    AS 
    delete tab_2 from deleted where tab_2.id = deleted.id; 

    意思是:在tab_1表上,建立触发器(tri_A),用于删除该表的数据时触发一个事务,什么事务呢?——删除tab_2中的该编号人员的记录。 

    FOR INSERT、FOR UPDATE分别是建立用于“插入记录”、“更新数据”的触发器,例子里的FOR DELETE是用于触发“删除记录”的。 

    这里还要看清楚,那个delete语句中的表,是from deleted哦,还有,where子句的tab_2.id = deleted.id,不是tab_2.id = tab_1.id哦,deleted.id是指你刚删除的那条记录的id(而update、insert,都用inserted.id) 
    =================================================================================== 

    好处:相对于外部程序、存储过程,触发器可以更快更高效的维护数据
    坏处:(我自己的经验)触发器要用的恰到好处,一个大型应用里,触发器越少越好,触发器会使编程时源码的结构被迫打乱,为将来的程序修改、源码阅读带来很大不便
    展开全文
  • 触发器和存储过程之间的主要区别在于,当对表执行数据修改事件时,会自动调用触发器,而存储过程必须要明确地调用。1, SQL触发器的优点SQL触发器提供了检查数据完整性的替代方法。SQL触发器可以捕获数据库层中业务...
  • 触发器和存储过程优缺点

    千次阅读 2013-11-21 10:31:08
    触发器和存储过程优缺点 (一) 缺点: 1、可移植性是存储过程和触发器最大的缺点。 2、占用服务器端太多的资源,对服务器造成很大的压力 3、不能做DDL。 4、触发器排错困难,而且数据容易造成不一致,后期...
  • 存储过程和触发器的优点和缺点

    千次阅读 2015-12-22 16:57:27
    触发器是一种特殊类型的存储过程,当使用一种或者多种数据修改进行操作,在指定表中对数据进行修改时侯,会触发下面的函数, 触发器就会生效:update insiert delete 触发器可以查询其他表,可以包含很复杂的sql ...
  • mysql触发器优缺点简介

    千次阅读 2018-07-12 17:24:49
    SQL触发器存储在数据库目录... 触发器和存储过程之间的主要区别在于,当对表执行数据修改事件时,会自动调用触发器,而存储过程必须要明确地调用。完事我们来看下SQL触发器的优点:SQL触发器提供了检查数据完整性...
  • 如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计使用索引的MySQL就是一个人力三轮车。拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的...
  • 简述使用存储过程有哪些优缺点? 优点: (1)减少网络流量。 (2)提高系统性能。 (3)安全性高。 (4)可重用性好。 (5)课自动完成需要预先执行的任务。 缺点: 移植性较差,增加数据库...
  • MySQL 的触发器

    2021-01-19 12:55:14
    一、基本概念触发器是一种特殊类型的存储过程,它不同于存储过程,主要是通过事件触发而被执行的,即不是主动调用而执行的;而存储过程则需要主动调用其名字执行触发器:trigger,是指事先为某张表绑定一段代码,当...
  • SQL存储过程优缺点

    千次阅读 2018-07-28 17:17:22
    存储过程是由一些SQL语句控制语句组成的被封装起来的过程,它驻留在数据库中,可以被客户应用程序调用,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它,也可以从另一个过程或...
  • 1.1什么是存储过程带有逻辑的SQL语句。有条件判断,有循环,带流程...缺点:MySql的存储过程不能在oracle或SQLserver中执行,移植性差。1.3创建数据库create databasedb20171213;//executeusedb20171213;//executec...
  • MySQL面试题-存储过程触发器

    千次阅读 2020-04-03 13:21:35
    有哪些优缺点存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需要创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。 优点 1)存储...
  • MySQL数据库存储过程和触发器原理详解1.1 什么是存储过程带有逻辑的SQL语句。有条件判断,有循环,带流程控制。客户端:SQLyog、Navicat1.2 存储过程的特点优点:执行效率高,因为存储过程是在数据库服务端执行的。...
  • 《大型网站系统与Java中间件实践》读书笔记分布式系统的基础知识 阿姆达尔定律 多线程交互模式 互不通信,没有交集,各自执行各自的任务逻辑 基于共享容器(如队列)协同的多线程模式->生产者-消费者->队列 通过...
  • 第二十三章 使用存储过程MySQL5 中添加了存储过程的支持。大多数SQL语句都是针对一个或多个表的单条语句。并非所有的操作都怎么简单。经常会有一个完整的操作需要多条才能完成存储过程简单来说,就是为以后的使用而...
  • 1,存储过程 -PROCEDURE(简写Proc) 2,触发器 -TRIGGER 3,索引 - index 存储过程的创建: 例1: CREATE PROCEDURE Pro_CGtoSale --存储过程名称 @ParameterPKNum VARCHAR(30) , @ParameterGuid VARCHAR(50) -...
  • 本文主要向大家介绍了MySQL数据库之MySQL数据库存储过程和触发器原理详解 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助。MySQL数据库存储过程和触发器原理详解1.1什么是存储过程带有逻辑的SQL...
  • 本文目录:一、触发器在某个时间发生了某个事件时 会自动触发一段sql语句create trigger cmd_insert_triger before insert on cmd for each rowbeginif new.success = "no" theninsert into errlog values(null,new....
  • 有哪些优缺点? 「存储过程」,就是一些编译好了的SQL语句,这些SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后给这些代码块取一个名字,在用到这个功能的时候调用即可。 「优点:」 存储...
  • java数据库篇8——索引、视图、存储过程触发器 1、索引 1.1、索引是什么 在数据库表中,对字段建立索引可以大大提高查询速度。通过善用这些索引,可以令MySQL的查询 运行更加高效 如果合理的设计且使用索引的...
  • 第五章 视图与存储过程 1 视图 一、创建视图 1、什么是视图? 一个数据库中有很多很多的表,我们每次不可能将它们全部查看一遍,有了视图以后我们就方便了很多, 可以将我们想查看的数据,重新组合成一个新...
  • 存储过程 存储过程(Stored Procedure)是在数据库中,一组为了完成...存储过程缺点 随着SQL行数的增加,维护复杂度呈线性提升 无法调试,迭代过程中风险较高 格式 delimiter // drop procedure if exis
  • mysql触发器存储过程

    千次阅读 2018-03-05 11:11:05
    一、异同点 触发器和存储过程都是一组mysql语句集,都可以实现一些比较复杂的业务逻辑,可以直接在数据库中,编写业务逻辑,对不同的表进行操作,执行效率较高,不同的是存储过程需要主动调用,如下:#给参数赋值...
  • ')print(cursor.fetchall())cursor.close() conn.close() #存储过程和事务的连用 delimiter// create PROCEDUREp5( OUT p_return_codetinyint)BEGIN DECLARE exit handler forsqlexceptionBEGIN --ERROR set p_...
  • -- 专业一点来说呢,索引是一个排好序的列表,在这个列表中存储着索引的值包含这个值的数据所在行的物理地址。在数据库十分庞大的时候,索引可以大大加快查询的速度,这是因为使用索引后可以不用扫描全表来定位某...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,540
精华内容 11,416
关键字:

存储过程和触发器的优缺点