触发器

本文介绍了Oracle数据库中的触发器概念,包括DML、DDL及系统触发器的创建与使用方法。通过实例展示了不同类型的触发器如何应用于数据操作、系统事件响应及数据定义语言变更。

mei触发器可以简单的分为:

dml 触发器:主要是针对于对表中记录的update,insert , delete 操作

·表级触发器

    ·行级触发器:对于每一条记录都器作用

 

系统触发器:主要是真的oracle系统作用,如用户登录,注销的操作等

 

ddl 触发器:主要是真的在create table , drop table , create sequence , create procedure,,drop               procedure ...数据定义语言的操作

 

 

对于触发器,和储存过程很像,但是触发器不能有传入,传出参数 ,不交给用户调用,而是由oracle本身来执行

 

dml 触发器

 

1, 建立dml 触发器

 

create  or replace  trigger  tri_name

{before |after

{insert | delete| update [of  column1,column2...]}on {[schema.]tablename}

[ for eachrow]

begin

... 执行代码;

end;

 

 

? 先新建一张测试表 my_emp, 如果my_emp里面新增一条记录叫打印出一条‘添加成功’

 

create or replace trigger myTri1

 afterinsert on  hwt.my_emp

begin

   dbms_output.put_line('添加成功');

end;

 

当像my_emp中添加一条数据的时候,就会打印出一条信息‘添加成功’,但是如果我一次像表中添加四条数据的话,还是只打印出一条信息,因为这是表级的触发器

create or replace trigger myTri2

after updateon hwt.my_emp

for each row --行级触发器,对于每一行都要进行触发操作

begin

    dbms_output.put_line('添加了一条记录');

end;

这样的话,一次性插入4条记录就会提示4条信息

 

? 在休息日(星期六,星期日)不能操作my_emp

create or replace trigger myTri3

before deleteon hwt.my_emp

begin

     if(to_char(sysdate,'dy')in ('星期六','星期天')) then

     raise_application_error(-20112,'休息日不能修改员工');--抛出一个错误,使得在这里终止,raise_application_error(错误的号,错误信息);错误的号是-20000~ -20999

     end if;

end;

 

2, 谓词 update -> updating , delete -> deleting ,insert -> inserting

可以通过谓词来对操作的类型进行使用

如:

create or replace trigger myTri4

before updateor insert on hwt.my_emp

begin

    case

    when updating then --如果是更新操作

    dbms_output.put_line('更新数据');

    when  insertingthen -- 如果是增加操作

    dbms_output.put_line('添加数据');

    end case;

end;

 

3,:new 和 :old 来取出新数据和旧数据

值得注意的是 :new:old 的数据必须要在foreach row 中才能使用

 

? 更新my_emp表中的员工的工资时候,工资不能比以前的工资低,但是也不能超过原来工资的20%,在插入新数据的时候,员工的工资不能低于1000

create or replace trigger myTri5
before insert or update on hwt.my_emp
for each row --值得注意的是,:new :old 必须要在行级触发器中使用
begin
     case
          when
updating then
               if
(:new.sal < :old.sal or :new.sal > :old.sal*1.2) then
                 raise_application_error(-20001,'更新的工资不能比原来的工资低或者超过20%');
               else
                  dbms_output.put_line('更新成功');
               end if;
          when inserting then
               if
:new.sal < 1000 then
                 raise_application_error(-20002,'工资不能低于1000');
               else
                   dbms_output.put_line('添加成功');
               end if;
     endcase;
end;

 

?当对my_emp进行删除操作的时候,自动备份到另一张表中(my_emp_bak

create or replace trigger myTri6
before delete on my_emp
for each row -- 只要使用了:old 或者 :new 就要是行级触发器
begin
     insertinto
my_emp_bak
     values(:old.ename,:old.sal);
end;

 

 

系统触发器

系统触发器主要是针对数据的logon/ logoff 或者 startup /shutdown 等操作,要注意的是对于系统触发器,一般是有sys用户来建立的,常用的系统属性有:

ora_login_user      返回登陆名

ora_client_ip_address         返回客户端的IP

ora_sysevent             返回触发器触发的系统事件

ora_database_name             返回数据的名字

ora_des_encrypeted_password     返回加密的密码

 

语法如下:

create [or replace] trigger trigger_name

{ before/ after}{logon/logoff/startup/shutdown}  on database

begin

执行代码;

end;

 

?在用户登陆或者在用户注销的时候加入到login_info

--先建立login_info表(username,login_time, logoff_time, address)

create or replacetrigger login_tri
after logon on database
begin
   insertinto
login_info(username,login_time,address)
    values(ora_login_user,sysdate,ora_client_ip_address);
end;

 

 

ddl 触发器

 

ddl 是数据定义语言的触发器,主要是针对于create ... drop ... 等等操作,对于ddl触发器也一般是由sys用户创建的

 

基本语法:

create [or  replace]  trigger  mytri_name

after ddl on  [方案名].schema

begin

... 操作代码;

end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值