informix触发器事件包括INSERT、UPDATE、DELETE与select(这里暂不讨论); 触发时间可以为三个时刻: 1.触发器事件执行之前(BEFORE) 2.触发器事件执行之后(AFTER) 3.触发器事件执行过程中(FOR EACH ROW) 触发时间开始后,可以通过SQL语句来执行特定的,操作包括INSERT,DELETE,UPDATE与EXECUTE PROCEDURE
INSERT触发器的语法如下: CREATE TRIGGER trigger_name INSERT ON table_name BEFORE [WHEN (condition)] (trig_action1,trig_action2,...)| FOR EACH ROW [WHEN (condition)] (trig_action1,trig_action2,...)| AFTER [WHEN (condition)] (trig_action1,trig_action2,...)| [DISABLED|ENABLED] or CREATE TRIGGER trigger_name INSERT ON table_name REFERENCING NEW AS correlation_name FOR EACH ROW [WHEN (condition)] (trig_action1,trig_action2,...) [BEFORE [WHEN (conditon)](trig_action3,trig_action4,...)]| [AFTER [WHEN (conditon)] (trig_action3,trig_action4,...)] [DISABLED|ENABLED]
DELET触发器的语法如下: CREATE TRIGGER trigger_name DELETE ON table_name BEFORE [WHEN (condition)] (trig_action1,trig_action2,...)| FOR EACH ROW [WHEN (condition)] (trig_action1,trig_action2,...)| AFTER [WHEN (condition)] (trig_action1,trig_action2,...)| [DISABLED|ENABLED] or CREATE TRIGGER trigger_name DELETE ON table_name REFERENCING NEW AS correlation_name FOR EACH ROW [WHEN (condition)] (trig_action1,trig_action2,...) [BEFORE [WHEN (conditon)](trig_action3,trig_action4,...)]| [AFTER [WHEN (conditon)] (trig_action3,trig_action4,...)] [DISABLED|ENABLED]
UPDATE触发器的语法如下: CREATE TRIGGER trigger_name UPDATE [OF (column,column,...)] ON table_name BEFORE [WHEN (condition)] (trig_action1,trig_action2,...)| FOR EACH ROW [WHEN (condition)] (trig_action1,trig_action2,...)| AFTER [WHEN (condition)] (trig_action1,trig_action2,...)| [DISABLED|ENABLED] or CREATE TRIGGER trigger_name UPDATE [OF (column,column,...)] ON table_name REFERENCING NEW AS correlation_name OLD AS correlation_name FOR EACH ROW [WHEN (condition)] (trig_action1,trig_action2,...) [BEFORE [WHEN (conditon)](trig_action3,trig_action4,...)]| [AFTER [WHEN (conditon)] (trig_action3,trig_action4,...)] [DISABLED|ENABLED]
触发器语法: trigger_name 用户定义的触发器名,在数据库中{wy},不超过18个字符,以字母开始。 INSERT是一个触发器事件,表中插入行时触发器被xx,一个表只有一个INSERT触发器, DELETE是一个触发器事件,表中删除行时触发器被xx,一个表只有一个DELETE触发器。 UPDATE是一个触发器事件,表中根性列时触发器被xx,如果包括列清单,则更新列清单中的列时触发器被xx。否则更 形表中任何列时触发器被xx,一个表可以有多个UPDATE触发器。但是列清单要相互排斥。 ENABLED指定启动触发器,即执行触发器事件时即xx触发器。这是生成触发器时的默认值。 DISABLED指定生成但关闭触发器,即执行触发器事件时不xx触发器。
实例:在一个基表上创建insert,update,delete这三个触发器,将对基表的操作保存在监控表中,达到监控基表的操作过程 创建基表table_trigger1 create table table_trigger1 ( id1 char(10), --id1,{wy} name1 char(20), --姓名 primary key(id1) -----基表必须要有关键子,不然通过监控表无法获知对哪一行数据进行了操作 ) 创建监控表 create table table_trigger2 ( id2 char(10), --id2,对应操作基表的id1,这里的id2不能设置为主键,因为对基表的某一行可以操作多次 kind varchar(1), --类型,用I来表示insert,U来表示update,D来表示delete time2 datetime year to fraction(5) --时间,表示操作发生的时间 ) 创建3个触发器: insert触发器 create trigger trigger_insert -- 创建trigger_insert 触发器 insert on table_trigger1 --在基表table_trigger1表创建insert触发事件 referencing NEW as new --定义new 在后面要使用 for each row --使用referencing语句的前提条件,必须加上 ( insert into table_trigger2 (id2,kind,time2) //向监控表table_trigger2插入数据 values (new.id1,'I',current) //current表示触发时的时间 ); update触发器 create trigger trigger_update update on table_trigger1 referencing Old as old for each row ( insert into table_trigger2 (id2,kind,time2) values (old.id1,'U',current) ); delete触发器 create trigger trigger_delete delete on table_trigger1 referencing Old as old for each row ( insert into table_trigger2 (id2,kind,time2) values (old.id1,'D',current) ); 测试: 执行下面4句sql语句 insert into table_trigger1 values ('1','name1'); insert into table_trigger1 values ('2','name'); update table_trigger1 set name1='newName1' where id1='1'; delete table_trigger1 where id1='2'; 在监控表table_trigger2中的数据: id2 kind time2 1 I 发生时刻 2 I 发生时刻 1 U 发生时刻 2 D 发生时刻 通过监控表就可以详细的知道table_trigger1表的数据变化情况了