Oracle中的触发器
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中的触发器相关推荐
- oracle中创建触发器
从csdn上面看到一个如何创建触发器的问题,感觉自己很有必要保存学习,特写下来: 条件: 现有A.B两张表 A: 工号 姓名 密码 性别 年龄 ... B: 工号 姓名 密码 当对A表中的" ...
- Oracle一张表写多个触发器,详解oracle中通过触发器记录每个语句影响总行数
详解oracle中通过触发器记录每个语句影响总行数 需求产生: 业务系统中,有一步"抽数"流程,就是把一些数据从其它服务器同步到本库的目标表.这个过程有可能 多人同时抽数,互相影响 ...
- Oracle中的触发器(trigger)
1.触发器的定义 数据库触发器是一个与表相关联.存储PL/SQL语句的"东西".每当一个特定的数据操作语句(insert.update.delete)在指定的表上发出时,Orac ...
- oracle中 关于触发器,oracle 闪回关于触发器的bug
SQL> create table test1 (cola varchar2(10) ); 表已创建. SQL> create table test2 (colb varchar2(10) ...
- Oracle中查看触发器使用到的SQL
一.ORACLE 查出表所有的触发器及触发器详细信息 1.1.查all_triggers表得到trigger_name select trigger_name from all_triggers wh ...
- oracle中触发器只能用于表吗,Oracle触发器的分类和使用
Oracle触发器的分类和使用 摘要:在Oracle中,触发器是一种特殊的存储过程,它在发生某种数据库事件时由Oracle 系统自动触发.触发器通常用于加强数据的完整性约束和业务规则等,对于表来说,触 ...
- oracle 中触发器的作用是什么,oracle创建触发器及作用举例
--创建触发器及作用举例 create or replace trigger tri before delete on emp --在删除emp表数据之前需要做的事根据自己的业务去写,before是在 ...
- Oracle 快速入门 触发器游标
目录 一.触发器 1.什么是触发器(概念)? 2.创建触发器语法(史上最难的oracle语法,没有之一) 3. 触发器组成三部分: 4. 前触发与后触的原理图 5. 在级联表中创建触发器案例 二.程序 ...
- oracle中触发器的语法,解析Oracle触发器的语法
导读:触发器是一种特殊的存储过程,触发器的执行不是由程序调用,也不是手工启动,而是由事件来触发,Oracle数据库是大家非常熟悉的数据库系统啦,那么Oracle触发器的语法是怎样的呢?下文中将为大家带 ...
最新文章
- [31期] 第一个项目结束之际--俺很高调但很真诚地感谢一个人--涛爷
- 腾讯云yum操作实现CentOS 7.6 64位Linux系统图形界面的安装和vnc的搭建
- openstack-Icehouse版本部署安装
- 解决alibaba-dubbo调用findFirstNonLoopbackHostInfo导致启动慢
- mybatis实现自定义SQL并且请求参数是集合
- apache.camel_使用Apache Camel 2.14的轻松REST端点
- 编写干净的测试–用特定领域的语言替换断言
- Flutter mac 环境搭建 最简教程
- mint linux qq,linuxmint系统下安装QQ
- iPhone越来越难打动你?从iOS平台转投安卓阵营 这招你得学会!
- vi/vim的使用方法及常用的快捷键--vimer们的福音
- [vb]On Error GoTo 0和On Error resume区别
- 基于SDN的环路通信
- 数据库篇之[bsp_orders]数据表-BrnShop1.9升级至2.1升级说明(非官方版本)
- 人才招聘中的“笔迹分析技术”
- SpringData JPA整理
- 超详细的springBoot学习教程
- 长文图解工业HART总线协议
- iir 滤波器 结构介绍
- 贝叶斯(朴素贝叶斯,正太贝叶斯)及OpenCV源码分析
热门文章
- 三天全力冲上中科大先研院
- java模拟内存溢出并分析_本地模拟内存溢出并分析Dump文件
- 初中计算机竞赛面试题目及答案,2019上半年初中信息技术教师资格面试真题及答案(第四批)...
- 使用mprotect定位踩内存故障
- it方面的证书 计算机软件,计算机及IT技术认证类型
- 防抄板加密芯片ALPU笔记
- 常用的系统操作响应时间
- jenkins使用python脚本发送企业微信通知
- 教师资格证 中学科目二 简答/辨析/材料 知识点与口诀
- YOLOv6: A Single-Stage Object Detection Framework for IndustrialApplications