触发器-3

原创 2012年03月22日 10:21:07

------------------------------------------------------
第二部分:after触发器
------------------------------------------------------

 


--案例01:新建一个测试的行后触发器:行级触发器

/*行级触发器即每操作一行都会触发一次触发器*/
create or replace trigger tr02
after update on student
for each row  /* each row说明是个行级别触发器*/
begin
  dbms_output.put_line('这个是行级update触发器!');
/*操作一条语句就触发一次这个触发器!*/
end;

 


--案例02:新建一个after触发器

--下面是库存表
create table goodstore
(
goodsno int primary key, --库存商品编号
goodscount int  --库存商品数量
);

--下面是商品出库表
create table goodstoreout
(
goodsno int,
goodcount int,
goodoutdate date default sysdate
);

insert into goodstore values (1001, 100);
insert into goodstore values (1005, 200);
insert into goodstore values (1002, 300);
insert into goodstore values (1003, 500);
insert into goodstore values (1004, 600);

--编号为1001的商品出库20件
insert into goodstoreout values (1001, 20, default);

--查询出库表
select * from goodstoreout;

--查询库存表
select * from goodstore;  --发现1001数据量有减少

--定义触发器
create or replace trigger tr04
after insert on goodstoreout
for each row
begin
  update goodstore set goodscount=goodscount-:new.goodcount
  where goodsno=:new.goodsno;
  dbms_output.put_line('本次出库的商品编号:' ||:new.goodsno || '   ' || '出库的数量为:'   ||to_char(:new.goodcount));
end;

 


--案例03:审计工资变化
1.需要的环境表
create table emp_sal
(
eid int,
name varchar2(10),
sal number(6,2)
);

insert into emp_sal values (1001, 'wind', 1800);
insert into emp_sal values (1002, 'snow', 2800);
insert into emp_sal values (1003, 'mary', 1500);

2.记录工资变化的审计表
create table audit_emp_sal_change
(
name  varchar2(10),
oldsal number(6,2),
newsal number(6,2),
time date
);


3.新建用于审计的触发器

create or replace  trigger tr_audit_emp_sal_change
after update of sal on emp_sal
for each row
declare
cnt int;
begin
select count(*) into cnt from audit_emp_sal_change where name=:old.name;
if cnt=0 then
 insert into audit_emp_sal_change values (:old.name,:old.sal,:new.sal,sysdate);
else
 update audit_emp_sal_change set oldsal=:old.sal, newsal=:new.sal, time=sysdate where name=:old.name;
end if;
end;


--案例04:DML触发器使用注意事项
1.新建触发器

create or replace  trigger tr_audit_emp_sal_change
after update of sal on emp_sal
for each row
declare
maxsal number(6,2);
begin
select max(sal) into maxsal from emp_sal;
if :new.sal >maxsal then
raise_application_error(-20011,'超出工资上限!');
end if;
end;


2.错误信息

SQL> select * from emp_sal;

       EID NAME              SAL
---------- ---------- ----------
      1001 wind             2600
      1002 snow             2800
      1003 mary             1500
      1004 kil              2500

SQL> update emp_sal set sal=6000 where eid=1004;
update emp_sal set sal=6000 where eid=1004
       *
ERROR 位于第 1 行:
ORA-04091: 表 SCOTT.EMP_SAL 发生了变化,触发器/函数不能读
ORA-06512: 在"SCOTT.TR_AUDIT_EMP_SAL_CHANGE", line 4
ORA-04088: 触发器 'SCOTT.TR_AUDIT_EMP_SAL_CHANGE' 执行过程中出错


 

版权声明:日常札记,乐于分享

魔兽争霸3的触发器编辑很有意思

 由于最近经常打魔兽3C,又对魔兽争霸3的编辑器发生了兴趣!发现其中的“触发器编辑”很有意思。给地图编辑上各种触发器就可以实现很多功能,想必魔兽中的RPG等等很多东西都是的用这东西做的。现在我开始考虑...
  • yanonsoftware
  • yanonsoftware
  • 2007年04月22日 18:14
  • 10334

利用触发器生成三分频

记得面菊厂的逻辑部时让我用触发器搭一个三分频电路,当时没打上来。 上网查了一下主要有两种方式。 1、JK触发器方式 在Pspice中绘制如下: 仿真结果如下 在设置脉冲源的时候要尽量缩小上...
  • longrejoy
  • longrejoy
  • 2016年12月18日 06:26
  • 3232

1, insert触发器; 2, update触发器; 3, delete触发器;

DML触发器有三类:1, insert触发器; 2, update触发器; 3, delete触发器; 触发器的组成部分: 触发器的声明,指定触发器定时,事件,表名以类型 触发器的执行,PL/SQL块...
  • zhrtzc
  • zhrtzc
  • 2010年01月08日 10:51
  • 2473

魔兽争霸触发器Trigger解析

第一章 ★ Trigger事件   Trigger是由事件、条件、动作组成。事件是Trigger的开端,所有事件都是并行的,也就是说,在多个事件的情况下,只要触发一个事件就会执行触发器。...
  • henren555
  • henren555
  • 2013年04月15日 11:30
  • 2541

sql——触发器——存储过程&触发器(3/3)

1、what?         什么是触发器?         生活中,我们想要                (巨人的肩膀) 2、why?         为什么要用触...
  • shamingai
  • shamingai
  • 2015年08月30日 22:41
  • 388

触发器3

在触发器中,如何得到客户端的用户名及ip地址 在oracle中,利用函数SYS_CONTEXT可以得到点燃触发器客户端信息,这些信息包含客户端的数据库用户名及主机名等 create or repl...
  • manshiai
  • manshiai
  • 2017年05月03日 13:18
  • 99

触发器、存储过程和函数三者 区别

 前今天面试,碰到数据库方面的问题,没答上来,原因是用了Hibernate以后,很少亲自写存储过程和函数了,已至于这么简单的问题都没答对,汗~~~~ 查了一下资料,现总结如下:    存储过程和函数的...
  • menban
  • menban
  • 2007年11月01日 10:50
  • 6205

存储过程、函数、触发器

存储过程函数触发器的区别 存储过程 特点 缺点 基本语法 调用语法 函数 特点 基本语法 调用语法 触发器 存储过程、函数、触发器的区别 存储过程 函数 是否有返回值 可以有,也可以没有...
  • kingzone_2008
  • kingzone_2008
  • 2015年03月22日 02:06
  • 4870

oracle 触发器的种类和触发事件,DML触发器,DDL事件触发器,替代触发器,查看触发器,

触发器的种类和触发事件 触发器必须由事件才能触发。触发器的触发事件分可为3类,分别是DML事件、DDL事件和数据库事件。 每类事件包含若干个事件,如下所示。数据库的事件是具体的,在创建触发器时要指...
  • it_taojingzhan
  • it_taojingzhan
  • 2016年04月18日 16:55
  • 941

MySQL——触发器的创建和使用总结

什么是触发器 触发器(TRIGGER)是MySQL的数据库对象之一,从5.0.2版本开始支持。该对象与编程语言中的函数非常类似,都需要声明、执行等。但是触发器的执行不是由程序调用,也不是由手工启动,...
  • Goskalrie
  • Goskalrie
  • 2016年11月03日 13:34
  • 23769
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:触发器-3
举报原因:
原因补充:

(最多只允许输入30个字)