DDL-数据定义语句:

四、触发器

-- 触发器(trigger),与某些特定的操作绑定,当达到触发条件后会自动触发
--主要用来将某些操作的过程记录下来,或者阻止某些非法的操作,保护数据

/*
触发条件:
触发时间 —— before/after
触发操作 —— insert/update/delete
触发对象 —— 表和列
触发范围 —— 所有数据或者指定条件
*/

/*
create [or replace] trigger 触发器名称
before / after
insert or update or delete
[ of 列 ] on 表
[for each row
when ( 限定条件 )]
begin
操作语句;
end;

for each row 表示每行符合条件的数据都触发

有了for each row可以不写when,有了 when 必须写for each row

when 后面的限定条件必须使用 old 或 new 来指明是以修改前的或者修改后的数据作为条件
*/

1.如果对emp表中30号部门员工的职位进行修改,
则将员工的姓名、原职位、新职位和修改时间记录下来。

--先创建一张表用来记录相关的数据
CREATE TABLE change_job
(
ename VARCHAR2(20),
old_job VARCHAR2(20),
new_job VARCHAR2(20),
ch_time DATE);

SELECT * FROM change_job;

--分析触发条件
--触发时间:before
--触发操作:update
--触发对象:emp表job列
--触发范围:30号部门

CREATE TRIGGER tri1
BEFORE
UPDATE
OF job ON emp
FOR EACH ROW
WHEN (old.deptno = 30)
BEGIN
INSERT INTO change_job
VALUES (:old.ename,:old.job,:new.job,SYSDATE);
               --begin部分如果要调用表中的数据,使用:old 和 :new 限定
END;

UPDATE emp
SET job = 'SALESMAN'
WHERE deptno = 30;

SELECT * FROM emp;

2.不允许在周末对emp表中的数据进行更改
--触发条件
--触发时间:before
--触发操作:update,delete,insert
--触发对象:emp表
--触发范围:所有数据

--如果触发条件是表中的数据在when中去设置条件
--如果触发条件是客观条件,与表中的数据无关,在begin部分使用条件判断语句 if 来实现

--触发器中要阻止某些操作可以使用raise_application_error 方法来提交一个系统错误
--raise_application_error( 错误id ,错误提示)
--错误id范围是 -20001~ -29999 之间,以免跟系统错误的 id 重复,错误提示自定义字符串

CREATE TRIGGER tri2
BEFORE
INSERT OR UPDATE OR DELETE
ON emp
BEGIN
IF TO_CHAR(SYSDATE,'fmDAY') IN ('SATURDAY','SUNDAY') THEN
RAISE_APPLICATION_ERROR(-20001,'can not change data at weekend');
END IF;
END;

DELETE emp
WHERE ename = 'ALLEN';

【练习】

创建一个触发器,要求对emp表中的删除操作进行判断,不能删除1981年6月1日之前入职的员工
create trigger emp_date_protect
before
delete
on emp
for each row
when (old.hiredate < to_date('19810601','YYYYMMDD'))
begin
RAISE_APPLICATION_ERROR(-20001,'Can NOT delete employees hired before June 1st 1981!');
end;

