1. 行触发器的定义

行触发器是指执行DML操作时,每作用一行就触发一次的触发器。审计数据变化时,可以使用行触发器

2. 建立行触发器的语法如下:

create or replace trigger trigger_name
timing event1 [or event2 event3]
on table_name
(referencing old as old | new as new)
for each row
(when condition)
pl/sql block; trigger_name:用于指定触发器名 timing:用于指定触发时机(before或after) event:用于指定触发事件(INSERT,UPDATE,DELETE) referencing:用于指定引用新旧数据的方式,使用old修饰符引用旧数据,使用new修饰符引用新数据 table_name:用于指定DML操作所对应的表 for each row:表示建立行触发器 when:when子句是可选的,用于指定触发条件

3. 行触发器的分类

3.1 BEFORE触发器

在开发数据库应用时,为了确保数据符合商业逻辑或企业规则,应该使用约束对输入数据加以限制但某些情况下使用约束可能无法实现复杂的商业逻辑或企业规则

此时可以考虑使用before行触发器

下面以确保雇员工资不能低于其原有工资为例,说明建立before行触发器的方法,示例如下:

create or replace trigger tr_emp_sal
before update of sal on emp
for each row
begin
if :new.sal < :old.sal then
raise_application_error(-, '工资只涨不降');
end if;
end;

执行结果:

SQL> update emp set sal= where ename='ywb';
update emp set sal= where ename='ywb'
ORA-: 工资只涨不降
ORA-: 在 "SCOTT.TR_EMP_SAL", line
ORA-: 触发器 'SCOTT.TR_EMP_SAL' 执行过程中出错

3.2 建立after行触发器

为了审计DML操作,可以使用语句触发器或oracle系统提供的审计功能,而为了审计数据变化,则应该使用after行触发器,下面以审计雇员工资变化为例,说明使用after行触发器的方法,在建立触发器之前,首先应建立存放审计数据的表audit_emp_change

create table audit_emp_change(name varchar2(),oldsal number(,),newsal number(,),time date);

为了审计所有员工的工资变化和员工工资的更新日期,必须建立after行触发器

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

执行结果:

SQL> select ename,sal from emp;
ENAME SAL
---------- ---------
ywb 800.00
SMITH 800.00
ALLEN 1600.00
WARD 1250.00
JONES 2975.00
MARTIN 1250.00
BLAKE 2850.00
CLARK 2450.00
SCOTT 1200.00
KING 5000.00
TURNER 1500.00
ADAMS 1100.00
JAMES 950.00
FORD 3000.00
MILLER 1300.00
rows selected SQL> update emp set sal=sal+ where ename='ywb';
row updated SQL> select * from audit_emp_change;
NAME OLDSAL NEWSAL TIME
---------- -------- -------- -----------
ywb 800.00 900.00 // SQL> update emp set sal=sal+ where ename='YWB';
rows updated SQL> update emp set sal=sal+ where ename='ywb';
row updated SQL> select * from audit_emp_change;
NAME OLDSAL NEWSAL TIME
---------- -------- -------- -----------
ywb 900.00 1000.00 //

