一、触发器概述

与表,视图,模式,或者数据库相关的PL/SQL过程,当触发条件被触发时,自动执行

分类:

1.语句触发器

2.行触发器

二、语句触发器

1. 什么是语句触发器

语句触发器,是指当执行DML语句时被隐含执行的触发器,如果在表上针对某种DML操作建立了语句触发器,那么当执行DML操作时会自动执行触发器的相应代码

当审计DML操作或者确保DML操作安全执行时,可以使用语句触发器,使用语句触发器时,不能记录列数据的变化

2. 语法:

create [or replace] trigger trigger_name
timing event1[or event2 or event3]
on table_name
pl/sql block;

trigger_name:用于指定触发器名
timing:指定触发时机(before或after)
event:指定触发事件(INSERT,UPDATE,和DELETE);
table_name:用于指定DML操作对应的表名

3. 语句触发器的分类

3.1 BEFORE触发器

为了确保DML操作在正常情况下执行,可以基于DML操作建立BEFORE语句触发器,例如为了禁止工作人员在休息日改变雇员信息,开发人员可以建立BEFORE语句触发器,以实现数据的安全保护

示例如下:

create or replace trigger tr_sec_emp
before insert or update or delete on emp
begin
if to_char(sysdate, 'DY', 'nls_date_language = AMERICAN') in
('SAT', 'SUN') then
raise_application_error(-, '不能在工作日修改员工信息');
end if;
end;

    修改系统日期:

[root@oracle oracle]#
[root@oracle oracle]# date
Wed Sep :: CST
[root@oracle oracle]# date -s "Wed Sep 6 22:37:27 CST 2014"
Sat Sep :: CST
[root@oracle oracle]# date
Sat Sep :: CST

提示:

SQL>update emp set sal=sal+ where empno=;

ORA-:不能在工作日修改员工信息

3.2 使用条件谓词:

当在触发器中同时包含多个触发条件(INSERT,UPDATE,DELETE)时,为了在触发器源代码中区分具体

的触发条件,可以使用三个条件谓词,可以使用以下三个条件谓词:

INSERTING:当触发事件是insert操作时,该条件谓词返回值为TRUE,否则为FALSE
UPDATING:当触发事件是UPDATE操作时,该条件谓词返回值为TRUE,否则为FALSE
DELETING:当触发事件是DELETE作时,该条件谓词返回值为TRUE,否则为FALSE

create or replace trigger tr_sec_emp
before insert or update or delete on emp
begin
if to_char(sysdate, 'DY', 'nls_date_language = AMERICAN') in
('SAT', 'SUN') then
case
when inserting then
raise_application_error(-, '不能在工作日增加员工');
when updating then
raise_application_error(-, '不能在工作日修改员工');
when deleting then
raise_application_error(-, '不能在工作日解雇员工');
end case;
end if;
end;

执行过程:

SQL> update emp set sal=sal+ where empno=;
update emp set sal=sal+ where empno=
ORA-: 不能在非工作室更新员工
ORA-: 在 "SCOTT.TR_SEC_EMP", line
ORA-: 触发器 'SCOTT.TR_SEC_EMP' 执行过程中出错

3.3 建立after语句触发器:

为了审计DML操作或者DML操作之后执行汇总运算,可以使用after触发器例如,为了审计在emp表上insert,update,delete操作次数,可以建立after触发器

在建立after触发器之前,首先建立审计表audit_table
创建审计表:

create table audit_table(name varchar2(),ins int,upd int,del int,
starttime date,endtime date);

创建触发器:

create or replace trigger tr_audit_table
after insert or delete or update on emp
declare
v_temp int;
begin
select count(*) into v_temp from audit_table where name = 'EMP';
if v_temp = then
insert into audit_table values ('EMP', , , , SYSDATE, null);
end if;
case
when inserting then
update audit_table set ins = ins + where name = 'EMP';
when deleting then
update audit_table set del = del + where name = 'EMP';
when updating then
update audit_table set upd = upd + where name = 'EMP';
end case;
end;

