--触发器
触发器有三类:
数据操作触发器
用before触发器进行数据校验
用after触发器进行级联操作
语句触发器限制数据的操作和记录操作日志
instead of 触发器(只针对视图不允许DML操作时)
数据定义触发器
监视数据库中用户的一些重要操作
系统触发器
--触发器的限制
不应该使用事务控制语句
COMMIT, ROLLBACK, SAVEPOINT
由触发器调用的任何过程与函数都不能使用事务控制语句
不能声明任何LONG或LONG RAW变量
可以访问的表有限
变化表
被DML语句正在修改的表,亦即定义触发器的表
限制表
有些表在创建的时候就带有参考完整性限制的声明
主键与外键
触发器主体中的限制
不可以读取或修改任何变化表
不可以读取或修改限制表的主键,唯一值列,外键列
--数据操作触发器
create or replace trigger 触发器名字
before/after insert/update/delete
on 表名/视图名
for each row
declare
变量定义;
begin
代码;
end;
--for each row为行级触发器,去掉为语句级触发器
:new.字段 数据操作后的内容
:old.字段 数据操作前的内容
--禁止向t_score表中添加微机原理的成绩
create or replace trigger trg_insert_sco
before insert
on t_score
for each row
declare
coursename t_course.coursename%type;
begin
select coursename
into coursename
from t_course
where courseno=:new.courseno;
if coursename='微机原理' then
raise_application_error(-20001,'该课程已经考试结束,不能添加成绩记录');
end if;
end;
--当学生表中添加一条记录时,自动为此学生添加高等数学期中成绩,分数设为null
create or replace trigger trg_insert_stu
after insert
on t_student
for each row
begin
insert into t_score
values(:new.stuno,'期中',(select courseno
from t_course
where coursename='高等数据'),null);
end;
--语句触发器
--禁止8:00到18:00对成绩表进行操作
create or replace trigger trg_ope_sco
before insert or update or delete
on t_score
begin
if (to_char(sysdate,'hh24:mi') not between '8:00' and '18:00')
then
raise_application_error(-20004,'不能再非工作时间对t_score表进行操作');
end if;
end;
--instead of 触发器
--对于含有连接或子查询的视图,一般无法进行DML操作,可以用instead of 触发器实现
create or replace trigger 触发器名字
instead of insert/update/delete
on 视图名
for each row
declare
变量定义;
begin
代码;
end;
create or replace trigger trg_update_vw_cou_tea
instead of update
on vw_cou_tea
for each row
declare
tno t_teacher.teano%type;
begin
select teano
into tno
from t_teacher
where teaname=:new.teaname;
update t_course
set teano=tno
where coursename=:old.coursename;
end;
--数据定义语言触发器
create or replace trigger 触发器名字
before/after 用户事件
on database|schema
declare
变量定义;
begin
代码;
end;
--用户事件包括create、alter、drop、用户登录login等
--禁止用户删除数据库对象
create or replace trigger trg_drop
before drop
on schema
begin
raise_application_error(-20005,'不能删除');
end;
--触发器(OEM)
create trigger bmbtrigger
before insert or update or delete
on bmb
begin
if(to_char(sysdate,'DAY'))='SUN'
then
RAISE_APPLICATION_ERROR(-20600,'you can not update table on weekend.');
end if;
end;
create or replace trigger gzbtrigger
after insert or update or delete
on gzb
declare suminconme number
begin
select sum(income) into sumincome from gzb;
if sumincome<50000
then
raise_application_error(-20001,'收入低于2万');
end if;
end;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!