1.触发器的基本讲解
当特定事件出现时自动执行的存储过程
sql
CREATE [OR REPLACE] TRIGGER trigger_name
AFTER | BEFORE | INSTEAD OF
[INSERT] [[OR] UPDATE [OF column_list]]
[[OR] DELETE]
ON table_or_view_name
[REFERENCING {OLD [AS] old / NEW [AS] new}]
[FOR EACH ROW]
[WHEN (condition)]
declare
begin
end;
案例:对学生表进行增加删除修改后打印一句 操作成功
sql
create or replace trigger trigger01
after insert or update or delete on t_student
declare
begin
dbms_output.put_line('操作成功');
end ;

2.触发器的类型
2.1 语句级触发器
关注的是执行了这条语句
案例:创建一个对学生表的增删改的审计触发器
准备表
sql
CREATE TABLE t_audit_table
(
stablename varchar2(30),
nins number,--记录添加次数
nupd number,--记录修改次数
ndel number,--记录删除次数
startdate date,
enddate date
)
实现:
sql
create or replace trigger trigger02
after insert or delete or update on t_student
declare
v_count number(3);
begin
-- 先判断t_student在这个日志表中是否有这条记录,如果没有,要先插入数据
select count(*) into v_count from t_audit_table where stablename='t_student';
if v_count<=0 then
insert into t_audit_table(stablename,nins,nupd,ndel) values('t_student', 0,0 ,0);
end if;
if inserting then
update t_audit_table set nins=nins+1 where stablename='t_student';
end if;
if updating then
update t_audit_table set nupd=nupd+1 where stablename='t_student';
end if;
if deleting then
update t_audit_table set ndel=ndel+1 where stablename='t_student';
end if;

2.2 行级触发器
和影响的行数:影响了多少行数据。那么这个触发器就会触发多少次
sql
create or replace trigger trigger02
after insert or delete or update on t_student
FOR EACH ROW
declare
v_count number(3);
begin
-- 先判断t_student在这个日志表中是否有这条记录,如果没有,要先插入数据
select count(*) into v_count from t_audit_table where stablename='t_student';
if v_count<=0 then
insert into t_audit_table(stablename,nins,nupd,ndel) values('t_student', 0,0 ,0);
end if;
if inserting then
update t_audit_table set nins=nins+1 where stablename='t_student';
end if;
if updating then
update t_audit_table set nupd=nupd+1 where stablename='t_student';
end if;
if deleting then
update t_audit_table set ndel=ndel+1 where stablename='t_student';
end if;
2.3 限制行级触发器
对部分数据做特定的处理,比如:不能删除管理员、
sql
create or replace trigger trigger03
before delete on t_student
for each row
when(old.stuname='小李6')
declare
begin
dbms_output.put_line('班长不能被删除');
RAISE_APPLICATION_ERROR(-20001, '班长不能被删除');
end;
