触发器
触发器是当特定事件出现时自动执行的存储过程
特定事件可以是执行更新的DML语句和DDL语句
触发器不能被显式调用
触发器的功能:
- 自动生成数据
- 自定义复杂的安全权限
- 提供审计和日志记录
- 启用复杂的业务逻辑
创建触发器的语法
CREATE [OR REPLACE] TRIGGER trigger_name
AFTER | BEFORE | INSTEAD OF
[INSERT] [[OR] UPDATE [OF column_list]]
[[OR] DELETE]
ON table_or_view_name
[REFERENCING {OLD [AS] old / NEW [AS] new}]
[FOR EACH ROW]
[WHEN (condition)]
pl/sql_block;
触发器的组成部分
触发器由三部分组成:
触发器语句(事件)
- 定义激活触发器的 DML 事件和 DDL 事件
触发器限制
2. 执行触发器的条件,该条件必须为真才能激活触发器
触发器操作(主体)
3. 包含一些 SQL 语句和代码,它们在发出了触发器语句且触发限制的值为真时运行
触发器类型
行级触发器(dml)
常用:new和:old来读取数据。插入常用:new.字段 来获取插入的字段
删除常用:old.字段 来获取删除的字段的字段
更新常用:old.字段 和:new.字段 来获更改前的字段和更改后的字段,若是字段没有更改则 :new.字段 为原来的字段
关键字 for each row
每执行一次行操作则进行相应的处理
--后置触发器(一般写日志)
--创建触发器 ,删除学生表,没删除一条记录触发一次,并且提示删除的记录编号并且输出(默认执行,右键disable关闭)
create or replace trigger studnet_trigger
after delete --后置触发器,在执行删除操作之后触发(befor前置触发器,instead of顶替触发器)
on student --作用在那student表上(作用在表或者视图上)
for each row --每一行被删除都会触发,也可以语句级(语句级则不写及可)
declare
begin
--:old 指删除的记录行对象,:new 指新增的行对象 只能用在行级触发器不能用在语句级
dbms_output.put_line('删除的编号:'||:old.id);
end;
语句级触发器(dml)
每执行完所有的操作(增或删或改)则进行相应的操作
--创建触发器,分别在新增修改删除student表数据触发一次
create or replace trigger student_trigger_UDG
after insert or delete or update
on student
declare
begin
if inserting then
dbms_output.put_line('新增操做');
elsif updating then
dbms_output.put_line('更新操做');
elsif deleting then
dbms_output.put_line('删除操做');
else
dbms_output.put_line('其他操作');
end if;
end;
INSTEAD OF 触发器(dml)
我门不能直接使用视图进行修改删除和插入操作,但是可以通过触发器进行对基表的操作
--创建触发其对视图进行增删改
create or replace trigger view_trigger
instead of --只能作用在视图上
insert or update or delete or insert
on v_emp_dep --视图名称
for each row
begin
if inserting then
insert into emp(employee_id,first_name,salary,department_id)
values(:new.employee_id,:new.name,:new.salary,:new.department_id);
insert into dep(department_id,department_name)
values(:new.department_id,:new.department_name);
elsif updating then
update emp e
set e.salary = :new.salary,
e.first_name = :new.name,
e.department_id = :new.department_id
where e.employee_id = :old.employee_id;
update dep d
set d.department_name = :new.department_name
where d.department_id = :new.department_id;
elsif deleting then
delete emp e where e.employee_id = :old.employee_id;
delete dep d where d.department_id = :old.department_id;
end if;
end;
用户模式级触发器(ddl)
当对各个对象进行操作时会触发行级操作
--创建用户模式级触发器
create or replace trigger sch_tri
after drop or create or alter
on schema --用户模式级别
begin
dbms_output.put_line('对象拥有者:'||ora_dict_obj_owner);
dbms_output.put_line('当前登录用户:'||ora_login_user);
dbms_output.put_line('对象名称:'||ora_dict_obj_name);
dbms_output.put_line('对象类型:'||ora_dict_obj_type);
dbms_output.put_line('数据库实例名称:'||ora_database_name);
dbms_output.put_line('客户端ip地址:'||ora_client_ip_address);
end;
--对象拥有者 删了那个用户的表就是那个用户(可以从当前用户删除别的用户的表,则当前拥有者是别的用户)
--当前用户 当前登录的用户
触发
create sequence studnet_0303;
结果
对象拥有者:JSD2101
当前登录用户:JSD2101
对象名称:STUDNET_0308
对象类型:SEQUENCE
数据库实例名称:XE
客户端ip地址:
启用、禁用和删除触发器
启用和禁用触发器
SQL> ALTER TRIGGER aiu_itemfile DISABLE; --禁用触发器
SQL> ALTER TRIGGER aiu_itemfile ENABLE; – 启用触发器
SQL> DROP TRIGGER aiu_itemfile; – 删除触发器
总结
触发器是当特定事件出现时自动执行的存储过程
触发器分为 DML 触发器、DDL 触发器和数据库级触发器三种类型
DML 触发器的三种类型包括行级触发器、语句级触发器和 INSTEAD OF 触发器