1、什么是触发器:
触发器是在对表进行插入、更新、删除操作时自动执行的存储过程,常用于强制业务规则,是一种高级约束,可以定义比用check约束更为复杂的约束,可以执行复杂的SQL语句。触发器是一种特殊的存储过程,触发器一般由事件触发并且不能接受参数,存储器由语句块去调用。
2、触发器有什么作用
(1)数据备份
当我们需要对业务主表执行数据操作时,可以用触发器对数据进行备份,保证数据的安全性
(2)确保数据一致性
当做数据操作时,可以用触发器通知或者操作相关表
3、触发器分类
(1)DML触发器:DML触发器创建在表上,由DML事件引发
(2)INSTANG OF触发器: 创建在视图上并且只能在行级上触发,用于替代insert,delete等操作(由于oracle中不能直接对有两个以上的表建立的视图进行DML操作,所以给出替代触发器,它是专门为进行视图操作的一种处理方法)
(3)DDL触发器: 触发事件时数据库对象的创建和修改
(4)数据库事件触发器:定义在数据库或者模式上,由数据库事件触发
4、语法
CREATE [OR REPLACE] TIGGER触发器名 触发时间 触发事件
ON表名/视图名
[FOR EACH ROW] //加上FOR EACH ROW 即为行级触发器,不加时为语句级触发器
BEGIN
pl/sql语句
END
CREATE OR REPLACE TRIGGER trigger_name
< before | after | instead of > < insert | update | delete> ON table_name
[FOR EACH ROW]
WHEN (condition)
DECLARE
BEGIN
END;
INSTEAD OF 触发器语句
CREATE [OR REPLACE] TRIGGER trigger_name
INSTEAD OF
{INSERT|DELETE|UPDATE [OF COLUMN…]}
[OR {INSERT| DELETE| UPDATE [OF COLUMN…]}]
ON VIEW_NAME
[REFFERENCING{OLD [AS] OLD | NEW [AS] NEW| PARENT AS PARENT}]
// 可以指定相关名称,当前的默认相关名称为OLD和NEW,应用相关名称时需要加:
[FOR EACH ROW] //instead of 触发器只能在行级上触发,因为没有必要指定
[WHEN CONDITION]
DECLARE
BEGIN
END;
DML 触发器实例(当表tab1中执行insert操作后就会执行该触发器,插入一条数据)
CREATE OR REPLACE TRIGGER TRIGGER1
AFTER INSERT ON TRIGGERTEST //插入后触发
FOR EACH ROW //行级触发器
BEGIN
INSERT INTO tab1(ID,NAME) VALUES(‘22’,‘33’);
END;
5、使用触发器时应该注意以下几点
(1) 在触发器的执行部分只能用DML语句(SELECT、INSERT、UPDATE、DELETE),不能使用DDL语句 (CREATE、ALTER、DROP)
(2)触发器中不能使用commit语句,触发器的操作与触发事件(INSERT,UPDATE,DELETE)一起进行COMMIT和ROLLBACK;
(3)一个表上的触发器越多,对于表的DML操作性能影响越大
(4) 触发器最大为32K