本文基于多篇博文整理而来,目的是较全面的学会使用DB2触发器,后期再整理复杂的使用场景,看完本文应该能够自己创建一个基本的触发器。

1.什么是触发器
当一个指定的 SQL 操作(如 DELETE,INSERT,或者是 UPDATE 操作)作用于某张表时,
一个定义了一组操作的触发器就可以被激活。
触发器并不像参照完整性约束和检查约束那样,我们甚至可以使用对其他表来进行更新。

触发器是一种过程,与表关系密切,用于保护表中的数据。
当一个表被修改(insert、update或delete)时,触发器自动执行。
触发器可以实现多个表之间数据的一致性和完整性。

触发器分为:DML触发器、替代触发器、系统触发器。

DML触发器:可以在DML语句进行触发,可以在DML操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发。
替代触发器:进行视图操作的一种处理方法。
系统触发器:可以在数据库系统的事件中进行触发,如系统的启动与关闭等。

2.DML触发器工作原理

触发器是利用了表数据发生变化时,自动生成的两个虚拟表,一个是inserted,一个是deleted,
这两个虚拟表从其他地方是检索不到的,只有触发器能读到。

当数据发生变化时,如果是新插入数据,则该数据会在inserted里面暂时保存。
而删除一条数据时,则会在deleted里面暂时保存。
更新则等于先删除再插入,也就是deleted里面存更新前,inserted里面存更新后。
这些数据会在触发器执行完成后消失。

3、DML触发器类型

1)BEFORE 触发器:在对表插入或更新之前执行该触发器,允许使用CALL 和 SIGNAL SQL 语句;

2)BEFORE DELETE 触发器:在删除操作之前执行该触发器;

3)AFTER 触发器:在更新、插入或删除操作之后执行。该触发器用于更新反映表间关系和一致性的其他表中的数据,还用于确保数据完整性。AFTER 触发器通常用于在特定情况下向用户生成报警;

4)INSTEAD OF 触发器:该触发器支持对不支持插入、更新和删除操作的视图执行这些操作;

4、基本语法

CREATE TRIGGER 1) trigger_name
2) [BEFORE/AFTER] 3)[INSERT/DELETE/UPDATE] ON 4) [table_name]
5) [FOR EACH ROW]
属性解析:
1)触发器名称
2)触发器条件达成前还是达成后调用触发器
3)触发器被触发的条件(当table_name表执行insert/delete/update这三种操作哪一种时候被触发)
4)当table_name表被操作时候调用触发器
5)声明该触发器是一个行级触发器(如果未指明则被默认为语句级触发器)

触发器中使用NEW和OLD来获取某列的新旧属性
insert中只能用NEW,DELETE中只能用OLD,update中既可以用NEW,也可以用OLD

5. before举例--- before代表触发器里面的命令在DML修改数据之前执行

1)在emp表上面创建触发器,当输入的工资小于100时,自动将工资修改为100

create or replace trigger tri_emp_sal_check
before INSERT OR UPDATE ON emp
for each row
BEGIN
IF :new.sal <100 THEN
:new.sal :=100;
END IF;
END;

执行DML语句
update emp set sal =90 where empno =3030;
commit;
发现工号3030员工的工资成功修改为100。

需要修改NEW值的时候就使用BEFORE,其余场景一律使用after

举个需要修改:NEW值的情况:某个字段数据库中是NUMBER型的,比如年龄,而送过来的数据是带字符的,比如“17岁”,
直接写入就报错了,此时用触发器把数据进行规范化处理后再写入数据库,就可以用before类型的数据库。

2)在sales表执行insert之前触发

CREATE TRIGGER sales_bi_trg #触发器声明
BEFORE INSERT ON sales #触发器被触发条件
FOR EACH ROW #声明为一个行级触发器
BEGIN
DECLARE row_count INTEGER; #声明row_count变量
SELECT COUNT(*) INTO row_count FROM customer_sales_totals WHERE customer_id=NEW.customer_id;
IF row_count > 0 THEN
UPDATE customer_sales_totals
SET sale_value=sale_value+NEW.sale_value
WHERE customer_id=NEW.customer_id;
ELSE
INSERT INTO customer_sales_totals
(customer_id,sale_value)
VALUES(NEW.customer_id,NEW.sale_value);
END IF;
END

语句分析:在sales表执行insert操作之前,查看customer_sales_totals表中是否有将要插入的客户记录,
有的话更新customer_sales_totals表,没有则在customer_sales_totals表中插入客户交易信息。

6.mysql触发器

在一个表上最多建立6个触发器,即
1)before insert型,
2)before update型,
3)before delete型,
4)after insert型,
5)after update型,
6)after delete型。

触发器的一个限制是不能同时在一个表上建立2个相同类型的触发器。
这个限制的一个来源是触发器程序体的“begin和end之间允许运行多个语句”(摘自mysql使用手册)

7.删除触发器

db2 drop trigger <trigger_name>

----------------------------------------------------------------------------------------------------------------------------------------------------------------

使用命令行方式:

su - db2inst1

db2 connect to 数据库名

db2 “触发器SQL语句”

