Oracle中的触发器

触发器

触发器(tigger)是在事件发生时隐式地自动运行的 PL/SQL 程序块,不能接收参数,不能被调用,就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行。因此触发器不需要人为的去调用,也不能调用。

触发器类型

根据触发器所创建的语句及所影响的对象的不同,将触发器分为 3 类,DML 触发器、系统事件触发器、替代触发器(instead of 触发器)

(1)DML 触发器
对数据表进行 DML 语句操作(如 insert、update、delete)时所触发的触发器,可以分为:

语句级触发器或行级触发器:行级触发器会对数据库表中的受影响的每一行触发一次触发器代码,语句级触发器则只触发一次,与语句所影响到的行数无关
before 触发器或 after 触发器:before 触发器在触发事件发生之前执行触发器代码,
after 触发器则在触发事件发生之后执行。
语法:

create [or replace] tigger 触发器名 触发时间 触发事件
on 表名
[for each row]
begin
pl/sql 语句
end

其中:
触发器名: 触发器对象的名称。由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。

触发时间: 指明触发器何时执行,该值可取:
before:表示在数据库动作之前触发器执行;
after:表示在数据库动作之后触发器执行。

触发事件: 指明哪些数据库动作会触发此触发器:
insert:数据库插入会触发此触发器;
update:数据库修改会触发此触发器;
delete:数据库删除会触发此触发器。

**表名:**数据库触发器所在的表。
for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。

触发器能实现如下功能:

功能:
1、允许/限制对表的修改

2、自动生成派生列,比如自增字段

3、强制数据一致性

4、提供审计和日志记录

5、防止无效的事务处理

6、启用复杂的业务逻辑

下面的触发器在更新表 tb_emp 之前触发,目的是不允许在周末修改表

