数据库---触发器

 


继续接上一讲,今天梳理一下数据库中的触发器的相关知识点。

一、触发器的概念

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__

本文作者excellent_1
本文链接https://www.cnblogs.com/xj-excellent/p/18085807.html
关于博主:互联网小萌新一名,希望从今天开始慢慢提高,一步步走向技术的高峰!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   excellent_1  阅读(307)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示