达梦数据库的触发器管理
触发器类型有分为操做前触发、操做后触发、DLL事件触发、系统事件触发、时间触发等等,触发器与存储过程的区别是触发器不能单独执行调用,而是在用户执行特定语句时自动触发执行触发器。如下举例常见的插入事件、更新事件作演示。数据库
一、建立BEFORE触发器测试
准备工做
建立触发器前先建两张测试表(数据表和结果表),目的在数据表插入前就执行触发器里的语句,触发器里的语句是统计当前数据库的记录数。
create table tab_before(id int, name varchar(20));
insert into tab_before values(1,'aaa');
insert into tab_before values(2,'bbb');
insert into tab_before values(3,'bbb');ide
create table tab_before_result (type varchar(20),num int);
测试
建立触发器
create or replace trigger trigger_before
before insert on tab_before
begin
insert into tab_before_result select 'before',count(*) from tab_before;
end;
/
事件
测试验证
插入一条数据测试,看看是否是统计插入前的记录数
insert into tab_before values(4,'bbb');it
查看的结果是只有3条初始化的记录,第4条插入的记录未统计。
select * from tab_before_result;
table
二、建立AFTER触发器测试
建立触发器前一样也先建两张测试表(数据表和结果表),目的是在数据表插入后执行触发器里的语句,触发器里的语句是统计当前最新数据库的记录数。
create table tab_after(id int, name varchar(20));
insert into tab_after values(1,'aaa');
insert into tab_after values(2,'bbb');
insert into tab_after values(3,'bbb');class
create table tab_after_result (type varchar(20),num int);
select
建立触发器
create or replace trigger trigger_after
after insert on tab_after
begin
insert into tab_after_result select 'after',count(*) from tab_after;
end;
/
im
测试验证
插入一条数据测试,看看是否是统计插入后的记录数
insert into tab_after values(4,‘bbb’);统计
查看的结果是统计最新的4条初始化的记录,包含了第4条插入的记录。
select * from tab_after_result;
三、建立DLL事件触发器测试
建立触发器前先建两张测试表(数据表和结果表),当数据库发生DDL语句操做时会执行触发器里的语句内容。
测试1:在数据表插入记录,看是否会执行触发器里的语句。
目的2:建立一张新表看结果表发生的变化,看是否会执行触发器里的语句。
create table tab_ddl(id int, name varchar(20));
create table tab_ddl_result (type varchar(20),num int);
建立触发器
create or replace trigger trigger_ddl
before create
on schema
begin
insert into tab_ddl_result select 'ddl',count(*) from tab_ddl;
end;
/
测试验证
插入一条数据测试,结果是没有执行触发器
insert into tab_ddl values(1,‘aaa’);
建立一张表测试,结果是执行了触发器里的语句
create table tab_ddl2(id int, name varchar(20));
四、案例
tbl_slope:发生更新的表,
checkupdates:更新后插入数据的表
CREATE trigger updatetbl_slope
AFTER update-- 表示触发器是在激活它的语句之后触发
on tbl_slope
for each row -- mysql固定语法
BEGIN
if EXISTS(SELECT * FROM checkupdates A WHERE A.ID=new.UNIFIEDCODE LIMIT 1)
THEN
update checkupdates set LastTime=NOW() where TableName='TBL_AVALANCHE' and ID=NEW.UNIFIEDCODE;
else
insert into checkupdates VALUES(new.UNIFIEDCODE, 'TBL_AVALANCHE', NOW());
END if;
END