文章目录

  • 触发器
    • 1. 触发器简介
      • 1.1 什么是触发器
      • 1.2 触发器的应用场景
      • 1.3 触发器的语法
      • 1.4 触发器的类型
    • 2. 第一个触发器
      • 2.1 创建触发器
    • 3. 案例一:实施复杂的安全性检查-禁止在非工作时间插入新用户
    • 4. 案例二:数据的确认-涨工资,涨后的薪水不能低于涨前的薪水
    • 5. 案例三:数据库的审计-给员工涨工资,当工资超过6000时,保存数据到另一张表作为审计
    • 6. 案例四:数据的备份和同步-利用触发器实现数据同步

触发器

1. 触发器简介

1.1 什么是触发器

数据库触发器是一个与表相关联的、存储的PL/SQL程序。
每当一个特定的数据操作语句(insert,update,delete)在指定的表上发出时,Oracle自动的执行触发器中定义的语句序列。

1.2 触发器的应用场景

1.复杂的安全性检查
2.数据确认
3.实现审计功能
4.完成数据的备份和同步

1.3 触发器的语法

pl/sql语法

1.4 触发器的类型

语句级触发器:(针对是表)在指定的操作语句操作之前或者操作之后执行一次,不管这条语句执行了多少行。
行级触发器: (针对一行)触发语句作用的每一条记录都被触发,在行级触发器中使用:old和:new伪记录变量,识别值的状态。

2. 第一个触发器

需求:每当成功插入一条数据,自动打印“成功增加一位用户”

2.1 创建触发器

语法

CREATE [OR REPLACE] TRIGGER 触发器名称
-- 操作之前/之后
{BEFORE | AFTER}
--操作属性,更新可以指定列名
{DELETE | INSERT | UPDATE [OF 列名]}
ON 表名
-- 如果存在这条语句,就是行级触发器,否则为语句触发器
[FOR EACH ROW[WHEN(条件)]]
PLSQL块

案例

-- TRIGGER关键字
CREATE OR REPLACE TRIGGER INSERTNEWITEM
-- 插入之后操作,需要指明表
AFTER INSERT ON YSTEXT
--开头
DECLARE
BEGINDBMS_OUTPUT.PUT('成功增加一位用户');
END;

运行

结果

3. 案例一:实施复杂的安全性检查-禁止在非工作时间插入新用户

触发器应用场景一:实施复杂的安全性检查

禁止在非工作时间插入新用户

条件

1.非工作时间1.周六日:to_char(sysdate,'day') in ('星期六','星期日')2.上班前/下班后:
2.语句级触发器,针对表

代码

create or replace TRIGGER ADDUSERINFO
BEFORE INSERT ON YSTEXT
BEGIN--设置条件IF to_char(SYSDATE,'day') in ('星期六','星期日') OR TO_NUMBER(to_char(SYSDATE, 'hh24')) not between 9 and 18THEN--禁止插入新员工 --这里使用抛出异常的方法,参数1为异常号,规定范围在-20000 到 -20999,第二个参数为错误信息RAISE_APPLICATION_ERROR(-20001, '禁止在非工作时间插入用户信息');END IF;
END;

结果

4. 案例二:数据的确认-涨工资,涨后的薪水不能低于涨前的薪水

触发器应用场景二:数据的确认

涨工资,涨后的薪水不能低于涨前的薪水

条件

1.行级触发器,针对每条数据
2. :old 和 :new 代表同一条记录
3. :old 表示操作该行之前,这一行的值
4. :new 表示操作该行之后,这一行的值

代码

create or replace TRIGGER CHECKMONEY
BEFORE UPDATE ON YSTEXTFOR EACH ROW
BEGINIF :new.money < :old.moneyTHENRAISE_APPLICATION_ERROR(-20002, '涨后的工资不能小于涨前的工资,涨后的薪水'||:new.money ||'涨前的薪水'||:old.money);END IF;
END;

结果

5. 案例三:数据库的审计-给员工涨工资,当工资超过6000时,保存数据到另一张表作为审计

数据库的审计

给员工涨工资,当工资超过6000时,保存数据到另一张表作为审计

条件

1.行级触发器

代码

--案例三数据库的审计
--给员工涨工资,当工资超过6000时,保存数据到另一张表作为审计
CREATE OR REPLACE TRIGGER AUDITMONEY
BEFORE UPDATE ON YSTEXT
FOR EACH ROW
BEGIN--当涨后的薪水大于6000,插入信息到审计表IF :new.money > 6000 THENINSERT INTO AUDIT_INFO("ID", "NAME", "MONEY") VALUES (:new.id,:new.name,:new.money);END IF;
END;

执行update

UPDATE YS.YSTEXT SET MONEY = MONEY-3000


结果:审计表插入一条数据

6. 案例四:数据的备份和同步-利用触发器实现数据同步

数据的备份和同步

利用触发器实现数据同步,当给员工涨完工资之后,自动备份新的工资到备份表中

条件

 1.行级触发器

代码

CREATE OR REPLACE TRIGGER BACK_YSTEXT
BEFORE UPDATE ON YSTEXT
FOR EACH ROW
BEGIN--当主表更新后,自动更新备份表UPDATE ystext_back SET money = :new.money where id = :new.id;
END;

