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