一、触发器
  触发器是一个数据库对象,是一个特殊的过程,当特定的时间发生时隐式地执行。比如在一个表中发生插入、更新或删除的时间,或者 CREATE、ALTER 这样的数据定义语句执行时,触发器会隐式执行。当一些用户行为或数据库系统行为发生时(例如用户登陆或数据库关闭时),触发器也会隐式执行。
  触发器组成部分:
    触发时间    触发器体执行的时机    BEFORE、AFTER
    触发事件    那类具体的数据操纵语句  INSERT、UPDATE、DELETE、CREATE、ALTER
    触发器类型   触发器体执行次数     Statement、Row
    触发器体    触发器执行的具体操作   PL/SQL 块
【注意】:
当触发器类型为 Statement 时,称为语句触发器,触发器体对于触发事件只执行一次,及时没有行受到影响。
当类型为 Row 时,称为行触发器,触发器体对受出发时间影响的每行执行一次

二、创建和测试语句触发器
1.语法形式

CREATE [OR REPLACE] TRIGGER tname
timing
event1[OR event2 OR event3]
ON table
trigger_body

  其中,tname 表示触发器名字,timing 表示出发时间,event1、event2、event3 表示触发事件,table 表示针对的表,trigger_body 表示触发器体。

2.语句触发器示例
  例如需要创建这样一个触发器,只能在周一到周五的 9:00 到 18:00 才可以针对部门表 departments 进行 DML 操作。

create or replace trigger dml_depts_time
before --在触发事件发生前
insert or update or delete --触发事件为增删改
on departments --对表departments
begin --执行触发器体
if to_char(sysdate,'HH24:MI') not between '08:00' and '18:00'
or to_char(sysdate,'DY') in ('SAT','SUN')
then
raise_application_error(-20205,'You may only make changes during normal office hours');
end if;
end dml_depts_time

  需要说明的是,上面创建触发器的 SQL 语句中, RAISE_APPLICATION_ERROR 是一个内建过程,它返回一个错误給用户,并导致 PL/SQL 块失败。当一个数据库触发器失败时,触发语句会自动回滚。
  编译该触发器,通过 PL/SQL Dev 查看 Triggers 文件夹,可以看到刚编译的 dml_depts_time 触发器。为了验证触发器是否可以使用,选择在非工作时间,执行下面的 SQL 语句更新部门表的数据。

update departments
set department_name = 'IT GROUP'
where department_id = 60

结果

三、创建和测试行触发器
1.语法形式

 CREATE [OR REPLACE] TRIGGER tname
timing
event1 [OR event2 OR event3]
ON table
[REFERENCING OLD AS old|NEW AS new]
FOR EACH ROW
[WHEN(condition)]
trigger_body

2.行触发器示例
  例如需要创建一个行触发器,当更改了雇员表中某行的职位编号字段或部门编号字段后,自动在职位变迁表 job_history 中增加一行记录,记录该雇员的职位(包括部门)变迁情况。创建行触发器的 SQL 语句如下:

create or replace trigger update_job_history
after -- 在触发事件发生后
update of job_id,department_id -- 触发事件是修改职位或部门
on employees --对表employ
for each row -- 对每行
begin --执行触发器体
insert into job_history(employee_id, start_date, end_date, job_id, department_id)
values (:old.employee_id,:old.hire_date,sysdate,:old.job_id,:old.department_id);
end;

  编译该触发器。为了验证该触发器是否起作用,执行下面的 SQL 语句(更新两行)并提交食物,打开职位变迁表 job_history , 自动增加了两行记录。

update employees
set department_id = 90
where employee_id in (106,107) select * from hr.job_history

四、小题
1.不允许删除编号为7369的员工;

create or replace trigger nodelete_emp
before
delete
on scott.emp
for each row
begin
if :old.empno = 7369 then -- NEW 或 OLD 引用,不允许在表级触发器中
raise_application_error(-20006,'you can not delete the info .');
end if ;
end ; delete emp where empno = 7369;

结果

2.使用触发器实现主键自增长;

create sequence seq  -- 创建序列
increment by 1 -- 步长为1
start with 20 -- 初始值为 20
nomaxvalue -- 无最大值
nocycle -- 不循环、 CREATE OR REPLACE TRIGGER add_auto_pk --创建自动增长 触发器
BEFORE
INSERT ON scott.emp
FOR EACH ROW
DECLARE
v_emp_no NUMBER(4);
BEGIN
SELECT seq3.nextval INTO v_emp_no FROM dual;
:new.empno := v_emp_no;
END;

