触发器(trigger)是oracle中功能强大的代码执行单元,定义个数类似函数和存储过程;触发器不允许用户显示调用也不带有返回值,它是在满足特定条件时自动触发执行的。触发器通常由专门数据库开发人员或者dba开发制定。
触发器的分类:1、DML(数据操纵语言)触发器,是最常用的触发器,通常在执行insert、update、delete时触发;
2、Instead of 触发器,建立在视图上的触发器,通常不提倡使用;
3、DDL(数据定义语言)触发器,当发生create、alter、drop、truncate时使用;
4、DB触发器,当数据库系统发生startup、shutdown、logon、logoff 时触发DB触发器。
一、语句级触发器
CREATE OR REPLACE TRIGGER tri_update_sales --该触发器默认为语句级,即不管更新多少条记录只触发一次
BEFORE UPDATE--在此动作之前(也可以使用after)
ON sales--在该表上
REFERENCING OLD AS O NEW AS N--引用对象时使用对应别名
BEGIN
dbms_output.put_line('触发器提示了。。。');
END;
UPDATE sales SET salquantity = salquantity+1;
二、行级触发器
SELECT * FROM sales
CREATE OR REPLACE TRIGGER tri_update_sales
BEFORE UPDATE
ON sales
REFERENCING OLD AS O NEW AS N
FOR EACH ROW
BEGIN
dbms_output.put_line('触发器提示了。。。');
END;
UPDATE sales SET salquantity = salquantity+1;
三、将修改的提示写进日志记录表中
CREATE OR REPLACE TRIGGER tri_insert_emp
BEFORE INSERT
ON emp
REFERENCING OLD AS O NEW AS N
BEGIN
INSERT INTO tri_emp_log VALUES(seq_trig.nextval,'insert',DEFAULT);
END;
INSERT INTO emp VALUES(134,'沉香','男',to_date('1975/4/2', 'yyyy/mm/dd'),45957657,'南京','NO002');
四、触发器的启用、禁用和删除
alter trigger tri_insert_emp enable;
alter trigger tri_insert_emp disable;
drop trigger tri_insert_emp;