存储过程和触发器讲解

前几天,在技术交流会上,八期师哥提到了存储过程和触发器的区别和联系,原来我只知道,触发器时存储过程的一种,在机房收费系统个人版中也用到了存储过程和触发器,自己却没有深究,只道是自己会用就好,却没有将这两个拿出来好好的比较,好好的学习,心里着实惭愧。

        无论是存储过程还是触发器,在数据库中的作用都是很大的,存储过程和触发器都是SQL语句和流程控制语句的集合,就本质而言,触发器其实也是一种特殊的存储过程,那为什么要这样说呢?

        我个人认为,这是因为触发器和存储过程都是经过编译过的一组SQL语句,只不过说存储过程是要通过语句来调用才能实现,而触发器是通过某一个动作执行时或执行后自动调用,注意这个自动哦。打个比方,在一个图书馆管理系统中,当一个学生的学号发生改变时,我们希望他相应的借书记录仍然跟这个学生息息相关,即我们要更改他相应的借书记录中的学号,这时我们就可以使用触发器,在学号发生改变时触发修改借书记录中的学号这个事件。

       存储过程是这样定义的:它是一组为了完成特定功能的SQL语句集,经过编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果这个存储过程带有参数的话)来执行,实现对表的增删改查。

       也就是说存储过程其实就是SQL语句或者是流程控制语句的集合,也就是说就一个单纯的插入语句也可以作为一个存储过程来执行。同时,存储过程事先在SQL数据库中编译好,在用的时候可以直接使用存储过程名并赋给参数(如果带参数)就可以调用。由于存储过程事先编译好,所以说像某一包含大量SQL代码或被多次执行,那么它就会比一般的SQL语句执行速度快很多,但像那种批处理的SQL语句在执行时,每次都会对他进行编译优化,可能其速度会相对慢些。

       存储过程可以被作为一种安全机制来充分利用系统管理员通过执行某一存储过程的权限进行限制,从而能够实现对相应的数据访问权限的限制,避免非授权用户对数据访问。另外存储过程还能有效防止SQL注入,对数据库操作时其实我们是在拼接SQL语句,在这个时候就会用到参数,如果传的是字符串,而是非参数,那么可能就有人利用你拼接字符串的思想,利用现有SQL语句,凭借另外的SQL语句,构成非本意SQL语句,对数据库操作,数据库安全性级别降低。

       触发器是这样定义的:触发器主要是通过事件进行触发而被执行,当对某一表在进行例如增删改的时候,SQL Server自动执行定义的一些SQL语句或者流程控制语句,从而确保对数据的处理符合由这些SQL语句定义的规则。

     触发器可以侦测数据库内的操作,并自动级联影响整个数据库的各项内容,比如说,某个表的触发器包含有对另外一个表的数据操作,而该操作又导致该表上触发器被处罚。这就为我们处理大量连续性的多表的操作提供了方便。我个人觉得,我们使用触发器仅仅是因为方便。触发器它并不能提高性能(至于为什么,这个我也不知道为什么会这样,找了很久资料也没找到原因)。

       虽然说使用触发器和存储过程都有很多好处,给我们提供处理数据的方便,但是它们仍然避免不了由这么一些缺点。

       对于存储过程来说,存储过程它的一致性比较差,代码可复用性也不好,比如说,获取学生信息,这个窗体获取的学生信息仅仅包含学生学号、班级、年级,但是另一个获取学生信息却包含学生学号、班级、姓名、年级、住址、备注、是否获得什么奖学金之类的,这样的话,虽然两个都是在获取学生信息,但是却要写两个存储过程,对表操作两次,两次都是获取学生信息,只是获取的内容不一样。

       对于触发器,由于其隐式存在,会让我们不容易维护,即可维护性不理想。比如说,系统做完了,文档完成了,但是编写文档的人却忘了将触发器写进去,这时,系统有问题了,非开发人员来维护,对某个功能,调试了很久,但是依然达不到自己想要的结果,反复检查,什么都没有错,怎么也找不到出错点。。。。浪费时间,浪费精力,有点费力不讨好。。。。

       所以说,我觉得,师哥说的有道理,尽量不用触发器,分情况使用存储过程。但是一定要会用,知道它怎么用

摘自:http://blog.csdn.net/dandanzmc/article/details/9632601

原文地址:https://www.cnblogs.com/qiyongliang/p/3360762.html