oracle学习笔记_触发器

《Oracle系列》Oracle详细入门教程 Docker安装Oracle,Oracle常用函数,Oracle触发器 阅读详情
 

 

触发器

是特定事件出现的时候,自动执行的代码块。类似于存储过程,但是用户不能直接调用他们。

功能:
1、 允许/限制对表的修改
2、 自动生成派生列,比如自增字段
3、 强制数据一致性
4、 提供审计和日志记录
5、 防止无效的事务处理
6、 启用复杂的业务逻辑

开始
create trigger biufer_employees_department_id
 before insert or update
  of department_id
  on employees
 referencing old as old_value
     new as new_value
 for each row
 when (new_value.department_id<>80 )
begin
 :new_value.commission_pct :=0;
end;
/

触发器的组成部分:
1、 触发器名称
2、 触发语句
3、 触发器限制
4、 触发操作

1、 触发器名称
create trigger biufer_employees_department_id
命名习惯:
biufer(before insert update for each row)
employees 表名
department_id 列名

2、 触发语句
比如:
表或视图上的DML语句
DDL语句
数据库关闭或启动,startup shutdown 等等
before insert or update
  of department_id
  on employees
 referencing old as old_value
     new as new_value
 for each row

说明:
1、 无论是否规定了department_id ,对employees表进行insert的时候
2、 对employees表的department_id列进行update的时候

3、 触发器限制
when (new_value.department_id<>80 )

限制不是必须的。此例表示如果列department_id不等于80的时候,触发器就会执行。
其中的new_value是代表跟新之后的值。

4、 触发操作
是触发器的主体
begin
 :new_value.commission_pct :=0;
end;

主体很简单,就是将更新后的commission_pct列置为0

触发:
insert into employees(employee_id,
last_name,first_name,hire_date,job_id,email,department_id,salary,commission_pct )
values( 12345,’Chen’,’Donny’, sysdate, 12,
‘donny@hotmail.com’,60,10000,.25);

select commission_pct from employees where employee_id=12345;

触发器不会通知用户,便改变了用户的输入值。


触发器类型:
1、 语句触发器
2、 行触发器
3、 INSTEAD OF 触发器
4、 系统条件触发器
5、 用户事件触发器

 

1、 语句触发器
是在表上或者某些情况下的视图上执行的特定语句或者语句组上的触发器。能够与INSERT、UPDATE、

DELETE或者组合上进行关联。但是无论使用什么样的组合,各个语句触发器都只会针对指定语句激活一次

。比如,无论update多少行,也只会调用一次update语句触发器。

例子:
需要对在表上进行DML操作的用户进行安全检查,看是否具有合适的特权。
Create table foo(a number);

Create trigger biud_foo
 Before insert or update or delete
  On foo
Begin
 If user not in (‘DONNY’) then
  Raise_application_error(-20001, ‘You don’t have access to modify this table.’);
 End if;
End;
/

即使SYS,SYSTEM用户也不能修改foo表

[试验]
对修改表的时间、人物进行日志记录。

1、 建立试验表
create table employees_copy as select *from hr.employees

2、 建立日志表
create table employees_log(
  who varchar2(30),
  when date);

3、 在employees_copy表上建立语句触发器,在触发器中填充employees_log 表。
Create or replace trigger biud_employee_copy
  Before insert or update or delete
   On employees_copy
 Begin
  Insert into employees_log(
   Who,when)
  Values( user, sysdate);
 
 End;
 /
4、 测试
update employees_copy set salary= salary*1.1;

select *from employess_log;

5、 确定是哪个语句起作用?
即是INSERT/UPDATE/DELETE中的哪一个触发了触发器?
可以在触发器中使用INSERTING / UPDATING / DELETING 条件谓词,作判断:
begin
  if inserting then
   -----
  elsif updating then
   -----
  elsif deleting then
   ------
  end if;
end;

if updating(‘COL1’) or updating(‘COL2’) then
  ------
end if;

[试验]
1、 修改日志表
alter table employees_log
  add (action varchar2(20));

