自己本来想研究一下触发器,然后就根据网上的内容进行了学习,并发下一自己的感想!
一、触发器
触发器是一种在事件发生时隐式地自动执行的PL/SQL块,不能接受参数,不能被显式调用。
触发器分为两类:
一种是系统触发器:由系统事件触发的PL/SQL,比如登陆oracle数据库,登出oracle。
另一种是DML触发器:由DML语句触发的PL/SQL,比如INSERT、UPDATE、DELETE等。
我们一般用到的是DML触发器,所以我们接下来就介绍一下这种触发器:
DML触发器:
让我们先建两张表,students,banji;
create table students(
stuid number not null,
sname varchar2(20) not null,
ban number not null
);
insert into students VALUES (1,'zhangsan',10);
insert into students values (2,'lisi',10);
insert into students values(3,'wangwu',20);
commit;
create table banji(
ban number,
stusum number
);
insert into banji values (10,2);
insert into banji values (20,1);
commit;
1)语句触发器
语句级触发器则只触发一次,与语句所影响到的行数无关,别对只触发一次又误解,不是用一次就完了,而是每次对表进行DML操作是他只触发一次。
语法:
创建和测试语句触发器
CREATE [OR REPLACE] TRIGGER trigger_tname
[before|after] --在触发事件前还是后发生
[update | OR insert | OR delete] --触发事件
ON table_name --是哪张表
declare
--变量声明区
begin
trigger_body --需要触发的事件
end;
/
例子:定义一个不在规定时间无法添加往students表中添加数据的触发器
create or replace trigger dml_students_time
before --在触发事件发生前
insert or update or delete --触发事件为增删改
on students --对表students
begin --执行触发器体
if to_char(sysdate,'HH24:MI') not between '08:00' and '18:00'
or to_char(sysdate,'DY') in ('SAT','SUN')
then
dbms_output.put_line('You may only make changes during normal office hours'); --不符合抛出
end if;
end ;
/
测试:
update students set sname = 'liliu' where stuid = 3;
会出现错误提示,提示内容为:“无效且未通过请重新验证”。
2)行级触发器
行级触发器会对数据库表中的受影响的每一行触发一次触发器代码,,可以这么理解,如果表中数据变得很频繁,那么执行效率会有影响。
语法:
创建和测试行触发器
CREATE [OR REPLACE] TRIGGER trigger_tname
[before|after] --在触发事件前还是后发生
[update of 字段 | OR insert of 字段 | OR delete of 字段] --触发事件of后可选择,不写代表整个表的所有行
ON table_name --是哪张表
[REFERENCING OLD AS old|NEW AS new]
FOR EACH ROW
[WHEN(condition)]
declare
--变量声明区
begin
trigger_body --需要触发的事件
end;
/
二、查看触发器
select trigger_name from all_triggers where table_name='XXX';
三、删除触发器
--删除触发器--
drop trigger trigger_name;
trigger_name:触发器名称
before | after : 指定触发器是在触发事件发生之前触发还暗示发生之后触发
table_name:表名,表示发生触发器作用的对象
for each row:指定创建的是行级触发器,若没有该子句则创建的是语句级触发器
when trigger_condition:添加的触发条件
trigger_body:触发体,是标准的PL/SQL语句块