触发器
触发器是一组PL/SQL语句,编译后存储在数据库中。
触发器类似于存储过程和存储函数,都是包括声明、执行和异常处理过程的PL/SQL有名块。
当触发事件发生时,由系统自动地隐式调用并执行触发器,而不能由应用程序显式地调用执行。
触发器不接受任何参数。
作用
可以触发事件insert、delete、update操作,或对视图进行的类似操作。
维护那些通过创建表时的声明约束不可能实现的复杂的完整性约束以及对数据库中特定事件进行监控和响应。
利用触发器记录所进行的修改以及谁做了修改等信息对表进行审计。
当表被修改的时候,触动触发器自动给需要执行操作的程序发信号。
类型
- DML触发器(语句级&行级)
- 替代触发器
- 系统事件触发器
- 用户事件触发器
DML触发器
- 语句级前触发
- 语句级后触发
- 行级前触发
- 行级后触发
语句级触发
语法
create [or replace] trigger tri_name
after | before -- 段后|段前
update | insert | delete -- 表示触发对象上执行的DML语句,触发触发器的事件
on table_name -- 在那张表上
declare
begin
end;
代码示例-detete
目前要对一个表中的员工信息数据进行删除,要求执行delete语句操作之后,输出提示信息‘您已完成信息删除’
create or replace trigger tri_delete
after
delete
on test_emp
declare
begin
dbms_output.put_line('您已经完成信息删除');
end tri_delete;
end;
输出结果:
代码示例-DML
创建一个 BEFORE型语句级触发器,禁止周六、周日对员工表进行DML操作,如果在周六、周日对选课表进行了任何操作,则中断操作,并提示用户不允许在此时间对选课表进行操作。
当删除学生表中学生的选课记录时,触发器就会被自动地调用并执行相应的语句。
create or replace trigger tri_dml -- 创建触发器
before -- 触发器相应时间为事件发生后
delete or insert or update
on test_emp -- 在test_emp表中
declare
day number(3);
begin
select to_char(sysdate,'D') into day from dual;
if day in (6, 7) then
raise_application_error(-20200, '不能在周末对员工表做DML操作!');
end if;
end;
/
输出结果:
行级触发
通过 CREATE TRIGGER语句中指定FOR EACH ROW子句创建一个行级触发器,一个DML操作涉及多少行记录,触发器就被执行多少次。
- 所以说相较于语句级触发,行级触发可以产生多次
语法
create [or replace] trigger tri_name
after | before -- 段后|段前
trigger_name -- 触发事件
on table_name -- 在那张表上
FOR EACH ROW
declare
begin
end;
标识符
- 更新后的值new
- 更新前的值old
触发事件 | :old.列名 | :new.列名 |
---|---|---|
INSERT | 所有字段都是NULL | 当该语句完成时将要插入的数值 |
UPDATE | 在更新之前该列的原始值 | 当该语句完成时将要更新的新值 |
DELETE | 在删除行之前该列的原始值 | 所有字段都是NULL |
- 这些标识符只能在行级触发器中使用
- 在触发器体的SQL语句或PL/SQL语句中使用这些标识符时,前面要加“:”
- 在行级触发器的WHEN限制条件中使用这些标识符时,前面不要加“:”
创建一个行级触发器,当更新学生表student中学生信息后,输出提示信息“您执行了更新操作…”。
create or replace trigger tri_up
after
update
on test_emp
for each row
declare
begin
dbms_output.put_line('您执行了更新操作...');
end;
操作结果