-
触发器的分类:
-
从时间上划分:After触发器 和 Before触发器 两种;
-
从数据的修改上面划分:insert、delete、update 三种;
-
从适用范围上划分:行级触发器和表级触发器。
-
2.触发器工作原理.
-
After触发器:
-
后触发,即在表的数据更新之后触发,注意不是保存之后。
-
-
Before触发器:
-
前触发,即在表的数据更新前触发。
-
-
增加操作用前触发,修改和删除操作用后触发。
3.临时表-:new和:old.
-
在使用触发器的时候Oracle会根据使用触发器的类型自动创建临时表-:new或者:old,里面的字段和当前所操作的表里面的字段保持一致。
-
临时表 ":new":做增加操作的时候Oracle会自动创建该临时表,里面用来临时存放增加过后的数据。等增加数据确认后,再把该临时表里面的数据插入到真正的表里面。等增加操作提交之后,该临时表自动消失。
-
临时表 ":old":做删除、修改操作的时候Oracle会自动创建该临时表,里面用来临时存放删除、修改前的数据。等删除、修改操作提交后,该临时表自动消失。
4.创建触发器语法.
create or replace trigger 触发器名 --触发器名
after insert --后触发器,而且是增加类型触发器
on 表名 --触发器所依赖的表
for each row --行级触发器
begin
if :new.字段 = 0 then --触发触发器的条件
dbms_output.put_line('警告:已插入记录,但数量为零');
raise_application_error(-20018,'警告:已插入记录,但数量为零!'); --抛出异常,-20018是错误编码,范围是-20000到-21000。
end if;
end;
案例1:后触发-delete操作.
-
李思文不能被删除。
create or replace trigger tname --触发器名
after delete --之后触发器(删除类)
on stuinfo --表名
for each row --行级触发器
begin
--从老表(:old)中获取删除的学生的名字并进行判断
if :old.stuname='李斯文' then
raise_application_error(-20018,'该学生不能删除!'); --抛出异常
end if;
end;
案例2:前触发insert&后触发delete&后触发&update.
-
李斯文不能删除,张三不能增加,梅超风不能修改。
create or replace trigger tname
after delete or insert or update
on stuinfo
for each row
begin
if deleting then--删除
--从老表(:old)中获取删除的学生的名字并进行判断
if :old.stuname='李斯文'then
raise_application_error(-20018,'该学生不能删除!');
end if;
elsif inserting then--增加
--从新表(:new)中获取增加的学生的名字并进行判断
if :new.stuname='张三' then
raise_application_error(-20019,'该学生不能要!');
end if;
elsif updating then--修改
--从老表(:old)中获取要修改的学生的名字并进行判断
if :old.stuname='梅超风' then
raise_application_error(-20020,'该学生不能修改!');
end if;
end if;
end;
案例3:多表连删.
-
删除学生的同时自动删除其成绩。
create or replace trigger tname
after delete
on stuinfo
for each row
declare --定义变量来保存要删除的学号(也可不定义)
sno varchar2(10);
begin
--获取删除的学生的学号
sno:=:old.stuno;
delete from stumarks where stuno=:old.stuno; --(或者写stuno=sno)
end;
5.触发器+序列=标识列.
create sequence sname_01; --创建序列
--创建触发器
create or replace trigger tname
before insert
on 表名
for each row
begin
:new.sid:=sname_01.nextval;
end;