触发器简介
触发器的本质是一个存储过程,顾名思义发生特定事件时Oracle会执行触发器中的代码。
细分它的组成可以分为3个部分:
第一部分在什么条件下触发器会执行,即触发器被触发的事件。
第二部分在什么时间点执行触发器即触发器的发生事件例如before,after。
第三部分触发器自身所要做的事情,就是触发器被触发以后具体想表达的事件,在begin和end之间的sql。
补充
1.在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块。
2.区别是触发器是由事件驱动执行的,而存储过程和函数都是被调用是执行
3.触发器不接受任何参数
触发器的分类
1.ddl 触发器:即执行ddl操作后所触发的事件。
常用的ddl操作有:grant(授权),revoke(撤销授权),create(创建),drop(删除),alter(修改),
comment(注释),audit(审核),rename(重命名)
2、dml触发器:基于dml操作的触发器,细分又可以分为行触发器和语句触发器。
A、语句触发器:dml操作可能会影响很多行,主要用于对数据的安全保护。
B、行级触发器:针对需要操作的那一行,有关键词:for each row,用来
在进行具体实例以前先来讲解另一个概念:oracle中的user和schema:
触发器语法
create [or replace] tigger 触发器名 触发时间 触发事件
on 表名
[for each row]
begin
pl/sql语句
end
- 解释
触发器名:触发器对象的名称。由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。
触发时间:指明触发器何时执行,该值可取:
before:表示在数据库动作之前触发器执行;
after:表示在数据库动作之后触发器执行。
触发事件:指明哪些数据库动作会触发此触发器:
insert:数据库插入会触发此触发器;
update:数据库修改会触发此触发器;
delete:数据库删除会触发此触发器。
表 名:数据库触发器所在的表。
for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。
触发器能实现如下功能:
1、 允许/限制对表的修改
2、 自动生成派生列,比如自增字段
3、 强制数据一致性
4、 提供审计和日志记录
5、 防止无效的事务处理
6、 启用复杂的业务逻辑
小例子
创建触发器例子:
CREATE OR REPLACE TRIGGER TEST_TRIGGER
AFTER DELETE OR INSERT OR UPDATE ON TEST
DECLARE
V_TYPE TEST_LOG.L_TYPE%TYPE;
BEGIN
IF INSERTING THEN
--INSERT触发
V_TYPE := 'INSERT';
DBMS_OUTPUT.PUT_LINE('记录已经成功插入,并已记录到日志');
ELSIF UPDATING THEN
--UPDATE触发
V_TYPE := 'UPDATE';
DBMS_OUTPUT.PUT_LINE('记录已经成功更新,并已记录到日志');
ELSIF DELETING THEN
--DELETE触发
V_TYPE := 'DELETE';
DBMS_OUTPUT.PUT_LINE('记录已经成功删除,并已记录到日志');
END IF;
INSERT INTO TEST_LOG
VALUES
(USER, V_TYPE, TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mi:ss')); --USER表示当前用户名
END;