oralce触发器
n 触发器的分类
DML(insert,delete,update)触发器
DDL(create table ,create view...drop...)触发器
系统触发器(与系统相关的触发器,比如用户登录,退出,启动数据库,关闭数据库)
触发器有触发事件,触发条件,触发操作三个部分构成。
n 语法介绍
create [or replace] tigger tigger_name
{before|after|
{insert|delete|update[of column[,column...]]}
on[schema.]table_name
[for each row]
[where condition]
begin
grigger_body;
end;
n 快速入门1
在某张表(my_emnp)添加一条数据的时候,提示‘添加了一条数据’
create table my_emp(id number,name varchar2(32));
create or replace trigger tri1
after insert on scott.my_emp
begin
dbms_output.put_line('添加了一条记录');
end;
在某张表(my_emp)修改多条数据的时候,提示多次’修改了数据‘
n 行级触发器和语句级触发器的区别
在创建触发器的时候,带不带for each row
create or replace trigger tri2
after update on
scott.emp
for each row ---表示这是一个行级触发器
begin
dbms_output.put_line('修改了一条数据');
end;
n 快速入门2
为了禁止工作人员在休息日改变员工信息,开发人员可以建立before语句触发器,从而实现数据的安全。
create or replace trigger tri2
before delete on
scott.emp
begin
if to_char(sysdate,'day')in('星期日','星期六') then
dbms_output.put_line('对不起,休息日不能删除员工');
RAISE_APPLICATION_ERROR(-20001,'对不起,休息日不能删除员工');
end if;
end;
特别说明:RAISE_APPLICATION_ERROR这个过程,是oracle提供的,可以传入两个参数,第一个是自定的错误号-20000~-20999之间;第二个参数是提示一个信息。
|
n 使用条件谓词
当触发器中同时包含多个触发事件(insert,update,delete)时,为了在触发器代码中区分具体的触发事件,可以使用三个条件
insterting
updating
deleting
为了禁止工作人员在休息日改变员工信息,开发人员可以建立before语句触发器,从而实现数据的安全,在给出提示时,明确提示用户是进行的insert,update还是delete操作。
create or replace trigger
tri3
before
insert or update or delete on
scott.emp
begin
case
when inserting then
dbms_output.put_line('休息日不要添加数据');
raise_application_error(-20002,'休息日不要添加数据');
when updating then
dbms_output.put_line('休息日不要修改数据');
raise_application_error(-20003,'休息日不要修改数据');
when deleting then
dbms_output.put_line('休息日不要删除数据');
raise_application_error(-20004,'休息日不要删除数据');
end case;
end;
n 使用OLD和NEW
问题:当触发器被触发时,要使用被插入、更新或删除的记录中的列值,有时要使用操作前、后列的值。
:new 修饰符访问操作完成后列的值
:old 修饰符访问操作完成前列的值
特性 |
INSERT |
UPDATE |
DELETE |
OLD |
NULL |
有效 |
有效 |
NEW |
有效 |
有效 |
NULL |
案例:①在修改emp表雇员的薪水时,显示雇员工资修改前和修改后的值
②如何确保在修改员工工资不能低于原有工资
create or replace trigger tri4
before update on
scott.emp
for each row
begin
if :new.sal<:old.sal
then
dbms_output.put_line('工资不能低于原来工资');
raise_application_error(-20005,'工资不能低于原来工资');
else
dbms_output.put_line('原来的工资是:'||:old.sal||'现在的工资是:'||:new.sal);
end if;
end;
oralce触发器的更多相关文章
- Oralce 触发器
今天做了一个需要用到触发器实现的功能中间去到了各种问题,还好最后都解决了: 整个过程中真是遇到了不少错误: ORA-04091: 表 KPGO.T_ISSUER 发生了变化, 触发器/函数不能读它 O ...
- oralce系统触发器
系统事件是指基于oracle事件(例如logon.logoff和startup.shutdown)所建立的触发器,通过使用系统事件触发器,提供了跟踪系统或是数据库变化机制.下面介绍使用的系统事件属性函 ...
- oralce 存储过程、函数和触发器
一.存储过程和存储函数 指存储在数据库中供所有用户程序调用的子程序叫存储过程.存储函数. 创建存储过程 用CREATE PROCEDURE命令建立存储过程. 语法: create [or repl ...
- oracle的触发器
oracle的触发器分为语句级和行级两种类型,在视图上所创建的触发器叫做什么类型的触发器? DML触发器有三类: 1, insert触发器: 2, update触发器: 3, delete触发器: 触 ...
- Oracle的基本语法,存储函数及触发器
1.PL/SQL PL/SQL是Oracle对 ql语言的过程化扩展,指在 SQL 命令语言中增加了过程处理语句,使SQL语言具有过程处理能力.把 SQL 语言的数据操纵能 力与过程语言的数据 ...
- Oracle打怪升级之路二【视图、序列、游标、索引、存储过程、触发器】
前言 在之前 <Oracle打怪升级之路一>中我们主要介绍了Oracle的基础和Oracle常用查询及函数,这篇文章作为补充,主要介绍Oracle的对象,视图.序列.同义词.索引等,以及P ...
- pt-online-schema-change中update触发器的bug
pt-online-schema-change在对表进行表结构变更时,会创建三个触发器. 如下文测试案例中的t2表,表结构如下: mysql> show create table t2\G . ...
- MySQL主从环境下存储过程,函数,触发器,事件的复制情况
下面,主要是验证在MySQL主从复制环境下,存储过程,函数,触发器,事件的复制情况,这些确实会让人混淆. 首先,创建一张测试表 mysql),age int); Query OK, rows affe ...
- MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
随机推荐
- sql server 获取指定格式的当前日期
使用sqlserver日期函数中的getdate()可以获取当现的日期,下面就将为您介绍这种使用sqlserver日期函数获取当前日期的方法. 但是如果我们只需要得到当前的日期,不需要时间部分,或者不 ...
- 原生JS实现彩票36选7不重复(优化)
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 谈谈数据库sql编写
本文主要给初学者关于关系数库的一个浮光掠影式的介绍,如果想深入理解,必须对于下文提到的每个内容单独深入学习! it-information technology的简称,中文是信息机技术,信息其实就是数 ...
- Hibernate-实体-对象状态-一级缓存-事务-查询
一 hibernate中的实体规则 1.1 实体类创建的注意事项 持久化类提供无参数构造 --在调用instance()方法时默认调用空参构造 成员变量私有,提供共有get/set方法 ...
- RandomRowFilter(3)
比较容易理解 用来随机抽取 RandomRowFilter:从名字上就可以看出其大概的用法,本过滤器的作用就是按照一定的几率(<=0会过滤掉所有的行,>=1会包含所有的行)来返回随机的结果 ...
- Luogu P3295 [SCOI2016]萌萌哒(并查集+倍增)
P3295 [SCOI2016]萌萌哒 题面 题目描述 一个长度为 \(n\) 的大数,用 \(S_1S_2S_3 \cdots S_n\) 表示,其中 \(S_i\) 表示数的第 \(i\) 位, ...
- SSM7-nginx的反向代理和负载均衡
1. 反向代理 1.1. 什么是反向代理 正向代理 反向代理: 反向代理服务器决定哪台服务器提供服务. 返回代理服务器不提供服务器.也是请求的转发. 1.2. Nginx实现反向代理 两个域名指向同一 ...
- echarts--例子
echarts使用例子: <script type="text/javascript"> option = { title : {'x': 'center','y':' ...
- JavaScript实现继承的方式和各自的优缺点
ECMAscript只支持实现继承,主要是依靠原型链来实现的. JavaScript实现继承的方式: 类式继承 构造函数继承 组合继承 寄生组合式继承 1.类式继承 //类式继承 //声明父类 fun ...
- MySQL用命令行复制表,查看表结构
一.mysql中用命令行复制表结构的方法主要有一下几种: 1.只复制表结构到新表 1 CREATE TABLE 新表 SELECT * FROM 旧表 WHERE 1=2; 或 1 CREATE TA ...