Oracle-DDL 3- 触发器
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- 触发器的更多相关文章
- 15. DML, DDL, LOGON 触发器
触发器可以理解为由特定事件触发的存储过程, 和存储过程.函数一样,触发器也支持CLR,目前SQL Server共支持以下几种触发器: 1. DML触发器, 表/视图级有效,可由DML语句 (INSER ...
- Oracle中创建触发器示例及注意事项
1.oracle 中创建触发器示例 CREATE TABLE "CONCEPT"."FREQUENCYMODIFYLOG" ( "FREQUENCYI ...
- Oracle创建禁止DDL的触发器
create or replace trigger forbid_ddl before ddl on DATABASEbegin --if ora_dict_obj_owner = or ...
- Oracle 学习之触发器
1. 触发器简介 触发器是存储在数据库服务器中的程序单元,当一个表或一个视图被改变,或者数据库发生某些事件时,Oracle会自动触发触发器,并执行触发器中的代码.只有在触发器中定义的事件发生时,触发器 ...
- oracle数据库之触发器
触发器是许多关系数据库系统都提供的一项技术.在 ORACLE 系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的 PL/SQL 块. 一. 触发器类型 触发器在数据库里以独立的对象存储,它与 ...
- (八)Oracle学习笔记—— 触发器
1. 触发器简介 触发器在数据库里以独立的对象存储,类似于过程(procedure)和函数(function),都有声明,执行和异常处理过程的PL/SQL块.它与存储过程和函数不同的是,存储过程与函数 ...
- Oracle数据库之触发器(一)
触发器trigger是数据库提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发.比如当对一个表进行操作(in ...
- PowerDesginer 生成的Oracle 11g 组合触发器代码编译错误(29): PLS-00103
问题描述: 采用PowerDesigner15针对Oracle 11g 创建物理数据模型,想实现一个字段的自增,采用如下步骤: 1.创建序列,命名为Sequence_1; 2.在自增字段编辑窗口中,选 ...
- Oracle基础<5>--触发器
一.触发器 触发器是当特定事件出现时自动执行的代码块.比如,每次对员工表进行增删改的操作时,向日志表中添加一条记录.触发器和存储过程是由区别的:触发器是根据某些条件自动执行的,存储过程是手动条用的. ...
- Oracle系列之触发器
涉及到表的处理请参看原表结构与数据 Oracle建表插数据等等 创建一个触发器,使其可以修改tb_Department表的deptno. create or replace trigger upda ...
随机推荐
- JVM(七),JVM面试小知识
七.JVM面试小知识 1.JVM三大性能调优参数 -Xms -Xmx -Xss 的含义 2.java内存模型中堆和栈的区别 3.不同JDK版本中的intern()方法的区别
- 51 Nod 1043 幸运号码(需重做好好体会)
转自:http://www.cnblogs.com/geloutingyu/p/6329594.html 一道非常好的dp题目. 1043 幸运号码 基准时间限制:1 秒 空间限制:131072 K ...
- springboot拦截异常信息发送邮件提醒
-- private JavaMailSender sender; 可能会出现注入错误,请注意yam配置文件中格式是否一致:否则会找不到注入的bean 一 发送邮件 在Springboot中发送邮件非 ...
- TCP之11种状态变迁
1. TCP 之11种状态变迁 TCP 为一个连接定义了 11 种状态,并且 TCP 规则规定如何基于当前状态及在该状态下所接收的分节从一个状态转换到另一个状态.如,当某个应用进程在 CLOSED 状 ...
- tensorflow源码分析——BasicLSTMCell
BasicLSTMCell 是最简单的LSTMCell,源码位于:/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.py.BasicLSTMC ...
- 安装RabbitMq,写程序发送接收消息
1.安装Erlang和RabbitMq 在安装RabbitMq之前需要安装的Erlang(esl-erlang_22.0_windows_amd64.exe): https://pan.baidu.c ...
- 【React自制全家桶】九、Redux入手
一.React项目中为什么要用Redux 上图: 左图当使用纯React开发稍微大点的项目,因为React数据是瀑布式的,只能通过父子组件传递数据,所以实现关系不大的两React的组件之间的数据传递就 ...
- 依赖注入框架之dagger2
主页: https://github.com/google/dagger 历史 * Dagger1是由Square公司受到Guice(https://github.com/google/guice)启 ...
- 内存数据库:memcached与redis技术的对比试验
本文以高性能nginx服务器为应用背景,想利用缓存技术来减轻系统负荷,加快响应时间,从而增加web服务器的吞吐量. redis是一种分布式内存数据库,memcached是一种内存缓存技术,它们都采用k ...
- OpenStack 虚拟机启动流程 UML 分析(内含 UML 源码)
目录 文章目录 目录 前言 API 请求 Nova API 阶段 Nova Conductor 阶段 Nova Scheduler 阶段 Nova Compute 阶段(计算节点资源分配部分) Nov ...