数据库---触发器
继续接上一讲,今天梳理一下数据库中的触发器的相关知识点。
一、触发器的概念
1.1触发器是什么?
触发器是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。关键词:自动触发。
1.2为什么要使用触发器?
触发器经常用于加强数据的完整性约束和业务规则等。
1.3 触发器类型
后置触发器 after
使用after定义的触发器为后触发型的触发器,只有在语句(引发触发器执行的)指定的操作都已成功执行,后续才执行触发器。该种触发器涉及的场景较多,较为常用。
ps:不能在视图上定义AFTER触发器。
前置触发器 before
使用before 选项定义的触发器为前触发型触发器,在这种模式的触发器中,先指定执行触发器,而不是先执行语句。
举个例子:用前触发器实现:新插入职工数据时,其工资必须在相应工作的最低工资到最高工资之间。
二、触发器的书写格式
1 2 3 4 5 6 | <code-pre class= "code-pre" id= "pre-EyWhiM" ><code-line class= "line-numbers-rows" ></code-line> -- 触发器 TRIGGER 代码开发过程中,用的很少;数据体量较大时,尽量少用 <code-line class= "line-numbers-rows" ></code-line> -- 触发器的书写格式如下: <code-line class= "line-numbers-rows" ></code-line> create trigger 触发器名称 after /before insert / update / delete on 表名 <code-line class= "line-numbers-rows" ></code-line> begin <code-line class= "line-numbers-rows" ></code-line> -- 触发器业务代码 <code-line class= "line-numbers-rows" ></code-line> end </code-pre> |
注意事项:
①触发器名称在数据库中,是唯一的。
②for 作用 等同于 after。
③在一个表上,可以建立多个名称不同、类型各异的触发器、每个触发器可由3个操作来引发。
三、触发器的使用
3.1创建触发器
最后点击"保存"即可生效
3.2查看触发器
刚刚创建好的触发器,如何查看呢?
1 2 3 | <code-pre class= "code-pre" id= "pre-85YxEM" ><code-line class= "line-numbers-rows" ></code-line> -- 查看触发器 <code-line class= "line-numbers-rows" ></code-line>show TRIGGERS </code-pre> |
3.3修改触发器
1 2 | <code-pre class= "code-pre" id= "pre-mpYWCE" ><code-line class= "line-numbers-rows" ></code-line> -- 修改触发器:alter trigger 触发器名 <code-line class= "line-numbers-rows" ></code-line> ALTER trigger tri_age</code-pre> |
3.4删除触发器
1 2 | <code-pre class= "code-pre" id= "pre-6zE2HG" ><code-line class= "line-numbers-rows" ></code-line> -- 删除触发器:drop trigeer 触发器名 <code-line class= "line-numbers-rows" ></code-line> DROP trigger tri_age</code-pre> |
四、其他问题答疑
①前置触发器与后置触发器的区别?
前置触发器:before触发器执行失败,sql也会执行失败;
后置触发器:sql执行失败时,after触发器不会执行,sql会回滚;
②触发器与存储过程的区别?
触发器:是特殊的存储过程,是自动触发。
存储过程:由用户、程序、或者触发器 显式调用。
③行级触发器与语句级触发器的区别?
行级触发器:for each row (sql影响1行就触发1次),需要对每一行数据做处理,使用行级触发器。
语句级触发器:for each statement (默认,1条sql触发1次),语句执行完成后,做该语句的业务处理,用语句级别触发器。
特别注意:
mysql不支持语句触发器,所以必须写for each row。
oracle触发器中分行级触发器和语句级触发器,可不写for each row,无论影响多少行都只执行一次。
④可以在视图中创建after触发器吗?
不能
__EOF__

本文链接:https://www.cnblogs.com/xj-excellent/p/18085807.html
关于博主:互联网小萌新一名,希望从今天开始慢慢提高,一步步走向技术的高峰!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律