1、首先创建两个测试表
create table STUDENT_INFO ---创建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) --
)
2、创建序列
--创建序列,SEQ_STUDENT表示序列名
create sequence SEQ_STUDENT
minvalue 1
maxvalue 9999 --最大值
start with 11 -- 开始序列
increment by 1 --每次增长
cache 10; --缓存
3、创建触发器
//创建一个插入时自增的触发器
create or replace trigger tr_stu_add
before insert on STUDENT_INFO
for each row
begin
select SEQ_STUDENT.nextval into :new.id from dual; --seq_user.nextval下一序列,:new.id表示列名
end;
测试触发器
//没有id值,插入时会自增
insert into STUDENT_INFO(stu_no,stu_name,stu_major) values('NO1','张三','中文系');
4、两种类型触发器
// 1.行级触发器
create or replace trigger modify_stucao
after insert or delete or update of stu_name,stu_major --可以设置一个或多个字段
on STUDENT_INFO
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_INFO values(1,'NO2','李四',21,'数学系'); --插入一条数据
delete STUDENT_INFO where stu_name='张三'; --删除一条数据
update STUDENT_INFO set stu_age=25 where stu_name='李四'; --修改李四的年龄
update STUDENT_INFO set stu_major='王二' where stu_name='李四'; --修改李四的名称
//2.语句(表级)触发器
// NEW 或 OLD 引用不允许在表级触发器中
create or replace trigger modify_stu1
before insert or update or delete on STUDENT_INFO
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;
//测试语句
insert into STUDENT_INFO values(1,'NO2','李四',21,'数学系'); --插入一条数据
delete STUDENT_INFO where stu_name='张三'; --删除一条数据
update STUDENT_INFO set stu_age=25 where stu_name='李四'; --修改李四的年龄
update STUDENT_INFO set stu_major='王二' where stu_name='李四'; --修改李四的名称