文章目录
一、触发器的概念
触发器是Oracle数据库的对象,类似存储过程和函数。存储过程和函数需要用户显示调用才执行,而触发器是由一个事件来触发运行,当某个事件发生时会自动地隐式运行,不能被显示的调用。
触发器的本质是存储过程,发生特定事件时Oracle会执行触发器中的代码,它的组成可以分为三个部分:1)触发器执行的条件,即触发器被触发的事件;2)执行触发器的时间,发生事件之前(before)或发生事件之后(after);3)触发器要做的事情,就是触发器被触发以后具体想执行的任务(PL/SQL语句块)。
Oracle的触发器分为DML触发器、DDL触发器、替代触发器和系统触发器。
二、DML触发器
基于DML操作的触发器,细分又可以分为行触发器和语句触发器。
1、语句触发器
DML操作(insert、delete、update),不管SQL语句影响的记录是多少行,触发器只触发一次。
2、行级触发器
DML操作(insert、delete、update),SQL语句影响了多少行记录,触发器就触发多少次。
行级触发器用for each row关键字。
3、DML触发器语法
create [or replace] trigger 用户名.触发器名
{
before|after}
{
delete|insert|update|[of列名]}
on 表名
[for each row [when 条件]]
declare
定义变量。
begin
PL/SQL语句块。
end;
参数说明:
{before|after}
:指定触发器是在对表的操作发生之前触发还是之后触发。
{delete|insert|update|[of列名]}
:触发在动作,可以指定多个动作,例如:insert or update。如果是update,update of 指定一个或多个字段,仅在这些字段被更新时才会触发。update of的应用场景极少。
[for each row]
:表示是行级触发器。
[when 条件]
:只有满足when指定的条件,才会执行触发体中的代码,应用场景极少。
4、触发器谓词
1)创建超女基本信息表T_GIRL,插入5条测试数据。
old谓词:执行前的字段的值的名称,比如update一个表时,使用:old.columnname是指执行update操作之前的列的值。
new谓词:执行后的字段的值的名称,比如update一个表时,使用:new.columnname是指执行update操作之后的列的值。
可以在触发器体的语句块中使用 inserting、updating、deleting谓词,这些谓词会返回相应的DML操作的布尔值,如果为true,则表示执行了相应的insert、update、delete操作。
5、示例
1)准备测试数据,创建超女基本信息表T_GIRL,插入5条测试数据。
drop table T_GIRL;
create table T_GIRL
(
id char(4) not null, -- 编号
name varchar2(30) not null, -- 姓名
primary key(id) -- 指定id为表的主键
);
insert into T_GIRL(id,name) values('0101','西施');
insert into T_GIRL(id,name) values('0102','貂禅');
insert into T_GIRL(id,name)