您的位置:首页 > 数据库 > Oracle

oracle触发器

2016-07-03 17:40 363 查看
定义:

如何实现跟踪并记录所有对教师表的表结构进行改变的操作

只要一变动表结构就要记录所有操作到一个日志表中

不需要显式调用来执行,而是修改表结构的操作来启动运行



​示例语法:

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:

create or replace trigger tri_insert_teacher

  after insert on teacher  

  for each row

declare

  begin

  dbms_output.put_line(:old.sal||'-'||:new.sal);

end tri_insert_teacher;

insert into teacher values('22', '孙悟空', 10000, '1', '1');

create or replace trigger tri_update_teacher

  after update on teacher  

  for each row

declare

  begin

  dbms_output.put_line(:old.sal||'-'||:new.sal);

end tri_update_teacher;

update teacher set sal = 20000 where tno = '22';

​create or replace trigger tri_delete_teacher

  after delete on teacher  

  for each row

declare

  begin

  dbms_output.put_line(:old.sal||'-'||:new.sal);

  if :old.sal = :new.sal and :new.sal > 1600 then

    RAISE_APPLICATION_ERROR(-20001, 'wakaka', false);

  end if;

end tri_update_teacher;

delete from teacher where tno = '1';

select * from teacher where tno = '1';

示例2:

​--梦想基金

create table tb_money

(

 salary number

);

insert into tb_money values(100000000);

select * from tb_money;

--梦想

create table tb_dream

(

 dream nvarchar2(100),

 money number

);

create or replace trigger tri_delete_teacher

  after delete on teacher  

  for each row

declare

  

begin

end tri_delete_teacher;

create or replace trigger tri_dreaming

  before insert on tb_dream

  for each row

  declare

    v_money number;

  begin

    --获取梦想基金剩余金额

    select nvl(sum(salary), 0) into v_money from tb_money;

    

    if v_money <= 0 then

      dbms_output.put_line('没有资金了,正在联系赞助...');

    elsif v_money < :new.money then

      dbms_output.put_line('资金不足,分步走...');

    else

      dbms_output.put_line('去实现你的梦想吧...');

      update tb_money set salary = salary - :new.money;

    end if;    

end tri_dreaming;

insert into tb_dream values('环游世界,飞跃地球', 600);

insert into tb_dream values('收购公司', 600);

insert into tb_dream values('帮大家实现梦想', -2000000);

insert into tb_dream values('开发时光机,回到过去,研究项目', 60000);

insert into tb_dream values('买架私人飞机', 20000);

select * from tb_dream;

select * from tb_money;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle 数据库 触发器