2、 修改触发器,以便记录语句类型。
Create or replace trigger biud_employee_copy
  Before insert or update or delete
   On employees_copy
 Declare
  L_action employees_log.action%type;
 Begin
  if inserting then
   l_action:=’Insert’;
  elsif updating then
   l_action:=’Update’;
  elsif deleting then
   l_action:=’Delete’;
  else
   raise_application_error(-20001,’You should never ever get this error.’);

  Insert into employees_log(
   Who,action,when)
  Values( user, l_action,sysdate);
 End;
 /

3、 测试
insert into employees_copy( employee_id, last_name, email, hire_date, job_id)
 values(12345,’Chen’,’Donny@hotmail’,sysdate,12);

select *from employees_log

update employees_copy set salary=50000 where employee_id = 12345;

2、 行触发器
是指为受到影响的各个行激活的触发器,定义与语句触发器类似,有以下两个例外:
1、 定义语句中包含FOR EACH ROW子句
2、 在BEFORE……FOR EACH ROW触发器中,用户可以引用受到影响的行值。
比如:

定义:
create trigger biufer_employees_department_id
 before insert or update
  of department_id
  on employees_copy
 referencing old as old_value
     new as new_value
 for each row
 when (new_value.department_id<>80 )
begin
 :new_value.commission_pct :=0;
end;
/

Referencing 子句:
执行DML语句之前的值的默认名称是 :old ,之后的值是 :new
insert 操作只有:new
delete 操作只有 :old
update 操作两者都有

referencing子句只是将new 和old重命名为new_value和old_value,目的是避免混淆。比如操作一个名为

new的表时。
作用不很大。

 

[试验]:为主健生成自增序列号

drop table foo;
create table foo(id number, data varchar2(20));
create sequence foo_seq;

create or replace trigger bifer_foo_id_pk
 before insert on foo
 for each row
begin
 select foo_seq.nextval into :new.id from dual;
end;
/

insert into foo(data) values(‘donny’);
insert into foo values(5,’Chen’);
select * from foo;

3、 INSTEAD OF 触发器更新视图

Create or replace view company_phone_book as
 Select first_name||’, ’||last_name name, email, phone_number,
employee_id emp_id
From hr.employees;

尝试更新email和name
update hr.company_phone_book
 set name=’Chen1, Donny1’
where emp_id=100

create or replace trigger update_name_company_phone_book
INSTEAD OF
Update on hr.company_phone_book
Begin
 Update hr.employees
  Set employee_id=:new.emp_id,
   First_name=substr(:new.name, instr(:new.name,’,’)+2),
   last_name= substr(:new.name,1,instr(:new.name,’,’)-1),
   phone_number=:new.phone_number,
   email=:new.email
 where employee_id=:old.emp_id;
end;

 

4、 系统事件触发器
系统事件:数据库启动、关闭,服务器错误

create trigger ad_startup
 after startup
  on database
begin
 -- do some stuff
end;
/


5、 用户事件触发器
用户事件:用户登陆、注销,CREATE / ALTER / DROP / ANALYZE / AUDIT / GRANT / REVOKE /

RENAME / TRUNCATE / LOGOFF

例子:记录删除对象

1. 日志表
create table droped_objects(
 object_name varchar2(30),
 object_type varchar2(30),
 dropped_on date);

2.触发器
create or replace trigger log_drop_trigger
 before drop on donny.schema
begin
 insert into droped_objects values(
  ora_dict_obj_name,  -- 与触发器相关的函数
  ora_dict_obj_type,
  sysdate);
end;
/


3. 测试
create table drop_me(a number);
create view drop_me_view as select *from drop_me;
drop view drop_me_view;
drop table drop_me;

select *from droped_objects


禁用和启用触发器
alter trigger <trigger_name> disable;
alter trigger <trigger_name> enable;

事务处理:
在触发器中,不能使用commit / rollback
因为ddl语句具有隐式的commit,所以也不允许使用

视图:
dba_triggers