Oracle-DDL 3- 触发器的更多相关文章

  1. 15. DML, DDL, LOGON 触发器

    触发器可以理解为由特定事件触发的存储过程, 和存储过程.函数一样,触发器也支持CLR,目前SQL Server共支持以下几种触发器: 1. DML触发器, 表/视图级有效,可由DML语句 (INSER ...

  2. Oracle中创建触发器示例及注意事项

    1.oracle 中创建触发器示例 CREATE TABLE "CONCEPT"."FREQUENCYMODIFYLOG" ( "FREQUENCYI ...

  3. Oracle创建禁止DDL的触发器

    create or replace trigger forbid_ddl       before ddl on DATABASEbegin  --if ora_dict_obj_owner = or ...

  4. Oracle 学习之触发器

    1. 触发器简介 触发器是存储在数据库服务器中的程序单元,当一个表或一个视图被改变,或者数据库发生某些事件时,Oracle会自动触发触发器,并执行触发器中的代码.只有在触发器中定义的事件发生时,触发器 ...

  5. oracle数据库之触发器

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

  6. (八)Oracle学习笔记—— 触发器

    1. 触发器简介 触发器在数据库里以独立的对象存储,类似于过程(procedure)和函数(function),都有声明,执行和异常处理过程的PL/SQL块.它与存储过程和函数不同的是,存储过程与函数 ...

  7. Oracle数据库之触发器(一)

    触发器trigger是数据库提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发.比如当对一个表进行操作(in ...

  8. PowerDesginer 生成的Oracle 11g 组合触发器代码编译错误(29): PLS-00103

    问题描述: 采用PowerDesigner15针对Oracle 11g 创建物理数据模型,想实现一个字段的自增,采用如下步骤: 1.创建序列,命名为Sequence_1; 2.在自增字段编辑窗口中,选 ...

  9. Oracle基础<5>--触发器

    一.触发器 触发器是当特定事件出现时自动执行的代码块.比如,每次对员工表进行增删改的操作时,向日志表中添加一条记录.触发器和存储过程是由区别的:触发器是根据某些条件自动执行的,存储过程是手动条用的. ...

  10. Oracle系列之触发器

    涉及到表的处理请参看原表结构与数据  Oracle建表插数据等等 创建一个触发器,使其可以修改tb_Department表的deptno. create or replace trigger upda ...

随机推荐

  1. java上传超大文件解决方案

    用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 (本文提供全部源码下载,请访问 https://github.com/1269085759/up6-jsp-mysq ...

  2. java多线程批量下载文件

    多线程下载文件 平时开发中有时会用到文件下载,为了提高文件的下载速率,采用多线程下载能够达到事半功倍的效果: package test; /** * 文件下载类 * @author luweichen ...

  3. java 强制类项转换

    origin:http://blog.csdn.net/hikvision_java_gyh/article/details/8957450 编写java程序时,引用变量只能调用它编译时的类项方法.而 ...

  4. MySQL的密码操作命令

    一.请问在win2K命令提示符下怎样更改mysql的root管理员密码? >mysql -u root -p Enter password: ****** mysql> use mysql ...

  5. Confluence 6 编辑一个附加文件的属性

    你需要具有空间的 添加附件(Add Attachment)权限来编辑文件的属性. 希望编辑一个附加文件的属性: Go to  > Attachments 单击你希望编辑附件边上的 属性(Prop ...

  6. MessagePack Jackson 数据大小

    我们在使用 MessagePack 对 List 对象数据进行序列化的时候,发现序列化以后的二进制数组数据偏大的情况. 请注意,不是所有的 List 对象都会出现这种情况,这个根据你 List 对象中 ...

  7. 【CUDA 基础】4.2 内存管理

    title: [CUDA 基础]4.2 内存管理 categories: - CUDA - Freshman tags: - CUDA内存管理 - CUDA内存分配和释放 - CUDA内存传输 - 固 ...

  8. CTF MD5之守株待兔,你需要找到和系统锁匹配的钥匙

    这是提示 从系统锁下手,通过get方式key字段提交答案,直到您的钥匙与系统锁相等则成功. 点开链接可以发现有两串字符,而且系统的秘钥是一直在变化的 题目中已经给了MD5加密,那么用MD5解密发现您的 ...

  9. Python 之目录处理

    目录处理 OS目录处理目录-->路径,文件夹 文件:txt 1. 新建和删除一个目录 import os #引入os目录from xx import xx os.mkdir("D:\\ ...

  10. Torvalds的linux

    1991年,芬兰人林纳斯•托瓦兹在赫尔辛基大学上学,对操作系统很好奇,并且对MINIX只允许在教育上使用很不满(其不允许任何商业使用),于是开始写他自己的操作系统,这就是后来的Linux内核. 199 ...