Oracle
1 触发器
1.1 语法
【语法】 CREATE [OR REPLACE] TRIGGER <触发器名> BEFORE|AFTER INSERT|DELETE|UPDATE [OF <列名>] ON <表名> [FOR EACH ROW] <pl/sql块> 【说明】 关键字"BEFORE"在操作完成前触发;"AFTER"则是在操作完成后触发; 关键字"FOR EACH ROW"指定触发器每行触发一次,若不指定则为表级触发器. 关键字"OF <列名>" 不写表示对整个表的所有列. pl/sql块中不能使用commit; 【特殊变量】 :new --为一个引用最新的行值; :old --为一个引用以前的行值; 这些变量只有在使用了关键字 "FOR EACH ROW"时才存在.且update语句两个都有,而insert只有:new ,delect 只有:old; |
1.2 行级触发器
【示例1】涨工资
/* 触发器使用:给员工涨工资(涨后工资应该大于涨前)后,在后台输出更新前和更新后的工资 */ create or replace trigger tri_emp_upd_sal after update of sal on emp for each row begin if :old.sal <:new.sal then dbms_output.put_line('更新前工资为:'||:old.sal||',更新后工资为:'||:new.sal); else raise_application_error(-20002,'工资不能越涨越低!'); end if; end; /
-- 更新工资值,并触发行级触发器 update emp set sal =8888where empno =1002; |
【示例2】触发器+序列实现主键自增长
/* 触发器使用:给emp表的empno添加触发器,在插入记录时自动填入值 */ -- 1、创建序列 create sequence seq_emp_empno;
-- 2、创建触发器 create or replace trigger tri_emp_ins_empno before insert on emp for each row begin -- 给将要插入表的记录:new 中的empno设置sequence中的值 select seq_emp_empno.nextval into:new.empno from dual; end; /
-- 新增员工数据,测试触发器+序列的组合使用 insertinto emp(ename,sal)values('itcast002',2000); commit; |
1.3 表级触发器
/* 触发器使用:删除表的同时备份表数据到另一张备份表 */ -- 1、从emp表结果中创建一张表并复制数据 create table emp2 as select * from emp;
-- 2、创建备份表emp_bak create table emp_bak as select * from emp2 where1=2;
-- 3、创建表触发器,当对表操作时触发 create or replace trigger tri_emp2_del before delete on emp2 begin -- 将emp2表中的数据备份到emp_bak insert into emp_bak select * from emp2; end; /
-- 4、测试删除emp2表的数据 delete from emp2; select * from emp2; select * from emp_bak; |
1.4 开启禁用触发器
【禁用某个触发器】 ALTER TRIGGER <触发器名> DISABLE 【示例】 alter trigger tri_emp_upd_sal disable; update emp set sal =8888 where empno =1002; 【重新启用触发器】 ALTER TRIGGER <触发器名> ENABLE 【示例】 alter trigger tri_emp_upd_sal enable; update emp set sal =8888where empno =1002; 【禁用表的所有触发器】 ALTER TABLE <表名> DISABLE ALL TRIGGERS; 【示例】 alter table emp disable all triggers; 【启用表的所有触发器】 ALTER TABLE <表名> ENABLE ALL TRIGGERS; 【示例】 alter table emp enable all triggers; 【删除触发器】 DROP TRIGGER <触发器名>; 【示例】 drop trigger tri_emp_upd_sal; |