触发器是一个与表相关联的,存储下来可以自动执行的PL/SQL程序。每当一个特定的数据操作语句(insert,update,delete)在指定的列上发出时,oracle自动地执行触发器定义的语句序列。虽然触发器对于很多事情特别方便,避免了我们手动的调用,但是却带来了一些其他问题,例如定义一个插入数据时主键编号自动增长的触发器,当其他用户进行数据操作时并不知道定义了该触发器,插入数据时会将主键编号也插入,就会出现操作错误。所以,虽然触发器有一定的优点,但是还是要少用。
一.分类
1.语句级触发器
在指定的操作语句操作之前或之后执行一次,不管这条语句影响了多少行。
2.行级触发器(for each row)
触发语句作用的每一条记录都被触发。只有在行级触发器中才能使用old和new伪记录变量,识别值得状态。
二.语法
create [or replace] trigger 触发器名
{before|after}
{delete|insert|update[of 列名]}
on 表名
[for each row[when(条件)]]
PL/SQL块
触发语句 | :old | :new |
insert | 将要插入的数据 | |
update | 将要更改的数据 | 更改后的数据 |
delete | 将要删除的数据 |
示例一:插入数据时id自动增长
--创建表 create table ttemp2 (id number(10) primary key, name varchar2(29) not null ); --创建序列 create sequence myid; --创建触发器 create or replace trigger tri_id before insert on ttemp2 for each row declare mid number; begin select myid.nextval into mid from dual; :new.id := mid; end; --插入数据时id自动增长 insert into ttemp2(name) values('gyx');
示例二:插入数据时姓名不能以J开头
--定义触发器 create or replace trigger tri_t1 before insert on ttemp2 for each row declare begin dbms_output.put_line(:new.id||' '||:new.name); if :new.name like 'j%' then RAISE_APPLICATION_ERROR(-20000,'限制写入以J开始的串'); end if; end; --插入数据 set serveroutput on;--打开控制台输出 insert into ttemp2(name) values('jxws');
示例三:在触发器内部判断是哪种操作
create or replace trigger tri_t2 before insert or update of name or delete on ttemp2 declare begin if inserting then dbms_output.put_line('这是插入数据'); elsif deleting then dbms_output.put_line('这是删除数据'); else dbms_output.put_line('这是更新数据'); end if; end; rollback; select * from ttemp2; set serveroutput on; --测试插入语句 insert into ttemp2(name) values('gyxx'); --测试更新语句 update ttemp2 set name = 'xws' where name = 'gyx'; --该语句触发触发器 update ttemp2 set id = 200 where id = 1; --该更新语句不能触发触发器,只有对name列的更新才能触发
三.查看触发器,存储过程,函数
1.查看触发器
select * from SYS.user_triggers;
2.查看存储过程
select * from user_procedures;
3.查看函数
select * from user_source where type='FUNCTION';
4.查看触发器、存储过程、函数
select * from user_source;