【ORACLE+PLSQL学习笔记#6】PLSQL+存储函数+存储过程+触发器 ** PLSQL 常见写法:select into语句可以在PLSQL中引入表数据,赋值给当前plsql声明的变量。 ■变量类型 属性类型可以在不知道数据类型的情况下,自动引入表中数据的类型: 属性引用类型: 表名.数据列名%type 属性行记录类型,记录结果集一整行信息的行单位: 行变量 表名%rowtype ** ■异常处理 ** PLSQL也有类似于Java的异常处理,当数据操作不合法时及时暂停程序避免崩溃。以下仅从无该数据、返回多条数据两种预定义异常为例。 返回多条数据: 无该数据: 如果忘记在 阅读详情

相关推荐

FPGA开发者必看:手把手教你用Xilinx ERNIC IP实现RoCE v2网络加速(附PG332文档解读)

本文详细解析了Xilinx ERNIC IP在FPGA平台上实现RoCE v2网络加速的全流程,包括架构设计、Vivado工程配置、驱动开发与性能调优。通过PG332技术文档的实践指导,帮助开发者快速构建低延迟、高性能的网络加速方案,适用于数据中心和边缘计算场景。

weixin_29168813的博客 672

Oracle-触发器

1.触发器的基本格式 CREATE OR REPLACE TRIGGER T1 BEFORE | AFTER | INSTEAD OF DELETE OR INSERT OR UPDATE OF 列名 ON 视图名或表名 FOR EACH ROW [ WHEN (条件) ] DECLARE 变量声明部分 BEGIN 执行部分 EX...

localhost 2540

SerDes硬件设计原理介绍

接收端:外部差分串行数据------线性均衡器----(CDR从数据中恢复出采样时钟)-----解串器(串行信号转并行信号)-------8B/10B的解码器或解扰器-----FIFO-----FPGA接受差分并行数据。发送端: FPGA发送差分并行数据----FIFO------8B/10B编码器或者扰码器-----串行器(并行信号转串行信号)-----均衡器(滤波)--------TX串行信号差分外发。串行器:8bit的并行数据----2bit的并行数据----1bits的串行数据。

weixin_42304393的博客 1110

触发器

/* 触发器 每当一个特定的数据操作语句(insert、update、delete)在指定的表上发出时,Oracle自动地执行触发器中定义的语句序列。第一个触发器:每当成功插入新员工后,自动打印“成功插入新员工” (触发器单词:trigger) */create trigger saynewemp after insert on emp declare begin dbms_output

暗象的博客 983

Comsol 压电换能器声场仿真(远场分析、边界元法优化)

本文详细介绍了在Comsol中使用边界元法进行压电换能器远场声场仿真的高效方法。针对传统有限元法计算远场时内存消耗大、耗时长的问题,文章阐述了边界元法在处理无限域、提升计算效率和精确获取远场指向性方面的核心优势,并提供了从多物理场耦合设置、网格划分策略到求解器配置及结果验证的完整实战指南。

weixin_29045585的博客 408

DySAT+: Enhancing Dynamic Graph Representation Learning with Multi-Head Self-Attention and Temporal-

本文深入探讨了DySAT+模型在动态图表示学习中的创新应用,通过多头时空注意力机制和层级信息融合策略,有效解决了动态图数据中的时间维度信息捕捉和结构演变动态适应问题。该模型在社交网络异常检测和金融交易网络分析等场景中表现出色,显著提升了预测准确率和响应速度。

weixin_29035405的博客 337

Oracle中的触发器(trigger)

1、触发器的定义 数据库触发器是一个与表相关联、存储PL/SQL语句的“东西”。每当一个特定的数据操作语句(insert、update、delete)在指定的表上发出时,Oracle自动执行触发器中定义的语句序列。例如:当员工信息插入后,自动输出“插入成功”的信息。 create or replace trigger empTrigger after insert on emp for each row declare -- 这里存放本地变量 begin dbms_outpu...

象在舞的技术专栏 6001

新手小白 必须精进的 “ FLASH分区管理Code and Data ” !!!最强文章解析!!!

FLASH“代码区”和“数据区”不是每个项目都必须显式管理,但只要你的产品功能越来越丰富,对可靠性和扩展性要求提高,就一定要学会科学划分和使用。这也是嵌入式工程师进阶路上的必修课!

qq_75157958的博客 935

触发器基础知识