执行结果:

SQL> update emp set sal=sal+ where empno=;
row updated SQL> select * from audit_table;
NAME INS UPD DEL STARTTIME ENDTIME
---------- --- --- --- ----------- -----------
EMP //

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

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

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

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

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

  3. 使用DML语句【weber出品必属精品】

    DML语句包含以下语法: INSERT:往一个表中增加新行 DELETE:从一个表中删除掉现有的行 UPDATE:更改一个表中现有的行 INSERT语句语法:INSERT INTO TABLE(COL ...

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

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

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

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

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

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

  7. 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 ...

  8. Oracle——索引,序列,触发器

    1.索引 1)注意 oracle创建主键时会自动在该列上创建索引 2)索引原理 A.  若没有索引,搜索某个记录时(例如查找name='wish')需要搜索所有的记录,因为不能保证只有一个wish,必 ...

  9. plsql 触发器介绍 语句级别触发器、行级别触发器。

    /* 分类: 1.DDL触发器 执行create,alter,drop操作时,会激活的触发器 2.DML触发器 执行增.删除.修改时,激活的触发器 3.系统事件触发器 执行特定的系统事件时(启动.加载 ...

随机推荐

  1. Cookie[1]

    1.什么是Cookie Cookie是一小段文本类型的数据,由服务器发送,并保留在客户端的计算机上. 2.Cookie的作用 服务器可以利用Cookie包含的信息来筛选并经常维护这些信息,以判断在Ht ...

  2. C# 导出word文档及批量导出word文档(4)

          接下来是批量导出word文档和批量打印word文件,批量导出word文档和批量打印word文件的思路差不多,只是批量打印不用打包压缩文件,而是把所有文件合成一个word,然后通过js来调用 ...

  3. IIS上部署网站404错误

    新装的系统上部署.net网站遇到403.404错误,可能原因记录: 1.应用程序池选择错误,一般选择4.0的 2.ASP.NET4.0应用程序池未安装(一般先安装了framework4.0,后安装ii ...

  4. POJ 3273 Monthly Expense(二分查找+边界条件)

    POJ 3273 Monthly Expense 此题与POJ3258有点类似,一开始把判断条件写错了,wa了两次,二分查找可以有以下两种: ){ mid=(lb+ub)/; if(C(mid)< ...

  5. DHTML【2】--HTML

    通过题目,大家已经明确知道,从这一节开始介绍DHTML中的最基础的部分HTML,对于HTML等概念上一节已经做了概述,这一节不再赘余.在学习HTML之前,先告诉大家一个好消息,HTML不难,比C++. ...

  6. nginx_http核心模块(二)

    对一些常用的配置项做一些解释:详细请看官方文档:http://nginx.org/en/docs/http/ngx_http_core_module.html 1. alias Syntax: ali ...

  7. Web项目中JSP页面的一种调试方法与出现的问题 -- SpringMVC架构测试

    在前端开发中,尤其是MVC架构多人开发,负责前端的童鞋总是需要做静态页面,再和后台连接前无法使用变量如EL表达式等测试功能,所以本人引入了一个模板jsp数据测试专用文件,专门配置所有的变量,然后在待测 ...

  8. javascript学习教程之---如何从一个tab切换到banner幻灯片的转换

    一个简单的tab切换代码: <!doctype html> <html> <head> <meta charset="utf-8"> ...

  9. windows下安装phpcms html/ 文件夹不可写的一种错误以及解决方法

    朋友安装phpcms时遇到奇葩问题,环境搭建在windows7中,竟然出现 html/ 和 phpsso_server/caches/文件夹不可写问题(如图) 在windows下出现这种权限的问题真不 ...

  10. C语言计算机器运行时间

    //计算机器运行时间 long i = 10000000L;clock_t start, finish;double duration;//测量一个事件持续的时间printf( "Time ...