触发器

触发器

触发器是当特定事件出现时自动执行的存储过程
特定事件可以是执行更新的DML语句和DDL语句
触发器不能被显式调用
触发器的功能:

  1. 自动生成数据
  2. 自定义复杂的安全权限
  3. 提供审计和日志记录
  4. 启用复杂的业务逻辑

创建触发器的语法

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;

触发器的组成部分

触发器由三部分组成:
触发器语句(事件)

  1. 定义激活触发器的 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 触发器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值