Oracle系列:(30)触发器

什么是触发器【Trigger】?

不同的DML(select/update/delete/insert)操作,触发器能够进行一定的拦截,符合条件的操作方可操作基表;反之,不可操作基表。类似于JavaWeb中的Filter、Struts2中的Iterceptor。

为什么要用触发器?

如果没有触发器,那么DML所有操作,均可无限制地操作基表,这样一来,不符合业务需求。

创建语句级触发器insertEmpTrigger,当对表【emp】进行增加【insert】操作前【before】,显示"hello world"

create or replace trigger insertEmpTrigger
before
insert
on emp
begin
   dbms_output.put_line(‘hello world‘); 
end;
/

删除触发器insertEmpTrigger,语法:drop trigger 触发器名

drop trigger insertEmpTrigger;

使用insert语句插入一条记录,引起insertEmpTrigger触发器工作

insert into emp(empno,ename) values(1234,‘小明‘);

使用insert语句插入N条记录,引起insertEmpTrigger触发器工作

insert into emp 
select * from xxx_emp;

创建语句级触发器deleteEmpTrigger,当对表【emp】进行删除【delete】操作后【after】,显示"world hello"

create or replace trigger deleteEmpTrigger
before
delete
on emp
begin
   dbms_output.put_line(‘删除数据‘); 
end;
/

使用delete语句删除一条记录,引起deleteEmpTrigger触发器工作

delete from emp where empno=7369;

使用delete语句删除N条记录,引起deleteEmpTrigger触发器工作

delete from emp where 1=1;

星期一到星期五,且9-20点能向数据库emp表插入数据,否则使用函数抛出异常,

语法:raise_application_error(‘-20000‘,‘例外原因‘)

create or replace trigger securityTrigger
before
insert
on emp
declare
   pday varchar2(20);
   phour number(2);
begin
  select to_char(sysdate,‘day‘) into pday from dual;
  select to_char(sysdate,‘hh24‘) into phour from dual;
  if pday in (‘星期六‘,‘星期日‘) or phour not between 7 and 22 then
    raise_application_error(‘-20000‘,‘非工作时间,不能向emp表添加数据‘);
  end if;
end;
/

创建行级触发器checkSalaryTrigger,涨后工资这一列,确保大于涨前工资,语法:for each row/:new.sal/:old.sal

create or replace trigger checkSalaryTrigger
after
update of sal
on emp
for each row
begin
   if :new.sal <= :old.sal then
     raise_application_error(‘-20200‘,‘工资不能越长越低‘);
   end if;
end;
/

其中,需要注意的地方

(1)update of sal是对列的更新进行触发

(2)for each row

(3):new和:old代表一行记录

(4)raise_application_error中-20000和-20200之间允许开发者自定义错误

删除触发器,表还在吗?

基表还在;触发器不会进回收站,直接彻底删除

将表丢到回收站,触发器还在吗?

触发器还在

当闪回表后,触发器会在吗?

彻底删除表,触发器会在吗?

原来的触发器也被删除了

新的同样的名字的表,是不是继承原来的触发器的

时间: 09-11

Oracle系列:(30)触发器的相关文章

oracle 存储过程 ,触发器练习

/*以下代码是对emp表进行显示宽度设置 */col empno for 9999;col ename for a10;col job for a10;col mgr for 9999;col hiredate for a12;col sal for 9999;col comm for 9999;col deptno for 99;col tname for a12;set pagesize 50; //----------------------------------------------

Oracle中的触发器

Oracle中的触发器,布布扣,bubuko.com

足球与oracle系列(5):fifa14游戏缺失的directX库类比于oracle的rpm包

***********************************************声明**********************************************  原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任. 表述有错误之处,请您留言或邮件([email protected])指明,不胜感激. 本文转载必须保留此处:http://blog.csdn.net/huangyanlong/article/det

足球和oracle系列(3):oracle过程排名,世界杯第二回合战罢到来!

足球与oracle系列(3):oracle进程排名.世界杯次回合即将战罢! 声明:        这不是技术文档,既然学来几招oracle简单招式.就忍不了在人前卖弄几下.纯为茶余饭后与数朋库友的插科打诨.仅仅为轻松中带有一丝的诙谐,IT技术也能用来调侃一番,还蛮耐人寻味.        同一时候近来数月oracle知识点忘记了不少,为了把知识点重现.点滴间偶出灵感乍现.以一种自由的形式将其公布.因为本人学艺不精.文中列举的样例或故事.当中必定会有与技术联系牵强之处,望大家海涵. 仅仅当是一部小

oracle 如何用触发器实现更新刚插入的数据集合

oracle 如何用触发器实现更新刚插入的数据集合 1.建立测试表 create table TEST_TB ( ID   NUMBER, WLID NUMBER, PM   VARCHAR2(100), DJZT VARCHAR2(10), SL   NUMBER, PH   VARCHAR2(100) ); 2.建立带ref cursor定义的包和包体及函数: CREATE OR REPLACE package pkg_test as /* 定义ref cursor类型 不加return类型

[Oracle系列整理04] oracle pl/sql 基础

PL/SQL块中只能直接嵌入SELECT,DML(INSERT,UPDATE,DELETE)以及事务控制语句 (COMMIT,ROLLBACK,SAVEPOINT),而不能直接嵌入DDL语句(CREATE,ALTER,DROP)和DCL语句 (GRANT,REVOKE) 1.检索单行数据    1.1使用标量变量接受数据  v_ename emp.ename%type;  v_sal   emp.sal%type;  select ename,sal into v_ename,v_sal fro

Oracle系列:(13)多表查询

多表查询,包括等值连接.非等值连接.外连接.自连接. 内连接,包括等值连接 和 非等值连接. 员工表emp和部门表dept的笛卡尔集(笛卡尔集表=列数之和,行数之积,笛卡尔集表内中有些数据是不符合要求的) select emp.ename,dept.dname from emp,dept; 使用等值连接/内连接(只能使用=号),显示员工的编号,姓名,部门名,使用表别名简化 select emp.empno,emp.ename,dept.dname,dept.deptno from emp,dep

Oracle系列:(14)子查询

子查询的作用:查询条件未知的事物 查询条件已知的问题:例如:查询工资为800的员工信息 查询条件未知的问题:例如:查询工资为20号部门平均工资的员工信息 一个条件未知的问题,可以分解为多个条件已知的问题 查询工资比WARD高的员工信息 第一:查询WARD的工资?       select sal from emp where ename = 'WARD'; 第二:查询工资比1250高的员工信息?       select * from emp where sal > 1250; 子查询: sel

《Entity Framework 6 Recipes》中文翻译系列 (30) ------ 第六章 继承与建模高级应用之多对多关联

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第六章  继承与建模高级应用 现在,你应该对实体框架中基本的建模有了一定的了解,本章将帮助你解决许多常见的.复杂的建模问题,并解决你可能在现实中遇到的建模问题. 本章以多对多关系开始,这个类型的关系,无论是在现存系统还是新项目的建模中都非常普遍.接下来,我们会了解自引用关系,并探索获取嵌套对象图的各种策略.最后,本章以继承的高级建模和实体条件结束. 6-1  获取多对多关联中的链接表 问题