一.触发器的作用

  触发器的作用类似拦截器.把一些针对数据库的DML操作(insert/update/delete/select)进行拦截,符合业务要求的进行操作,不符合要求的操作可以通过抛出异常来阻止

  说白了就是数据确认(after)与安全性检查(before),此外触发器不针对select操作

二.触发器的使用

  语法不再赘述,百度或者查阅oracle的文档都能找到

  以下的一些例子是基于scott用户下的emp表

1.创建语句级触发器insertEmpTrigger,当对表【emp】进行增加【insert】操作前【before】,显示'插入了一条数据'

注意是单引号

 --创建触发器
create or replace trigger insert_trigger
before
insert
on emp
for each row
begin
dbms_output.put_line('插入了一条数据');
end;
/

如果不加for each row即使一次插入多条数据,触发器仍然只工作一次(普通的语句触发器),for each row 使得这个触发器变成了一个行触发器

2.星期一到星期五,且9-21点能向数据库emp表插入数据,否则使用函数抛出异常,使用:raise_application_error('-20000','例外原因')

说明:raise_application_error(error_number,error_message) 用于抛出自定义的异常 error_number为-20000 到 -20999 之间,error_message表示错误的信息

注意:不能仅仅用整点来控制,必须要考虑分钟的问题

 create or replace trigger security_trigger
before
insert
on emp
for each row
declare
pday varchar2(10);
phour number(2);
begin
select to_char(sysdate,'day') into pday from dual;
select ceil(to_char(sysdate,'hh24.mi')) into phour from dual;
if pday in ('星期六','星期日') or phour not between 9 and 21 then
raise_application_error('-20000','非工作日不能插入数据');
end if;
end;
/

触发器创建之后,在周一的 21:57时已经不能插入数据

3.创建行级触发器checkSalaryTrigger,涨后工资这一列,确保大于涨前工资(10%) (:new.sal/:old.sal的使用)

:new.列名 与:old.列名 分别表示 某列的新值与旧值,而且这两个变量只有在创建触发器时加上for each row才会出现

 此外update二者皆有,insert只有:new,delete只有:old(上面已经说过,触发器不针对select操作)

 create or replace trigger checkSalary_trigger
after
update
on emp
for each row
begin
-- 伪变量:new.sal表示更新后的sal字段
-- 10% 要写成 0.1
if (:new.sal - :old.sal) < :old.sal*0.1 then
raise_application_error('-20000','工资涨幅必须大于10%');
else
dbms_output.put_line('更新成功!');
end if;
end;
/

Oracle 触发器的使用的更多相关文章

  1. 2014/11/06 Oracle触发器初步 2014-11-06 09:03 49人阅读 评论(0) 收藏

    触发器我就不多解释了,保证数据的完整性的神器,嗯..也是减少程序员工作托管给数据库操作的好帮手.就不讲一些大道理了.通俗点,我们对数据库的操作,无非就是增 删 改 查. 触发器就是在删,改,增的时候( ...

  2. oracle触发器加条件判断

    oracle触发器加条件判断,如果某个字段,isnode=0,那么不执行下面的方法,数据如下: create or replace trigger tr_basestation_insert_emp ...

  3. [转]连续创建多个Oracle触发器失败,单个创建才成功的解决方法

    连续创建多个Oracle触发器失败,单个创建才成功的解决方法   1.当我连续执行创建多个触发器时,总是报编译通过,但存在警告或错误.如下:   create or replace trigger t ...

  4. Oracle 触发器在日志管理开发中的应用

    摘要: 本文讨论了利用数据库中的触发器对日志管理进行设计与实现的方法, 是对原来在客户端软件中编写日志管理方法的一种改进, 并给出了 Oracle9i 中的实例演示.关键词: Oracle; 触发器; ...

  5. oracle触发器应用

    首先给大家推荐两篇我看后的博文,我已经内容转载过来: 1.对触发器的讲解 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建 ...

  6. Mybatis 插入操作时获取主键 (Oracle 触发器与SEQ)

    1.通过Oracle序列 -- Create sequence create sequence SEQ_DW_EWSYSTEM minvalue 1 maxvalue 9999999999999999 ...

  7. SQL server与Oracle触发器的创建与使用

    SQL Server 1创建触发器 GO BEGIN IF (object_id('WMY', 'tr') is not null) DROP trigger WMY END; GO CREATE T ...

  8. oracle触发器中增删改查本表

    oracle触发器中增删改查本表 (1)只有before insert触发器中才可以查询或更新本表 create or replace trigger tri_test_ins before inse ...

  9. Oracle触发器用法实例详解

    转自:https://www.jb51.net/article/80804.htm. 本文实例讲述了Oracle触发器用法.分享给大家供大家参考,具体如下: 一.触发器简介 触发器的定义就是说某个条件 ...

  10. Oracle 触发器(二)

    Oracle触发器详解   触发器是许多关系数据库系统都提供的一项技术.在oracle系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块. 8.1 触发器类型 触发器在数据库里 ...

随机推荐

  1. CvIntHaarClassifier

    //定义一个宏.宏里面是指针函数 #define CV_INT_HAAR_CLASSIFIER_FIELDS() \ float (*eval)( CvIntHaarClassifier*, sum_ ...

  2. 学习日记之工厂方法模式和Effective C++

    简单工厂模式VS工厂方法模式: 简单工厂模式:最大长处在于工厂类中必须包括必要的逻辑推断,依据client选择条件动态实例化相关类,对于client来说,去除了与详细产品的依赖. 工厂方法模式(Fac ...

  3. MS OFFICE WORD 绝招

    以MS OFFICE WORD 2010为例. 1.WORD 文件夹连接线(标准称呼:前导符)为什么有的稀,有的密? 答案:文件夹格式字体不同. 2.首页.文件夹页.正文有的要页眉,有的不要,首页不要 ...

  4. 十三、 Spring Boot 启动加载数据 CommandLineRunner

    实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求. 为了解决这样的问题,spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来 ...

  5. java两种动态代理方式的理解

    要理解动态代理,不妨先来看看一个静态代理的例子. 一.静态代理 以一个电商项目的例子来说明问题,比如我定义了一个订单的接口IOrder,其中有一个方法时delivery,代码如下. package c ...

  6. CentOS 7 学习(四)Git配置(一)

    CentOS 7 学习(四)Git配置(一) 1.对于版本管理系统,目前常用的是Subverion和Git,Subversion是集中式版本管理系统中最好的,所有人的代码都要提交到服务器上,如果要知道 ...

  7. Confluence 持续集成平台部署记录

    1.1 Confluence简介 Confluence是一个专业的企业知识管理与协同软件,也可以用于构建企业wiki.使用简单,但它强大的编辑和站点管理特征能够帮助团队成员之间共享信息.文档协作.集体 ...

  8. Android Studio 提示android.support.v4不存在的解决方法

    最近想学习仿QQ列表的侧滑删除功能,看完资料之后,发现有一堆错误,看了一下,说是不存在android.support.v4包不存在,浪费了一个多小时,终于是找到了解决方法,便是记录下来 打开file- ...

  9. 用于文件系统的C库函数

    9/20/2017 学<LINUX C编程实战>中 1.打开 File *fopen(const char *path , const char * mode); fopen实现打开指定的 ...

  10. linux 文件权限的基础知识

    由于自己总是记不住linux里权限的一些知识,因此简单总结如下: 查看文件权限 // 列出所有文件 ls -al // 最前面的一串10个字母的字符串 // 可能像 drwxrwxr-x // 第一位 ...