Oracle SQL触发器的更多相关文章

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

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

  2. Oracle数据库——触发器的创建与应用

    一.涉及内容 1.理解触发器的概念.作用和类型. 2.练习触发器的创建和使用. 二.具体操作 (实验) 1.利用触发器对在scott.emp表上执行的DML操作进行安全性检查,只有scott用户登录数 ...

  3. [结]Oracle trigger(触发器)摘录

    1.触发器: 是许多关系数据库系统都提供的一项技术.在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块. 触发器在数据库里以独立的对象存储,它与存储过程和函数不同 ...

  4. oracle的触发器

    oracle的触发器分为语句级和行级两种类型,在视图上所创建的触发器叫做什么类型的触发器? DML触发器有三类: 1, insert触发器: 2, update触发器: 3, delete触发器: 触 ...

  5. Oracle - java创建Oracle 的触发器

    Oracle - java创建Oracle 的触发器 今天碰到这个问题,遇到点问题,到这来 总结一下解决的办法, 需求,为一个用户当中的表增加一个自动增长列,我还没有学Oracle 的这部分,只是简单 ...

  6. Oracle SQL性能优化技巧大总结

    http://wenku.baidu.com/link?url=liS0_3fAyX2uXF5MAEQxMOj3YIY4UCcQM4gPfPzHfFcHBXuJTE8rANrwu6GXwdzbmvdV ...

  7. oracle数据库触发器(trigger)用法总结

    from:http://blog.csdn.net/zhanzhib/article/details/48729417 触发器的意思就是当我们对数据库对象(一般是表或视图)进行insert.updat ...

  8. Oracle学习-Power Designer、visio 2003、Oracle sql developer、OEM、expdp

    Oracle的体系太庞大了.对于刚開始学习的人来说,难免有些无从下手的感觉. 经过一学期的学习对Oracle学习有了一些深入的了解,由于之前学习过Oracle的一些主要的知识.所以学习起来上手比較快一 ...

  9. Oracle SQL Developer 连接 MySQL

    1. 在ORACLE官网下载Oracle SQL Developer第三方数据库驱动 下载页面:http://www.oracle.com/technetwork/developer-tools/sq ...

随机推荐

  1. Java中Comparator的使用

    在某些特殊情况,我们需要对一个对象数组或集合依照对应的属性排序:此时,我们就可以用Comparator接口处理. 上代码 TestComparaTo 类 package com.test.interf ...

  2. C# Stream篇(—) -- Stream基类

    写在前头: Stream系列文章共收录7篇,本着备忘和归纳的目的本着备忘和归纳的目的,全部收录于本分类中. 下面是有原文连接,望各位看官还是到原作者处学习,毕竟CV过来的文字难免有走样之处. 原始连接 ...

  3. 高斯消元几道入门题总结POJ1222&&POJ1681&&POJ1830&&POJ2065&&POJ3185

    最近在搞高斯消元,反正这些题要么是我击败了它们,要么就是这些题把我给击败了.现在高斯消元专题部分还有很多题,先把几道很简单的入门题总结一下吧. 专题:http://acm.hust.edu.cn/vj ...

  4. Android 用ViewFlipper实现跑马灯效果的公告提示

    1.代码部分private void initViewFlipper(final HomepageListModel.Notice notice) { for (int i = 0; i < n ...

  5. english-phoneme

    1. 声音概述 2. 音素phoneme与音标 2.1 音素与音标 2.2 音素与字母 2.3 字母发音-字母自然发音对照表 2.4 音标表 2.5 元音字母-辅音字母表 2.6 单元音发音口形趋势表 ...

  6. The Proof of Fibonacci GCD

    \[\Large \text{The Proof of Fibonacci GCD}\] \[\text{By Sangber}\] \(\text{Fibonacci Sequence}\) \(\ ...

  7. CRM:异步加载下拉列表,三个列表出现同样的下拉框

    异步加载下拉列表,三个列表出现同样的下拉框,原因如下: Spring默认单例,如果Action是单例,那么上一次查询的结果就可能被下一次的查询所调用.所以必须配置action为多例, 如果采用单例模式 ...

  8. 磁盘空间引起ES集群shard unassigned的处理过程

    1.问题描述 早上醒来发现手机有很多ES状态为red的告警,集群就前几天加了几个每天有十多亿记录的业务,当时估算过磁盘容量,应该是没有问题的,但是现在集群状态突然变成red了,这就有点懵逼了. 2.查 ...

  9. 第3节 sqoop:2、sqoop的基本简介和安装

    3. sqoop数据迁移 3.1.概述 sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具. 导入数据:MySQL,Oracle导入数据到Hadoop的HDFS.HI ...

  10. 记一次Redis+Getshell经验分享

    前言: 当我们接到一个授权渗透测试的时候,常规漏洞如注入.文件上传等尝试无果后,扫描端口可能会发现意外收获. 知己知彼乃百战不殆,Redis介绍: 简单来说 redis 就是一个Key-Value类型 ...