DB2 触发器使用1的更多相关文章

  1. DB2触发器简单例子

    db2使用版本9.7 创建A .B两个表,A表数据有更新.删除.插入时,将A表ID记录放入B表 1.create table A (id varchar(5),name varchar(30)); c ...

  2. DB2 触发器的写法及表主键结构的修改

    DROP TRIGGER TR_MONTHLYCLOSING; CREATE TRIGGER TR_MONTHLYCLOSING NO CASCADE BEFORE INSERT ON PT_MONT ...

  3. DB2学习笔记备忘 2018.5.9

    DB2安装的时候选择了和系统用户一致的选项,然后登陆的时候,连接的时候输入的就是计算机用户的用户名和密码. 1.3 DB2数据库体系结构 系统 一个系统表示DB2的一个安装.在一个由很多及其组成的网络 ...

  4. DB2开发系列之四——触发器

    1.触发器类型 1)BEFORE 触发器:在对表插入或更新之前执行该触发器,允许使用CALL 和 SIGNAL SQL 语句: 2)BEFORE DELETE 触发器:在删除操作之前执行该触发器: 3 ...

  5. DB2检测表字段改动的方法(不用触发器)

    ALTER TABLE TEST ADD COLUMN RTS TIMESTAMP NOT NULL GENERATED ALWAYS FOR EACH ROW ON UPDATE AS ROW CH ...

  6. 你搞懂 ORACLE、 SQLSERVER、MYSQL与DB2的区别了吗

    ORACLE. SQLSERVER.MYSQL与DB2的区别--平台性:    Oracle.MYSQL与DB2可在所有主流平台上运行:    SQL Server只能在Windows下运行: --安 ...

  7. DB2错误码信息

    00 完全成功完成 表 3  01 警告 表 4  02 无数据 表 5  07 动态 SQL 错误 表 6  08 连接异常 表 7  09 触发操作异常 表 8  0A 功能部件不受支持 表 9  ...

  8. DB2常用命令

    DB2安装启动服务中启动不了,可用command启动并查看windows系统的日志.1.启动数据库  db2start2.停止数据库  db2stop3.连接数据库运行 db2命令之前要先运行db2c ...

  9. DB2 错误信息码

    000 00000 SQL语句成功完成 01xxx SQL语句成功完成,但是有警告 +012 01545 未限定的列名被解释为一个有相互关系的引用 +098 01568 动态SQL语句用分号结束 +1 ...

随机推荐

  1. 使用Sublime编写HTML页面时发现,虽然已经设置好了UTF-8的编码格式,但却发现HTML页面的汉字仍然是乱码。

    相信有些同学在使用Sublime编写HTML页面时发现,虽然已经设置好了UTF-8的编码格式,但却发现HTML页面的汉字仍然是乱码吧.我今天就遇到了这样的问题. 第一步:重新设置一下你的meta,设置 ...

  2. AD9各种布线总结

    1.常规布线:不详细说了,是个人就知道怎么弄.需要说明的是在布线过程中,可按小键盘的*键或大键盘的数字2键添加一个过孔:按L键可以切换布线层:按数字3可设定最小线宽.典型线宽.最大线宽的值进行切换. ...

  3. Levenberg-Marquardt优化算法以及基于LM的BP-ANN

    一.LM最优化算法     最优化是寻找使得目标函数有最大或最小值的的参数向量.根据求导数的方法,可分为2大类.(1)若f具有解析函数形式,知道x后求导数速度快.(2)使用数值差分来求导数.根据使用模 ...

  4. tcpdump网络数据抓包

    tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据包的“头”完全截获下来提供 ...

  5. 使用LookAndFeel为界面更换皮肤

    ----------------siwuxie095                             在 Windows 系统中,默认的 Java 运行环境(JRE)会为当前的窗体程序 指定一 ...

  6. 看下面代码输出结果Java

    编译错误 在调用子类构造器之前,会先调用父类构造器,当子类构造器中没有使用"super(参数或无参数)"指定调用父类构造器时,是默认调用父类的无参构造器,如果父类中包含有参构造器, ...

  7. jquery提供的数据提交方式2-ajax

    以前介绍过ajax提交方式.但仅仅是个例子,今天将详细介绍jquery中的$.ajax,$.get,$.post方法. 一,首先介绍$.ajax方法参数(以下参数来自:http://www.cnblo ...

  8. HTML5与CSS3实例教程(第2版) 附源码 中文pdf扫描版

    HTML5和CSS3技术是目前整个网页的基础.<HTML5与CSS3实例教程(第2版)>共分3部分,集中讨论了HTML5和CSS3规范及其技术的使用方法.这一版全面讲解了最新的HTML5和 ...

  9. Window Live Writer在Win7下安装提示错误“OnCatalogResult:0x80190194”

    1.在C:\Users\All Users\Microsoft\WLSetup\Logs下(All Users默认是隐藏文件夹),有两个Window Live的安装日记记录文件,打开第一个找到ERRO ...

  10. 【IDEA下使用tomcat部署web项目】

    1.IDEA下的WEB项目新建就不说了. 2.配置tomcat:file-->settings-->Build,Execution,Deployment-->Application ...