ORACLE触发器概述之【行触发器】【weber出品】的更多相关文章

  1. 全世界最详细的图形化VMware中linux环境下oracle安装(一)【weber出品必属精品】

    安装流程:前期准备工作--->安装ORACLE软件--->安装升级补丁--->安装odbc创建数据库--->安装监听器--->安装EM <前期准备工作> 安装 ...

  2. 全世界最详细的图形化VMware中linux环境下oracle安装(二)【weber出品必属精品】

    <ORACLE 10.2.05版本的升级补丁安装> 首先我们解压 $ unzip p8202632_10205_LINUX.zip 解压后我们会发现多出了个文件夹,他是:Disk1,进入D ...

  3. 全世界最详细的图形化VMware中linux环境下oracle安装(三)【weber出品必属精品】

    数据库软件和数据库都建好了,基本上可以说完成90%的工作,但是美中不足的就是企业管理器还没有安装好,现在我们就开始安装企业管理器吧. 安装之前我们先将补丁给补上.补丁我们也是采用禁默安装.补丁:p83 ...

  4. ORACLE【1】:触发器详解

    转自:http://blog.csdn.net/indexman/article/details/8023740 ORACLE PL/SQL编程之八: 把触发器说透 本篇主要内容如下: 8.1 触发器 ...

  5. ORACLE PL/SQL编程之触发器

    8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创建DML触发器 8.2.3 创建替代(INS ...

  6. ORACLE触发器概述之【语句触发器】【weber出品】

    一.触发器概述 与表,视图,模式,或者数据库相关的PL/SQL过程,当触发条件被触发时,自动执行 分类: 1.语句触发器 2.行触发器 二.语句触发器 1. 什么是语句触发器 语句触发器,是指当执行D ...

  7. ORACLE触发器的管理与实际应用【weber出品】

    一.INSTEAD OF触发器 对于简单的视图可以执行INSERT,UPDATE和DELETE操作,但是对于复杂视图,不允许直接执行INSERT,UPDATE,DELETE操作,当视图出现以下任何一种 ...

  8. Oracle数据库之PL/SQL触发器

    Oracle数据库之PL/SQL触发器 1. 介绍 触发器(trigger)是数据库提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是 ...

  9. ORACLE调度之基于时间的调度(一)【weber出品】

    一.调度的概述 这里我看到一篇对调度的概述觉得描述的比我好,但仅限于概述部分,其他部分我觉得我讲的比他好,于是发生以下事情: ************************华丽的转载******** ...

随机推荐

  1. 随机获取oracle数据库中的任意一行数据(rownum)

    最近看oracle资料的时候,了解rownum的概念,以前只知道对数据库表进行简单的增删改查: 看到了rownum的概念后,突然想到了好多业务场景应该都可以适用的,比如在进行随机发奖的时候, 我们就可 ...

  2. [Leetcode][020] Valid Parentheses (Java)

    题目在这里: https://leetcode.com/problems/valid-parentheses/ [标签]Stack; String [个人分析]这个题应该算是Stack的经典应用.先进 ...

  3. C#使用itextsharp生成PDF文件

    项目需求需要生成一个PDF文档,使用的是VS2010,ASP.NET. 网络上多次搜索没有自己想要的,于是硬着头皮到itextpdf官网看英文文档,按时完成任务,以实用为主,共享一下: 使用HTML文 ...

  4. MVC中,加入的一个aspx页面用到AspNetPager控件处理办法

    今天项目遇到了如题所示的问题,按照官方的案例介绍做分页,简直要奔溃了, 使用URL重写,但是page总是1,根本不跳, 不使用URL重写,又出现,第一页是 http://aa.com/view_asp ...

  5. dede轮播图

    DEDEcms 里面有个自带的轮播图调用: 模版 ------> 广告管理 --------> 增加一个新广告 ----进入后的界面 填写后 点击 代码获取相应的JS调用代码:或者织梦CM ...

  6. .Net SSRS(rdlc) 报表经验总结

    排版 1. 可以利用表格来布局,以避免调整固定宽度的麻烦. 2. 一个表的表头里还可以嵌套表格. 3. 设置rdlc报表打印格式.首先打开RDLC报表设计器页面.在灰色部分点右键 -> 报表属性 ...

  7. Java Tips: 使用Pattern.split替代String.split

    String.split方法很常用,用于切割字符串,split传入的参数是正则表达式,它的内部是每次都comiple正则表达式,再调用Pattern.split方法: public String[] ...

  8. Android 网络通信框架Volley的简单使用

    Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮. Volley提供的功能: JSON,图像等的异步下载: 网络请求的排序(scheduling) 网络请求的优先级处理 ...

  9. 单元测试之C/C++

    如今TDD很火,我公司小,一般写代码不写测试用例的,一般就是随便测试下函数的输入输出,没用工具或框架来测试,非常简单,一点也不正规化. 在一种传统的结构化编程语言中,比如C,要进行测试的单元一般是函数 ...

  10. Jsensation | 氪加

    Jsensation | 氪加 www.jsensation.com