这几天pub上有人问到db2的关于trigger的操作的问题,抽时间整理了一下!
db2支持表级DML的tirgger!也就是增删改的trigger!这边分别对insert和update做了2个例子
首先看2个表的DDLdescribe table DB2ADMIN.TEST;
列 类型 类型
名称 模式 名称 长度 小数位 NULL
------------------------------ --------- ------------------ -------- ----- ------
ID SYSIBM INTEGER 4 0 是
NAME SYSIBM VARCHAR 100 0 是
AGE SYSIBM INTEGER 4 0 是
3 条记录已选择。
describe table db2admin.aaaa;
Statement processed successfully in 1.43 secs.
describe table db2admin.aaaa;
completed successfully.
列 类型 类型
名称 模式 名称 长度 小数位 NULL
------------------------------ --------- ------------------ -------- ----- ------
ID SYSIBM INTEGER 4 0 是
TNAME SYSIBM VARCHAR 100 0 是
EVENT SYSIBM INTEGER 4 0 是
3 条记录已选择。
一.对于trigger的insert
drop TRIGGER DB2ADMIN.ZXT_TEST_INSERT;
SET SCHEMA DB2ADMIN ;
SET CURRENT PATH = "SYSIBM","SYSFUN","SYSPROC","CCP";
CREATE TRIGGER DB2ADMIN.ZXT_TEST_INSERT
AFTER INSERT
ON DB2ADMIN.TEST
FOR EACH ROW
MODE DB2SQL
BEGIN ATOMIC
declare v_count integer;
if exists(select t.tname from db2admin.aaaa t where t.tname = 'TEST')
then
update db2admin.aaaa set event=2 where tname = 'TEST';
else
select count(1)+1 from db2admin.aaaa t;
insert into db2admin.aaaa values(value(v_count,1),'TEST',1);
end if;
end;
commit;
db2 => alter table DB2ADMIN.TEST activate not logged initially with empty table
DB20000I SQL 命令成功完成。
db2 => alter table db2admin.aaaa activate not logged initially with empty table
DB20000I SQL 命令成功完成。
db2 => select * from DB2ADMIN.TEST
ID NAME AGE
----------- --------------------- -------
0 条记录已选择。
db2 => select * from db2admin.aaaa
ID TNAME EVENT
----------- ----------------------- -------
0 条记录已选择。
db2 => insert into DB2ADMIN.TEST values (01,'ZXT',25)
DB20000I SQL 命令成功完成。
db2 => commit
DB20000I SQL 命令成功完成。
db2 => select * from DB2ADMIN.TEST
ID NAME AGE
----------- --------------------- -------
1 ZXT 25
1 条记录已选择。
db2 => select * from db2admin.aaaa
ID TNAME EVENT
----------- ----------------------- -------
1 TEST 1
1 条记录已选择。
db2 => insert into DB2ADMIN.TEST values (02,'XDL',23)
DB20000I SQL 命令成功完成。
db2 => select * from DB2ADMIN.TEST
ID NAME AGE
----------- --------------------- -------
1 ZXT 25
2 XDL 23
2 条记录已选择。
db2 => select * from db2admin.aaaa
ID TNAME EVENT
----------- ----------------------- -------
1 TEST 2
1 条记录已选择。
二.关于trigger的update操作
CREATE TRIGGER DB2ADMIN.ZXT_TEST_UPDATE
AFTER update
ON DB2ADMIN.TEST
REFERENCING OLD AS o NEW AS n
FOR EACH ROW
MODE DB2SQL
BEGIN ATOMIC
declare v_count integer;
if(o.name =n.name) then
insert into db2admin.aaaa values(1000,n.name,1);
elseif(o.age=n.age) then
insert into db2admin.aaaa
values(1001,char(integer(n.age)),1);
end if;
end;
db2 => connect to dw
数据库连接信息
数据库服务器 = DB2/NT 8.2.0
SQL 授权标识 = DB2ADMIN
本地数据库别名 = DW
db2 => select * from DB2ADMIN.TEST
ID NAME AGE
----------- --------------------- -------
1 ZXT 25
2 XDL 23
2 条记录已选择。
db2 => select * from db2admin.aaaa
ID TNAME EVENT
----------- ----------------------- -------
1 TEST 2
1 条记录已选择。
db2 => update DB2ADMIN.TEST set name='ZXT1' where id =1
DB20000I SQL 命令成功完成。
db2 => select * from DB2ADMIN.TEST
ID NAME AGE
----------- ------------------------ -------
1 ZXT1 25
2 XDL 23
2 条记录已选择。
db2 => select * from db2admin.aaaa
ID TNAME EVENT
----------- ------------------------ -------
1001 25 1
1 TEST 2
2 条记录已选择。
db2 => update DB2ADMIN.TEST set AGE=23 where id =2
DB20000I SQL 命令成功完成。
db2 => select * from DB2ADMIN.TEST
ID NAME AGE
----------- ------------------------ -------
1 ZXT1 25
2 XDL 23
2 条记录已选择。
db2 => select * from db2admin.aaaa
ID TNAME EVENT
----------- ------------------------- -------
1001 25 1
1000 XDL 1
1 TEST 2
3 条记录已选择。
db2 =>
db2 =>