触发器是特定事件出现的时候,自动执行的代码块。类似于存储过程,但是用户不能直接调用他们。功能:1、 允许/限制对表的修改2、 自动生成派生列,比如自增字段3、 强制数据一致性4、 提供审计和日志记录5、 防止无效的事务处理6、 启用复杂的业务逻辑开始create trigger biufer_employees_department_id       before insert or update

LemonYang的专栏 2031

gradle报错:A problem occurred configuring root project ‘My Application‘.

即使翻译了,我开始也看不懂,到处找网上教程,但都是改环境变量。马虎的我即使看了很多遍,改了很多遍也没反应过来,今天第一次搞gradle,突然就报错了,打印出。好了我就继续看项目了。

m0_59878789的博客 4091

MediaPipe 从入门到精通:安装、配置与多场景应用实战手册

人体姿态检测是 MediaPipe 的核心功能之一,它能够从图像或视频中识别人体姿态,并输出关键点的坐标。这些关键点覆盖了身体的主要部位,例如肩膀、肘部、髋部、膝盖等,总计 33 个点。每个关键点包含 x、y、z 坐标(归一化到 0-1 范围)以及可见性评分,可用于分析动作、姿势或开发健身、游戏等应用。手部关键点检测是 MediaPipe 的另一大亮点,它可以识别图像或视频中的手部,并输出 21 个关键点的坐标。这些关键点覆盖手掌和手指的各个部位,适用于手势识别、虚拟现实或交互式应用。

m0_71589036的博客 389

Oracle触发器学习笔记

关键字: oracle触发器的一些知识 1、这是oracle的规定,不能对执行触发器的表进行操作。   可以对new.xxx进行操作啊, 对于oracle行级触发器(for   each   row),不能对本表做任何操作,包括读取 原则:     在before   insert触发器中,可以实现对本表的访问;     在after   insert触发器中,不能实现对本表的访问;     在before/after   update/delete触发器中,都不能实现对本表的访问     其实原因很简单,

fcy98的专栏 652

从零手搓大模型(一)文本如何变成 LLM 的输入

