触发器 触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由个事件来触发,比如当对一个表进行操作(insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从DBA_TRIGGER,USER_TRIGGERS 数据字典中查到。 触发器可以查询其他表,而且可以包含复杂的 SQL 语句。它们主要用于强制服从复杂的业务规则或要求。例如,您可以根据客户当前的帐户状态,控制是否允许插入新订单。 触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。 Oracle 触发器语法: ORACLE产生数据库触发器的语法为: create [or replace] trigger 触发器名 触发时间 触发事件 on 表名 [for each row] pl/sql 语句 其中: 触发器名:触发器对象的名称。由于触发器是数据库自动执行 的,因此该名称只是一个名称,没有实质的用途。 触发时间:指明触发器何时执行,该值可取: before---表示在数据库动作之前触发器执行; after---表示在数据库动作之后出发器执行。 触发事件:指明哪些数据库动作会触发此触发器: insert:数据库插入会触发此触发器; update:数据库修改会触发此触发器; delete:数据库删除会触发此触发器。 表 名:数据库触发器所在的表。 for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。 两个经典案例: 【案例一】 题目: --触发器: --添加员工信息,流水号作为自动编号(通过序列生成), --并且判断如果工资小于0,则改为0;如果大于10000,则改为10000。 CREATE TABLE emp2( e_id NUMBER, e_no NUMBER, e_name VARCHAR2(20), e_sal NUMBER ) SELECT * FROM emp2; CREATE SEQUENCE seq_trg_id; INSERT INTO emp2(e_id,e_no,e_name,e_sal) VALUES(seq_trg_id.nextval,7788,'章子',1000000000000) INSERT INTO emp2(e_id,e_no,e_name,e_sal) VALUES(seq_trg_id.nextval,7788,'章子怡',-10) CREATE OR REPLACE TRIGGER trg_add_emp_info BEFORE INSERT ON emp2 FOR EACH ROW DECLARE -- local variables here BEGIN SELECT seq_trg_id.NEXTVAL INTO :NEW.e_id FROM dual; IF :NEW.e_sal < 0 THEN :NEW.e_sal := 0; ELSIF :NEW.e_sal > 10000 THEN :NEW.e_sal := 10000; END IF; END; 【 案例二】 题目: --扩充练习: --为emp建立触发器,将删除的记录放到emp3表中(autoid,deptno,empno,ename,del_rq-删除日期) --测试代码 CREATE TABLE emp3( autoid NUMBER PRIMARY KEY, deptno NUMBER, empno NUMBER, ename VARCHAR2(20), del_rq DATE ) CREATE SEQUENCE seq_trg_del_autoid; INSERT INTO emp(empno, ename, deptno) VALUES(114, '阿娇', 10); COMMIT; SELECT * FROM emp; DELETE emp WHERE empno = 114; SELECT * FROM emp3; 答案: CREATE OR REPLACE TRIGGER trg_del_emp_info BEFORE DELETE ON emp FOR EACH ROW DECLARE -- local variables here BEGIN INSERT INTO emp3(autoid,deptno,empno,ename,del_rq) VALUES(seq_trg_del_autoid.NEXTVAL,:OLD.deptno,:OLD.empno,:OLD.ename,sysdate); END;