源表起始数据

目标表起始数据

运行

源表结果数据

目标表结果数据

3. 触发器的使用和案例相关推荐

  1. oracle触发器记录所有dml,Oracle DML类型触发器

    Oracle DML类型触发器 Oracle DML类型触发器是Oracle开发过程当中最经常用到,也是最常见的触发器,主要是对DML操作,如:insert.delete.update操作事件进行触发 ...

  2. PostgreSQL 30天 培训视频(SQL基础,备份恢复,HA,服务端编程,大数据,内核,应用案例)

    Postgres2015全国用户大会将于11月20至21日在北京丽亭华苑酒店召开.本次大会嘉宾阵容强大,国内顶级PostgreSQL数据库专家将悉数到场,并特邀欧洲.俄罗斯.日本.美国等国家和地区的数 ...

  3. oracle 触发器管理(以及行级触发器中有两个伪变量 :new 与 :old 的使用方法)(三个谓词inserting、deleting、updating的使用方法)

    oracle触发器管理: 1.概念 2.建立一个简单的触发器: 3.触发器的作用 4.触发条件 a.触发事件 b.触发时间 c.触发级别 d.触发限制 e.触发对象 5.创建及使用触发器 6.触发器分 ...

  4. oracle触发器报错语法,Oracle 触发器

    Oracle触发器是使用者对Oracle数据库的对象做特定的操作时,触发的一段PL/SQL程序代码,叫做触发器.触发的事件包括对表的DML操作,用户的DDL操作以及数据库事件等. 一.触发器的作用 O ...

  5. Mysql系列之六(视图,事务,触发器等)

    视图 1.什么是视图 视图就是通过查询一张表储存起来,下次可以接着用 2.为什么要用视图 如果要频繁的使用一张虚拟表,你可以制作成视图,后续直接使用 3.如何操作 # 固定语法 create view ...

  6. 数据库触发器调用python_数据库——触发器

    触发器 使用触发器可以定制用户对表进行[增,删,改]操作时前后的行为. 当我们想要在一个表记录被更新时做一些操作时就可以使用触发器 但是我们完全可以在python中来完成这个事情,因为python的扩 ...

  7. postgresql最全整理资料,PostgreSQL 30天 培训视频(SQL基础,备份恢复,HA,服务端编程,大数据,内核,应用案例)

    转载自:http://blog.163.com/digoal@126/blog/static/16387704020141229159715/ 希望通过这些视频帮到一些朋友, 同时对视频中的错误点烦请 ...

  8. FPGA从Xilinx的7系列学起(6)

    用户必须要认识到,学习一下技巧可以让更多的逻辑放在更少的Slice中,使工具能够达到既实现设计时序要求又满足用户对功耗的要求.而现在很多用户缺乏代码编写的想法,编写出一个有时序问题的设计.为了满足要求 ...

  9. 自动化运维专题之zabbix课程内容大纲

    一.监控系统概述 1.1 网络监控概述 1.2 SNMP协议概述 1.2.1 SNMP协议框架 1.2.2 SNMP协议基本工作原理 1.3 监控系统实现目标 1.3.1 数据收集 1.3.2 数据存 ...

最新文章

  1. 公司CRM的三个阶段
  2. 【转】Nginx系列(五)--nginx+tomcat实现负载均衡
  3. Linux下往移动硬盘拷贝数据步骤方式
  4. Elasticsearch Grok Pattern内置表达式大全
  5. 大工13秋《专业英语(计算机英语)》在线测试2,大工13秋《专业英语(计算机英语)》在线测试2答案...
  6. 1470. Shuffle the Array
  7. 解决devenv.exe应用程序错误,应用程序发生异常
  8. [TJOI2015]线性代数(最小割)
  9. N1CTF 塞题vote分析
  10. 程序员进阶之路:四个程序员职业阶段,通常对应不同的薪资待遇!
  11. 国土空间规划的体系和内容
  12. Jmeter 的json Extractor
  13. 7.数据结构 --- 图
  14. 埃斯顿三轴机器人编程_一文了解Estun Studio机器人仿真与离线编程软件
  15. 如何清洁Mac的屏幕
  16. 带你逐步深入了解SSM框架——淘淘商城项目之redis缓存
  17. 编程制作动态壁纸的思路_Android应用源码动态壁纸开发必看例子源码
  18. 康托展开及其逆运算 详解
  19. 电脑公司 雨林.番茄.深度.龙帝国.系统之家.系统光盘收录大全
  20. 倚天屠龙记(函数模板)

热门文章

  1. 北京信息科技大学第十一届程序设计竞赛(重现赛)H andy和购物
  2. Python数据可视化 Pyecharts 制作 Calendar 日历热图
  3. UVM:11 OVM 到UVM 的迁移
  4. P2P 终结者 for Linux
  5. 求时滞反应扩散方程(纽曼边界条件的)的matlab代码
  6. 解决ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
  7. android 8.0模拟点击,安卓8.0能用的模拟器
  8. Android中静态方式破解某App实现所有视频app去除广告功能
  9. c语言中的头文件stdlib.h的作用,c语言includestdlib.h什么意思?
  10. 傲腾内存 可以用ghost系统_创新无止境!英特尔2020继续用“芯”改变世界