db2 触发器
语法:
1.CREATE TRIGGER trigger_name
2.NO CASCADE BEFORE
3.INSERT ON ZFS_ADJUSTMENT
4.REFERENCING
5.NEW AS NEWROW
6.FOR EACH ROW MODE DB2SQL
7.BEGIN ATOMIC
8. IF (NEWROW.ADJ_reason IS NULL) THEN
9. SET NEWROW.ADJ_reason = '2099-1-1';
10. END IF;
11.END
解释:
- 1.创建触发器 【trigger_name】为触发器名称。
- 2.指定触发时机,列如: before ,after,instead of
- 3.指定触发事件,以及涉及的字段和表,触发事件:insert,update,delete;字段和表语法:of 字段 on 表 【其中 on 表是不可省略的】
- 4.5.指定操作前和操作后的行记录,new,old
- 6.指定触发次数,FOR EACH ROW,FOR EACH STATEMENT,其中前者指按行触发,后者指按语句触发,列如:有一条SQL语句要修改10跳记录,则FOR EACH ROW要运行10次,而FOR EACH STATEMENT只运行一次。
- 7.内容开始【ATOMIC可用于发生错误回滚数据,非必要项】
- 8.9.10.内容
- 11.结束
注意:
- 根据触发事件【3】的不同决定new和old【4.5】是否可用
Before与After区别:
before:(insert、update)可以对new进行修改,after不能对new进行修改,两者都不能修改old数据。
对于INSERT语句, 只有NEW是合法的;
对于DELETE语句,只有OLD才合法;
对于UPDATE语句,NEW、OLD可以同时使用。- 触发时机的before【2】前需加NO CASCADE关键字,以防触发器级联
- INSTEAD OF【2】是针对视图的触发器,如INSTEAD OF Delete 表示任何对该视图的Delete操作都将转为执行触发器的代码。【INSTEAD OF触发器中不能有WHEN,因为她是无条件触发的。】
- 使用【2】BEFORE时,内容不能对其他表进行DML操作(例如insert,update,delete)