本文共 3975 字,大约阅读时间需要 13 分钟。
----start
触发器和一个特定的表相关联,当向表中INSERTT、UPDATE、DELETE记录时,触发器会自动激活执行一些预定义的行为。
一:语法:
.-NO CASCADE-.>>-CREATE TRIGGER--trigger-name--+-+------------+--BEFORE-+-----> +-AFTER------------------+ '-INSTEAD OF-------------'>--+-INSERT--------------------------+--ON--+-table-name-+------> +-DELETE--------------------------+ '-view-name--' '-UPDATE--+---------------------+-' | .-,-----------. | | V | | '-OF----column-name-+-'>--+------------------------------------------------------------------+--> | .-------------------------------------------------. | | V (1) (2) .-AS-. | | '-REFERENCING------------------+-OLD--+----+--correlation-name-+-+-' | .-AS-. | +-NEW--+----+--correlation-name-+ | .-AS-. | +-OLD TABLE--+----+--identifier-+ | .-AS-. | '-NEW TABLE--+----+--identifier-'>--+-FOR EACH ROW--------------+--| triggered-action |---------> | (3) | '--------FOR EACH STATEMENT-'triggered-action|--+-------------------------------------+----------------------> | (4) | '--------WHEN--(--search-condition--)-' 说明:一:触发器类型 1、前触发器(BEFORE):在insert、update、delete之前激活,主要用来验证、改变插入或更新的值。 2、后触发器(AFTER):在insert、update、delete之后激活,主要用来实现一些业务逻辑。 3、替代触发器(INSTEAD OF):在视图中定义,该触发器中定义的逻辑会替代视图中的触发SQL 语句。 二:事件类型:DELETE、DELETE、UPDATE 三:对象类型 1、表:可以定义BEFORE、AFTER触发器 2、视图:可以定义BNSTEAD OF触发器 四:引用 1、OLD:引用改变之前的单行 2、NEW:引用改变之后的单行 3、OLD TABLE:引用改变之前的多行 4、NEW TABLE:引用改变之后的多行 五:应用范围 1、FOR EACH ROW:对改变的每行调用一次触发器 2、FOR EACH STATEMENT:每条SQL调用一次触发器 六:激活条件(WHEN):只有符合条件时,触发器才会执行。
二:示例:
--连接数据库CONNECT TO SAMPLE; --创建表USERCREATE TABLE USER( NAME VARCHAR(20) NOT NULL,--姓名 SALARY FLOAT,--工资 LASTUPDATEDDT TIMESTAMP--最后修改时间); --创建USER的历史表CREATE TABLE USER_HIS( NAME VARCHAR(20) NOT NULL,--姓名 SALARY FLOAT,--工资 LASTUPDATEDDT TIMESTAMP,--最后修改时间 OPERATETIME TIMESTAMP,--操作时间 OPERATETYPE CHAR(1)--操作类型(INSERT、UPDATE)); --USER表的LASTUPDATEDDT总是由数据库自动赋值CREATE TRIGGER USER_INS1NO CASCADE BEFORE INSERT ON USERREFERENCING NEW AS NNNFOR EACH ROWMODE DB2SQLSET NNN.LASTUPDATEDDT = CURRENT TIMESTAMP; CREATE TRIGGER USER_UPD1NO CASCADE BEFORE UPDATE ON USERREFERENCING NEW AS NNNFOR EACH ROWMODE DB2SQLSET NNN.LASTUPDATEDDT = CURRENT TIMESTAMP; --每当更改USER表时,自动记录到历史表中CREATE TRIGGER USER_INS2AFTER INSERT ON USERREFERENCING NEW AS NNNFOR EACH ROWMODE DB2SQLINSERT INTO USER_HIS VALUES (NNN.NAME,NNN.SALARY,NNN.LASTUPDATEDDT,CURRENT TIMESTAMP,'I'); CREATE TRIGGER USER_UPD2AFTER UPDATE ON USERREFERENCING NEW AS NNNFOR EACH ROWMODE DB2SQLINSERT INTO USER_HIS VALUES (NNN.NAME,NNN.SALARY,NNN.LASTUPDATEDDT,CURRENT TIMESTAMP,'U'); --USER_HIS表不允许任何修改CREATE TRIGGER USER_HIS_UPD1NO CASCADE BEFORE UPDATE ON USER_HISFOR EACH ROWWHEN (1=1) SIGNAL SQLSTATE VALUE '71001' SET MESSAGE_TEXT = 'USER_HIS 表不允许更新'; CREATE TRIGGER USER_HIS_DEL1NO CASCADE BEFORE DELETE ON USER_HISFOR EACH ROWWHEN (1=1) SIGNAL SQLSTATE VALUE '71001' SET MESSAGE_TEXT = 'USER_HIS 表不允许删除'; --测试INSERT INTO USER (NAME,SALARY,LASTUPDATEDDT) VALUES ('张三',2000.0,'2009-8-18 12:25:00'),('李四',3500.0,'2009-12-18 12:25:00');SELECT * FROM USER;SELECT * FROM USER_HIS;DELETE FROM USER_HIS; --删除DROP TRIGGER USER_INS1;DROP TRIGGER USER_UPD1;DROP TRIGGER USER_INS2;DROP TRIGGER USER_UPD2;DROP TRIGGER USER_HIS_UPD1;DROP TRIGGER USER_HIS_DEL1;DROP TABLE USER;DROP TABLE USER_HIS; --关闭连接 CONNECT RESET;
三:调用示例:
将示例的内容保存为c:/test.sql,然后在DB2 命令窗口中执行如下命令 db2 -tvf c:/test.sql
----更多参见:
----声明:转载请注明出处。
----last updated on 2010.2.9
----written by ShangBo on 2010.2.9
----end