本文介绍了从原始文本到LLM输入向量的完整处理流程。主要内容包括: 文本预处理:通过正则表达式将原始文本分割成token列表,处理标点和空格。 词表构建:创建token到ID的映射字典(vocabulary),这是文本数字化的关键步骤。 简单tokenizer实现:封装了编码(encode)和解码(decode)功能,完成文本与token ID的相互转换。 处理流程:原始文本 → 分词 → token ID → 嵌入表示 → 最终输入向量。 数据形状变化:从字符串逐步转换为(batch_size, cont

echo的博客 1006

触发器oracle 简易,Oracle学习笔记——触发器

最近要做一个日志记录功能,记录一些表的操作记录,我的第一想法就是使用触发器来实现。虽然想到了触发器,但是自己还真没有办法立刻动手写出触发器,对于触发器的语法都有很多地方不熟悉,甚至不理解。借着这次机会,好好的把触发器又温习了一篇,所以总结成文,以便后期查阅。触发器简介触发器是存储在数据库服务器中的程序单元,当一个表或一个视图被改变,或者数据库发生某些事件时,Oracle会自动触发触发器,并执行触发...

weixin_42310891的博客 439

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Oracle 学习笔记 触发器

Oracle 学习笔记 触发器2007年02月09日 星期五 12:26 oracle学习笔记 触发器     触发器 是特定事件出现的时候,自动执行的代码块。类似于存储过程,但是用户不能直接调用他们。 功能:1、 允许/限制

Anna空间 619

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

如何给oracle的触发器打断点,学习笔记_oracle——过程函数触发器

存储过程、函数、触发器存储过程实质性特定任务的子程序优点1、模块化2、可重用性3、可维护性4、安全性创建语法CREATE [OR REPLACE] PROCEDURE 过程名称[(参数列表)]{IS|AS}[声明变量]BEGIN--执行语句[EXCEPTION]--异常处理语句END [过程名称]//===============================================CR...

weixin_35986494的博客 1132

oracle 触发器登录,【学习笔记】Oracle触发器 实现指定用户登录oracle案例

天萃荷净触发器实现指定用户登录oracle,分享一篇关于Oracle数据库安全策略,通过Oracle触发器实现限定user用户登录Oracle数据库的方法1、创建允许登录用户表CREATE TABLE "CHF"."LOG$LOGIN_OS"("OS_USER" VARCHAR2(60 BYTE))2、创建触发器实现限制用户登录create or replaceTRIGGER TR_LOGIN_R...

weixin_42104947的博客 492

oracle 学习笔记之触发器

说明 数据库触发器是一个与表相关联的、存储的PL/SQL程序。每当一个特定的数据操作语句(Insert,update,delete)在指定的表上发出时,Oracle自己主动地运行触发器中定义的语句序列。 触发器的类型 语句级触发器:在指定的操作语句操作之前或之后运行一次,无论这条语句影响了多少行 。 行级触发器(FOR EACH ROW):触发语句作用的每一条记录都被触发...

aodiyi6351的博客 128

oracle 触发器 条件判断,Oracle SQL 学习笔记26 - 触发器

触发器定义Trigger是与tbale,view,schema或者databse相关的plsql程序块或过程,当特定事件发生时自动触发执行。分类触发器主要有两种类型:应用trigger:由特定的应用程序的事件触发数据库trigger:由数据库的特定事件触发设计Trigger触发器的基本指导首先,使用触发器可以执行一些相关动作,这些相关动作是集中的全局操作其次,使用trigger应避免和数据库已有功...

weixin_34180753的博客 1195

Oracle学习笔记20150917触发器

虚表是一个快照,视图与自查询都属于虚表. 1.视图是Oracle的一种数据对象,能简化操作,提高安全性,满足不同用户的需求,视图不是真正存在的物理表.它是根据别的表生成一个动态的视图.  创建视图基本语法create view 视图名字 as select 语句 [with read only] 例子:create view empview as select empno,ename,job

GZL的博客 375

Oracle学习笔记之触发器

定义:   触发器就是执行某个操作(增删改)的时候触发一个动作(一段程序). 触发器的作用:  数据的确认 实施复杂的安全性检查 做审计,跟踪表上所做的数据操作等 数据的同步和备份 触发器的类型: 语句级触发器(不管影响多少行,都只触发一次) 行级触发器(影响多少行,就触发多少次.) old 表示更新前的记录 new 表示更新后的数据 ...

wolfking0608的博客 225

Oracle 触发器学习笔记

定义:与表相关联的存储的PL/SQL程序 类型:1.语句级触发器;2.行级触发器。 应用:1.复杂的安全性检查 2.数据确认 3.实现审计功能 4.完成数据的备份和同步 作用:每当一个特定的数据操作语句(insert,update,delete)在指定表上发出时,Oracle自动地执行触发器中定义的语句序列。 写法: CREATE [ OR REPLACE] (创建或替换) TRIGGER 触发器名 BEFORE | AFTER (在执行操作语句之前或者之后) [INSERT | DE

民谣就酒的博客 177

Oracle的触发器学习笔记

触发器的概述、分类 (1)特殊的存储过程,自动执行 (2)触发器是不能带参数的(与视图类似) (3)保证表的完整性约束 --触发器的特点:                 (1)是一个特殊的存储过程                 (2)由系统自动调用,不能显示去调用触发器                 (3)创建触发器的时候就指定了什么时候去调用触发器

骑着蜗牛'深一'族 1276

历史经验之Oracle触发器学习笔记

整理日期: 2005年10月25日 Oracle触发器在MIS 开发中的应用 摘要:本文介绍了oracle触发器的概念和类型,总结了oracle触发器在开发MIS中的应用,并提供了实例以供参考. 关键词:MIS 、触发器 oracle 1.引言 本人在做一个大型的MIS系统(前台用powerbuild工具,后台用oracle数据库)时,常碰到一些有关数据冗长性,批量删除和动态信息方面的问题,由此发现数据库触发器简单易用。现将有关开发和应用中的一些体会总结成文,供同行参考。 2.触发器的概念和类型。 数据库

上善若水的博客 306
下一篇: oracle 临时表
zljjava
博客等级 码龄15年 155粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值