create table STUDENT ---创建student表


(


id NUMBER(19), --id


stu_no VARCHAR2(20), --学号


stu_name VARCHAR2(32), --姓名


stu_age NUMBER, --年龄


stu_major VARCHAR2(32) --专业


)


create table STU_LOG ---创建stu_log表,用于记录对student表的操作日志


(


log_id NUMBER, --日志id


log_action VARCHAR2(100), --操作名称


log_date DATE, --操作时间


log_message VARCHAR2(32) --


)


 


 


-- a、行级触发器(before触发器)


create or replace trigger modify_stu


before insert on student


for each row


declare


next_id number;


begin


select seq_test.nextval into next_id from dual;


:new.id :=next_id;


end;


插入一条数据,但是不插入id


insert into student(stu_no,stu_name,stu_age,stu_major) values('NO1','张三',20,'中文系');


查询结果如下,自动生成id了


 


 


b、 行级触发器(after触发器)


创建触发器:将对student表的操作都记录到stu_log表中(update of 用于指定一个或多个字段,指定字段被更新时才会触发触发器)


create or replace trigger modify_stu


after insert or delete or update of stu_name


on student


for each row


begin


if inserting then


insert into stu_log values(1,'insert',sysdate,:new.stu_name);


elsif deleting then


insert into stu_log values(2,'delete',sysdate,:old.stu_name);


elsif updating then


insert into stu_log values(3,'update_old',sysdate,:old.stu_name);


insert into stu_log values(4,'update_new',sysdate,:new.stu_name);


end if;


end;


 


依次执行


insert into student values(1,'NO2','李四',21,'数学系');


delete student where stu_name='张三';


update student set stu_age=19 where stu_name='李四';


update student set stu_name='王二' where stu_name='李四';


查询stu_log表的结果如下


5.1oracle触发器_触发器

 

 


第3条update语句没有触发该触发器,因为触发器指定只有修改stu_name字段才会触发触发器


 


c、语句级触发器(before触发器):用来控制对表的修改


create or replace trigger xg_stu


before insert or update or delete on student


begin


if deleting then


raise_application_error(-20001,'该表不允许删除数据');


elsif updating then


raise_application_error(-20002,'该表不允许修改数据');


elsif inserting then


raise_application_error(-20003,'该表不允许插入数据');


end if;


end;


5.1oracle触发器_字段_02

 

 


插入数据时报错如下,删除和修改数据同样也报错


 


d、语句级触发器(after触发器):略


 


create or replace trigger D_STATUS_CHG_TRIGGER2020


after insert or update or delete on D_STATUS_CHG


for each row


declare


-- local variables here


li_data_chg_id number(16,0); --数据变更索引ID


ls_data_table_code varchar2(64);--数据变更表名


li_data_pk_id number(16,0); --数据记录主键值


ls_data_chg_type varchar2(8); --数据变更类型(增、删、改)


ldt_data_chg_time date; --数据变更时间


ls_org_no varchar2(16); --供电单位编号


ls_app_type_code varchar2(8); --来源业务类型(新装;变更;销户)


ls_spec_type_code varchar2(8); --专业分类(数据采集(01);其他(02))


ls_app_no varchar2(16); -- 来源申请编号


ls_op_status1 varchar2(8); --记录处理状态(适应于数据采集系统)


ls_op_status2 varchar2(8); --记录处理状态(适应于实时电费计算系统)


ls_op_status3 varchar2(8); --记录处理状态(预留)


ls_op_status4 varchar2(8); --记录处理状态(预留)


ls_op_status5 varchar2(8); --记录处理状态(预留)


ls_op_status6 varchar2(8); --记录处理状态(预留)


ls_execute_sql varchar2(1000); --动态sql串


ls_data_chg_time varchar2(17); --数据变更时间


begin


ls_spec_type_code := '01';


select seq_pub_data_chg_map.nextval into li_data_chg_id from dual;


ls_data_table_code := 'd_status_chg';


select sysdate into ldt_data_chg_time from dual;


if inserting then


li_data_pk_id := :new.read_id;


ls_data_chg_type := '0';


--ls_org_no := substr(:​​new.org_no,1,5);​


--ls_app_type_code := :new.app_type_code;


--ls_app_no := :new.app_no;


ls_spec_type_code:='01';


ls_op_status1 := '0';


ls_op_status2 := '0';


elsif updating then


li_data_pk_id := :new.read_id;


ls_data_chg_type := '1';


--ls_org_no := substr(:new.org_no,1,5);


--ls_app_type_code := :new.app_type_code;


--ls_app_no := :new.app_no;


ls_spec_type_code:='01';


ls_op_status1 := '0';


ls_op_status2 := '0';


elsif deleting then


li_data_pk_id := :old.read_id;


ls_data_chg_type := '2';


--ls_org_no := substr(:old.org_no,1,5);


--ls_app_type_code := :old.app_type_code;


--ls_app_no := :old.app_no;


ls_spec_type_code:='01';


ls_op_status1 := '0';


ls_op_status2 := '0';


end if;


ls_data_chg_time:=to_char(ldt_data_chg_time,'yyyymmddhh24miss');


---将数据插入变更索引控制表


insert into pub_data_chg_map


( data_chg_id,


data_table_code,


data_pk_id,


data_chg_type,


data_chg_time,


org_no,


app_type_code,


spec_type_code,


app_no,


op_status1,


op_status2,


op_status3,


op_status4,


op_status5,


op_status6


)


values


(li_data_chg_id,


ls_data_table_code,


li_data_pk_id,


ls_data_chg_type,


to_date(ls_data_chg_time,'yyyymmddhh24miss'),


ls_org_no,


ls_app_type_code,


ls_spec_type_code,


ls_app_no,


ls_op_status1,


ls_op_status2,


ls_op_status3,


ls_op_status4,


ls_op_status5,


ls_op_status6);


 


end D_STATUS_CHG_TRIGGER;