create or replace trigger auth_secure before insert or update or DELETE on tb_emp
beginIF(to_char(sysdate,'DY')='星期日') THENRAISE_APPLICATION_ERROR(-20600,'不能在周末修改表 tb_emp');END IF;
END;--- 插入一条数据以后被触发
create or replace trigger testTrigger after insert on tb_emp FOR EACH ROW -- 对表的每一行触发器执行一次declare -- local variables here
begin dbms_output.put_line('一个员工被插入');
end testTrigger;---当用户对 test 表执行 DML 语句时,将相关信息记录到日志表
--创建测试表
CREATE TABLE test(t_id NUMBER(4),t_name VARCHAR2(20),t_age NUMBER(2),t_sex CHAR
);--创建记录测试表
CREATE TABLE test_log(l_user VARCHAR2(15),l_type VARCHAR2(15),l_date VARCHAR2(30)
);
--创建触发器
CREATE OR REPLACE TRIGGER TEST_TRIGGERAFTER DELETE OR INSERT OR UPDATE ON TEST
DECLAREV_TYPE TEST_LOG.L_TYPE%TYPE;
BEGINIF INSERTING THEN--INSERT 触发V_TYPE := 'INSERT';DBMS_OUTPUT.PUT_LINE('记录已经成功插入,并已记录到日志');ELSIF UPDATING THEN--UPDATE 触发V_TYPE := 'UPDATE';DBMS_OUTPUT.PUT_LINE('记录已经成功更新,并已记录到日志');ELSIF DELETING THEN--DELETE 触发V_TYPE := 'DELETE';DBMS_OUTPUT.PUT_LINE('记录已经成功删除,并已记录到日志');END IF;INSERT INTO TEST_LOG VALUES (USER, --USER 表示当前用户名V_TYPE, TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mi:ss'));
END;--下面我们来分别执行 DML 语句
INSERT INTO test VALUES(101,'zhao',22,'M');
UPDATE test SET t_age = 30 WHERE t_id = 101;
DELETE test WHERE t_id = 101;
--然后查看效果
SELECT * FROM test;
SELECT * FROM test_log;--- 创建触发器,比较 emp 表中更新的工资
set serveroutput on;
CREATE OR REPLACE TRIGGER SAL_EMPBEFORE UPDATE ON EMPFOR EACH ROW
BEGINIF :OLD.SAL > :NEW.SAL THEN --- :old.字段名称 :原来的值DBMS_OUTPUT.PUT_LINE('工资减少');ELSIF :OLD.SAL < :NEW.SAL THENDBMS_OUTPUT.PUT_LINE('工资增加');ELSEDBMS_OUTPUT.PUT_LINE('工资未作任何变动');END IF;DBMS_OUTPUT.PUT_LINE('更新前工资 :' || :OLD.SAL);DBMS_OUTPUT.PUT_LINE('更新后工资 :' || :NEW.SAL); -- :new.字段名称: 待更新的值
END;
--执行 UPDATE 查看效果
UPDATE emp SET sal = 3000 WHERE empno = '7788';

更多相关知识请戳我的主页哦!

Oracle中的触发器相关推荐

  1. oracle中创建触发器

    从csdn上面看到一个如何创建触发器的问题,感觉自己很有必要保存学习,特写下来: 条件: 现有A.B两张表 A: 工号 姓名 密码 性别 年龄 ... B: 工号 姓名 密码 当对A表中的" ...

  2. Oracle一张表写多个触发器,详解oracle中通过触发器记录每个语句影响总行数

    详解oracle中通过触发器记录每个语句影响总行数 需求产生: 业务系统中,有一步"抽数"流程,就是把一些数据从其它服务器同步到本库的目标表.这个过程有可能 多人同时抽数,互相影响 ...

  3. Oracle中的触发器(trigger)

    1.触发器的定义  数据库触发器是一个与表相关联.存储PL/SQL语句的"东西".每当一个特定的数据操作语句(insert.update.delete)在指定的表上发出时,Orac ...

  4. oracle中 关于触发器,oracle 闪回关于触发器的bug

    SQL> create table test1 (cola varchar2(10) ); 表已创建. SQL> create table test2 (colb varchar2(10) ...

  5. Oracle中查看触发器使用到的SQL

    一.ORACLE 查出表所有的触发器及触发器详细信息 1.1.查all_triggers表得到trigger_name select trigger_name from all_triggers wh ...

  6. oracle中触发器只能用于表吗,Oracle触发器的分类和使用

    Oracle触发器的分类和使用 摘要:在Oracle中,触发器是一种特殊的存储过程,它在发生某种数据库事件时由Oracle 系统自动触发.触发器通常用于加强数据的完整性约束和业务规则等,对于表来说,触 ...

  7. oracle 中触发器的作用是什么,oracle创建触发器及作用举例

    --创建触发器及作用举例 create or replace trigger tri before delete on emp --在删除emp表数据之前需要做的事根据自己的业务去写,before是在 ...

  8. Oracle 快速入门 触发器游标

    目录 一.触发器 1.什么是触发器(概念)? 2.创建触发器语法(史上最难的oracle语法,没有之一) 3. 触发器组成三部分: 4. 前触发与后触的原理图 5. 在级联表中创建触发器案例 二.程序 ...

  9. oracle中触发器的语法,解析Oracle触发器的语法

    导读:触发器是一种特殊的存储过程,触发器的执行不是由程序调用,也不是手工启动,而是由事件来触发,Oracle数据库是大家非常熟悉的数据库系统啦,那么Oracle触发器的语法是怎样的呢?下文中将为大家带 ...

最新文章

  1. [31期] 第一个项目结束之际--俺很高调但很真诚地感谢一个人--涛爷
  2. 腾讯云yum操作实现CentOS 7.6 64位Linux系统图形界面的安装和vnc的搭建
  3. openstack-Icehouse版本部署安装
  4. 解决alibaba-dubbo调用findFirstNonLoopbackHostInfo导致启动慢
  5. mybatis实现自定义SQL并且请求参数是集合
  6. apache.camel_使用Apache Camel 2.14的轻松REST端点
  7. 编写干净的测试–用特定领域的语言替换断言
  8. Flutter mac 环境搭建 最简教程
  9. mint linux qq,linuxmint系统下安装QQ
  10. iPhone越来越难打动你?从iOS平台转投安卓阵营 这招你得学会!
  11. vi/vim的使用方法及常用的快捷键--vimer们的福音
  12. [vb]On Error GoTo 0和On Error resume区别
  13. 基于SDN的环路通信
  14. 数据库篇之[bsp_orders]数据表-BrnShop1.9升级至2.1升级说明(非官方版本)
  15. 人才招聘中的“笔迹分析技术”
  16. SpringData JPA整理
  17. 超详细的springBoot学习教程
  18. 长文图解工业HART总线协议
  19. iir 滤波器 结构介绍
  20. 贝叶斯(朴素贝叶斯,正太贝叶斯)及OpenCV源码分析

热门文章

  1. 三天全力冲上中科大先研院
  2. java模拟内存溢出并分析_本地模拟内存溢出并分析Dump文件
  3. 初中计算机竞赛面试题目及答案,2019上半年初中信息技术教师资格面试真题及答案(第四批)...
  4. 使用mprotect定位踩内存故障
  5. it方面的证书 计算机软件,计算机及IT技术认证类型
  6. 防抄板加密芯片ALPU笔记
  7. 常用的系统操作响应时间
  8. jenkins使用python脚本发送企业微信通知
  9. 教师资格证 中学科目二 简答/辨析/材料 知识点与口诀
  10. YOLOv6: A Single-Stage Object Detection Framework for IndustrialApplications