PL/SQL 07 触发器 trigger
--触发器
触发器有三类:
数据操作触发器
用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;
PL/SQL 07 触发器 trigger的更多相关文章
- Oracle数据库编程:使用PL/SQL编写触发器
8.使用PL/SQL编写触发器: 触发器存放在数据缓冲区中. 触发器加序列能够实现自动增长. 在触发器中不能使用connit和rollback. DML触发器 ...
- PL/SQL之--触发器
一.简介 触发器在数据库里以独立的对象进行存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来触发运行.oracle事件指的是对数据库的表或视图进行的inse ...
- ORACLE PL/SQL:触发器
ORACLE PL/SQL 触发器 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8 ...
- 开发PL/SQL子程序和包及使用PL/SQL编写触发器、在JDBC中应用Oracle
1. 子程序的各个部分: 声明部分.可执行部分.异常处理部分(可选) 2.子程序的分类: A. 过程 - 执行某些操作 a. 创建过程的语法: CREATE [OR REPLACE] PROC ...
- 【PL/SQL】触发器示例:记录加薪
首先创建一张表,用于保存薪资变化情况: --创建加薪记录表 CREATE TABLE scott.raisedsalarylog ( empno ) NOT NULL PRIMARY KEY, --员 ...
- 全面对比T-SQL与PL/SQL
1)数据类型 TSQL PL/SQL numeric(p,s) numeric(p,s) or NUMBER(p,s) decimal(p,s) decimal(p,s) or NUMBER(p,s) ...
- PL/SQL详细介绍,设置oracle相关
1. 实现参照完整性 指若两个表之间具有主从关系(即主外键关系),当删除主表数据时,必须确保相关的从表数据已经被删除. 当修改主表的主键列数据时,必须确保相关从表数据已经被修改.为了实现级 ...
- PL/SQL -->隐式游标(SQL%FOUND)
PL/SQL -->隐式游标(SQL%FOUND) 分类: SQL/PLSQL 基础2010-12-22 16:23 4084人阅读 评论(0) 收藏 举报 sqlexceptionoracle ...
- oracle PL/SQL(procedure language/SQL)程序设计之触发器(trigger)
创建触发器 触发器类似于过程和函数,都拥有声明.执行和异常处理过程的带名PL/SQL块.与包类似,触发器必须存储在数据库中.前面已经讲过,过程是显式地通过过程调用执行的,同时过程调用可以传递参数.与之 ...
随机推荐
- python 基础篇 06 编码 以及小知识点补充
本节主要内容: 1. is和==的区别2. 编码的问题 ⼀. is和==的区别1. id()通过id()我们可以查看到⼀个变量表⽰的值在内存中的地址 注 ----<<<在pytho ...
- 九度OJ--Q1166
import java.text.DecimalFormat;import java.util.Scanner; /* * 题目描述: * 立方根的逼近迭代方程是 y(n+1) = y(n)*2/3 ...
- [Linux] 服务器镜像定时备份解决方案 crontab+rsync+flock
两台服务器定时同步文件解决方案: 环境: 主机:192.168.1.1 镜像机:192.168.1.2 需要将主机内容备份至镜像机(假设用户都为root) 备份内容为 /export 目录下所有内容至 ...
- 传输控制层协议TCP概述---抄书
1.TCP的主要特点 TCP是TCP/IP体系中非常复杂的一个协议.下面介绍TCP的最主要的特点. (1)TCP是面向连接的运输层协议.也就是说,应用程序在使用TCP协议之前,必须先建立TCP连接.在 ...
- 多文件上传 input 的multiple 属性
一.上传多张图片并且预览 HTML: <div class="container"> <label>请选择一个图像文件:</label> < ...
- 配置Android应用开发环境
详解JRE.JDK.SDK.ADT请点击辨析ADK&JVM&JRE&JDK&ADT 一.安装JDK 开发 Android应用程序的时候,仅有Java运行环境(Java ...
- 软件工程项目组Z.XML会议记录 2013/10/22
软件工程项目组Z.XML会议记录 [例会时间]2013年10月22日星期二21:00-22:30 [例会形式]小组讨论 [例会地点]三号公寓楼会客厅 [例会主持]李孟 [会议记录]周敏轩 会议整体流程 ...
- Spring Boot(一)入门篇
SpringBoot概述 Spring Boot的诞生简化了Spring应用开发,SpringBoot提供对Spring容器.第三方插件等很多服务的管理.对于大部分Spring应用,无论是简单的web ...
- sendto函数的坑
测试unix数据报套接字时,一个程序收,一个程序发,分别绑定自己的socket.结果在收的部分,返回的发送方的地址总是空的,但是返回的地址长度又是对的. ) { bzero(&clientad ...
- 【NOIP2017 D1 T1 小凯的疑惑】
题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小 凯想知道在无法准确支付的物品中,最贵的 ...