本表触发更新modifytime,跨表更新modifytime 触发器

一、每行有改动,则触发更新modifytime

SQL> create table test(id int, name varchar(10), crdate date, udate date);

表已创建。

SQL>
SQL> create trigger tri_test_up
2 before update on test
3 for each row
4 begin
5 :new.udate := sysdate;
6 end;
7 /

触发器已创建

SQL>
SQL> insert into test values(100, 'zhang', date'2016-01-01', date'2016-01-01');

已创建 1 行。

SQL>
SQL> update test set name = 'xx';

已更新 1 行。

SQL>
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

会话已更改。

SQL>
SQL> select * from test;

ID NAME CRDATE UDATE
---------- -------------------- ------------------- -------------------
100 xx 2016-01-01 00:00:00 2017-09-25 10:39:39

SQL>
SQL> drop table test purge;

表已删除。

二、跨表更新modifytime触发器

create table m(mid int, modifytime date);
create table t(id int, mid int, c1 int, c2 int);
create table r(rid int, refid varchar(10), refname varchar(10));

insert into m(mid) select rownum from DUAL connect by rownum <=10;

insert into t(id,mid)
select rownum, mid from m, (select rownum from DUAL connect by rownum <= 10) x;

begin
insert into r(rid, refid, refname) values(1,'r1','XXX');
insert into r(rid, refid, refname) values(2,'r1','YYY');
insert into r(rid, refid, refname) values(3,'r1','ZZZ');

insert into r(rid, refid, refname) values(4,'r2','XXX');
insert into r(rid, refid, refname) values(5,'r2','YYY');
insert into r(rid, refid, refname) values(6,'r2','ZZZ');
insert into r(rid, refid, refname) values(7,'r2','XXX');
insert into r(rid, refid, refname) values(8,'r2','YYY');
insert into r(rid, refid, refname) values(9,'r2','ZZZ');
end;
/

update t set c1 = mod(dbms_random.value() * 10 + 1 ,2) + 3;
update t set c2 = mod(dbms_random.value() * 10 + 1 ,5) + 4;

create or replace trigger tri_r_update
before update on r
for each row
begin
update m
set modifytime = sysdate
where exists(select * from t where m.mid = t.mid and c1 = :new.rid);
update m
set modifytime = sysdate
where exists(select * from t where m.mid = t.mid and c2 = :new.rid);
end;
/

create index ix_t_c1 on t(mid,c1);
create index ix_t_c2 on t(mid,c2);

create index ix_m_mid on m (mid);

/*
select * from t where c2 = 9
select * from m
SELECT * FROM r
update r set refname = '099999' where rid = 9
update m set modifytime = null
*/

drop table m purge;
drop table t purge;
drop table r purge;

posted @ 2017-11-01 08:54  @天天向上@  阅读(854)  评论(0)    收藏  举报