1.触发器概述
触发器是一种在事件发生时隐式地自动执行的PL/SQL块,不能接受参数,不能被显式调用
2.触发器类型
- DML触发器:在对表或视图执行DML语句时 执行,其中包含 语句级触发器(表级触发器),行级触发器,INSTEAD OF触发器(替换触发器)
- 模式(DDL)触发器:在模式中执行 DDL 语句时执行
- 数据库级触发器:在发生打开、关闭、登录和退出数据库等系统事件时执行
3.创建触发器的语法
语法:
create [or replace] trigger 触发器名字
before|after 触发器事件 on table_name
[for each row]--行级触发器
[when trigger_condition]
trigger_body
语法解释:
trigger_name:触发器名称
before | after | instead of : 指定触发器是在触发事件发生之前触发还暗示发生之后触发。
trigger_event:触发事件,在DML触发器中主要为insert、update
[OF column_list]、delete
table_name:表名,表示发生触发器作用的对象
for each row:指定创建的是行级触发器,若没有该子句则创建的是语句级触发器
when trigger_condition:添加的触发条件
trigger_body:触发体,是标准的PL/SQL语句块
4.表级触发器(语句级触发器)
无论受影响的行数是多少,都只执行一次
没有for each row语句,在begin代码段中不可以使用**:new和:old**。
语法:
create or replace trigger 触发器名称
before|after
update or |delete or |insert on 表名
declare
声名变量;
begin
触发器代码;
end;
before:表示在sql语句执行前,执行触发器的代码
after:表示在sql语句执行之后,执行触发器的代码
以下三个都是boolean类型的
updating:如果触发这个触发器的是一条update语句,它值就是true
deleting:如果触发它是一条delete语句,它值就是true
inserting:如果触发它是一条insert语句,它值就是true
--给dept表创建一个触发器,当dept表中的数据被修改、删除、插入时打印该操作
create trigger t1
before insert or update or delete on dept
begin
if inserting then
dbms_output.put_line('插入');
end if;
if updating then
dbms_output.put_line('修改');
end