去年初识SQL数据库的时候就接触了着两个概念,但是对于这两对兄弟从何而来,又有什么作用几乎一片空白。慢慢的经历了一次又一次的机房收费,跟他们打了一次又一次的照面,然后是最近敲牛腩新闻发布系统,牛腩老师恨不得所有的SQL语句都写成存储过程,所有稍复杂的多表操作都要用上触发器,才发现在与数据库打交道的岁月,他们应该也是宿命一样的存在---逃不掉,就好好谈谈。
WHAT:
触发器: 基本表在被修改的时候通过事件触发而执行的存储过程。(被动)
作用是保证了由主键和外键所不能保证的参照完整性和数据完整行。
存储过程: 一种数据库对象,将负责不同功能的语句分类封装好,以便反复调用。(主动)
WHY:
触发器:
1:实现比约束更复杂的数据的完整性
2:返回自定义的错误信息
3:实现多张表的连级修改
存储过程:
1:语句封装,可多次调用,just like 面向对象
2:执行速度更快(存储过程第一次执行便被分析优化)
3:保证数据安全(系统管理员可对存储过程进行权限限制)
Personal Understanding:
1:触发器是一个被动的执行过程,更像是一个保护机制,当我的某个数据库的某条数据被修改的时候我预先写好的触发器就这样被触发了,然后他就会通过主外键约束来对其他表的数据进行合理修改以满足整个数据的完整性。而存储过程却是一个十足的积极主动能手,主动把SQL语句分类封装,就像我们在机房收费的时候封装的方法,我写好了有类似的需求直接调用就可以了。
2:触发器和存储过程都是数据库这个层面上进行的操作和修改,可以说基本跟我们要实现的软件代码没半毛钱关系,这样也是符合分层思想的,而且有利于后期系统的维护和修改。如果哪个功能块需求变更我们可能只需要修改数据库里的存储过程或者触发器而不用打开大段的代码去修改SQL语句。
3:两者都从不同方面保护了数据,触发器可以保护数据的完整性,而存储过程则是通过权限管理维护数据的安全。