类型
行级触发器:
- FOR EACH ROW
影响的每一行都会执行触发器
语句级出发器
- 默认的模式,一句话才执行一次触发器
触发器不能嵌套,不能含有事务控制语句
何时触发
- Before:条件运行前
- After:条件运行后
- Instead of:替代触发,作用在视图上
创建触发器
实例一
1.创建一个与scott下的emp表结构一样的表emp_his,并不添加数据
create table emp_his as select * from employees where 0=1;
这种构造与现存表相同结构的表,是不会将comment带过来的
2.然后在emp表中创建before delete类型的触发器,
当即将删除emp表记录时,将相应记录插入到emp_his中。
create or replace trigger hr.e_delete
before delete on employees
for each row
begin
insert into emp_his values(:old.employee_id,
:old.first_name,:old.last_name,:old.email,
:old.phone_number,:old.hire_date,:old.job_id,
:old.salary,:old.commission_pct,:old.manager_id,
:old.department_id);
end e_delete;
实例二
禁止对表emp的salary进行更改
create or replace trigger e_update
before update of salary on emp
begin
if updating then
raise_application_error(-20001,'工资不能被改动');
end if;
end;
检验
hr@ORCL> update emp
2 set salary=100
3 where employee_id<100;
update emp
*
第 1 行出现错误:
ORA-20001: 工资不能被改动
ORA-06512: 在 "HR.E_UPDATE", line 3
ORA-04088: 触发器 'HR.E_UPDATE' 执行过程中出错
hr@ORCL>
触发器管理
禁用触发器
alter trigger e_delete disable;
禁用某个表上所有的触发器
alter table emp disable all triggers;
查all_trigger表得到触发器名字
select trigger_name,trigger_type,table_owner,table_name from all_triggers;
查看触发器内容
select text from all_source where type='TRIGGER' and name='E_DELETE';
注意,平时在写sql的时候不注意大小写,但是在此处涉及到触发器名字的时候一定要大写
hr@ORCL> select text from all_source where type='TRIGGER' and name='E_DELETE';
TEXT
---------------------------------------------------------------------------------------------------------------------
trigger hr.e_delete
before delete on employees
for each row
begin
insert into emp_his values(:old.employee_id,
:old.first_name,:old.last_name,:old.email,
:old.phone_number,:old.hire_date,:old.job_id,
:old.salary,:old.commission_pct,:old.manager_id,
:old.department_id);
end e_delete;
已选择11行。
hr@ORCL>
删除触发器
drop trigger e_delete_1;