当前位置: 首页 > news >正文

Oracle触发器

Oracle触发器就是特定事件发生时自动执行的存储过程。

触发器基本使用

基本语法:

create [or replace] trigger 触发器名称
alter | before | instead of
[insert] [[or] update [of1,2,...]] [[or] delete]
on 表名
[referencing {OLD [as] old / NEW [as] new}]
[for each row]
[when (condition)]
declare
begin
...
end;

示例:

-- 对学生表进行增加或者删除或删除后打印 "操作成功"
create or replace trigger trigger01
after
insert or update or delete
on student
declare
begindbms_output.put_line('操作成功');
end;

2. 触发器的类型

2.1 语句级触发器

语句级触发器关注的执行了某条语句。
示例:

-- 创建一个对学生表的增删改计数器
-- 准备表
create table t_audit_table(stablename varchar2(30),nins number,--记录添加次数nupd number,--记录修改次数ndel number,--记录删除次数startdate date,enddate date
)
-- 创建触发器
create or replace trigger trigger02
after
insert or update or delete
on student
declarev_count number(3);
begin-- 判断student在如上声明的日志表中是否有记录,如果没有,则先插入数据select count(*) into v_count from student where stablename='student';if v_count <= 0 theninsert into t_audit_table(stablename,nins,nupd,ndel) values('student',0,0,0);end if;if inserting thenupdate t_audit_table set nins=nins+1 where stablename='student';end if;if updating thenupdate t_audit_table set nupd=nupd+1 where stablename='student';end if;if deleting thenupdate t_audit_table set ndel=ndel+1 where stablename='student';end if;
end;

2.2 行级触发器

行级触发器是影响了多少行数据,行级触发器就触发多少次。

create or replace trigger trigger02
after
insert or delete or update
on student
-- 行级触发
for each row
declarev_count number(3);
begin-- 判断student在如上声明的日志表中是否有记录,如果没有,则先插入数据select count(*) into v_count from student where stablename='student';if v_count <= 0 theninsert into t_audit_table(stablename,nins,nupd,ndel) values('student',0,0,0);end if;if inserting thenupdate t_audit_table set nins=nins+1 where stablename='student';end if;if updating thenupdate t_audit_table set nupd=nupd+1 where stablename='student';end if;if deleting thenupdate t_audit_table set ndel=ndel+1 where stablename='student';end if;
end;

2.3 限制行级触发器

对部分数据做特定处理,例如:不能删除管理员。

create or replace trigger trigger03
before
delete
on student
when (old.name='admin')
declare
begindbms_output.put_line('管理员不能被删除');RAISE_APPLICATION_ERROR(-20001, '管理员不能被删除');
end;
http://www.lryc.cn/news/420724.html

相关文章:

  • GPT-5:未来已来,我们如何共舞于智能新纪元?
  • 2024年6月 青少年机器人技术等级考试理论综合试卷(五级)
  • 【Go】 HTTP编程3-路由httprouter
  • Spring Boot 整合 SA-Token 使用详解
  • 1.3 C 语言入门实战:从 Hello World 到基础语法解析
  • 一文读懂什么是Go语言goroutine
  • 计算机毕业设计 农家乐管理平台 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • Spring Boot优缺点
  • Android Studio中创建apk签名文件
  • CRC32 JAVA C#实现
  • 本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——5Webscoket节点的使用
  • 深入学习小程序第二天:事件处理与用户交互
  • 操作系统快速入门(一)
  • Spring Cloud微服务性能优化:策略、实践与未来趋势
  • 秒懂C++之多态
  • C语言:求最大数不用数组
  • 零门槛成为HelpLook推荐官,邀好友加入,奖励享不停!
  • 基于python的图书馆大数据可视化分析系统设计与实现
  • 利用formdata自动序列化和xhr上传表单到后端
  • 视频号小店大地震?还好我看了原文
  • Genymotion adb shell
  • 探索AI与社交的交汇点:看Facebook如何引领智能化革命
  • JVM 加载阶段 Class对象加载位置是在 堆中还是方法区?
  • Android 获取短信验证
  • 负载均衡详细概念介绍之(四层和七层实现)
  • 力扣 | 递增子序列 | 动态规划 | 最长递增子序列、最长递增子序列的个数、及其变式
  • 008 | 基于RNN和LSTM的贵州茅台股票开盘价预测
  • 尚硅谷谷粒商城项目笔记——六、使用navciat连接docker中的mysql容器【电脑CPU:AMD】
  • 【git】本地更改了,但又想直接从远端拉取覆盖本地(放弃本地更改前行下载)
  • 基于JSP的书店仓库管理系统