--触发器

触发器有三类:
 数据操作触发器
    用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的更多相关文章

  1. Oracle数据库编程:使用PL/SQL编写触发器

    8.使用PL/SQL编写触发器: 触发器存放在数据缓冲区中.        触发器加序列能够实现自动增长.        在触发器中不能使用connit和rollback.        DML触发器 ...

  2. PL/SQL之--触发器

    一.简介 触发器在数据库里以独立的对象进行存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来触发运行.oracle事件指的是对数据库的表或视图进行的inse ...

  3. ORACLE PL/SQL:触发器

    ORACLE PL/SQL 触发器 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8 ...

  4. 开发PL/SQL子程序和包及使用PL/SQL编写触发器、在JDBC中应用Oracle

    1.  子程序的各个部分: 声明部分.可执行部分.异常处理部分(可选) 2.子程序的分类: A.  过程 - 执行某些操作 a.  创建过程的语法: CREATE [OR REPLACE]  PROC ...

  5. 【PL/SQL】触发器示例:记录加薪

    首先创建一张表,用于保存薪资变化情况: --创建加薪记录表 CREATE TABLE scott.raisedsalarylog ( empno ) NOT NULL PRIMARY KEY, --员 ...

  6. 全面对比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) ...

  7. PL/SQL详细介绍,设置oracle相关

    1. 实现参照完整性      指若两个表之间具有主从关系(即主外键关系),当删除主表数据时,必须确保相关的从表数据已经被删除.  当修改主表的主键列数据时,必须确保相关从表数据已经被修改.为了实现级 ...

  8. PL/SQL -->隐式游标(SQL%FOUND)

    PL/SQL -->隐式游标(SQL%FOUND) 分类: SQL/PLSQL 基础2010-12-22 16:23 4084人阅读 评论(0) 收藏 举报 sqlexceptionoracle ...

  9. oracle PL/SQL(procedure language/SQL)程序设计之触发器(trigger)

    创建触发器 触发器类似于过程和函数,都拥有声明.执行和异常处理过程的带名PL/SQL块.与包类似,触发器必须存储在数据库中.前面已经讲过,过程是显式地通过过程调用执行的,同时过程调用可以传递参数.与之 ...

随机推荐

  1. [spring+tomcat]启动时报错:NoSuchMethodError: javax.servlet.http.HttpServletResponse.getStatus()I

    一般来讲问题的原因为tomcat版本较低, 建议升级到tomcat7x 以上版本

  2. TensorFlow 同时调用多个预训练好的模型

    在某些任务中,我们需要针对不同的情况训练多个不同的神经网络模型,这时候,在测试阶段,我们就需要调用多个预训练好的模型分别来进行预测. 调用单个预训练好的模型请点击此处 弄明白了如何调用单个模型,其实调 ...

  3. Mac上利用Aria2加速百度网盘下载

    百度网盘下载东西的速度那叫一个慢,特别是大文件,看着所需时间几个小时以上,让人很不舒服,本文记录自己在mac上利用工具Aria2加速的教程,windows下思路也是一样! 科普(可以不看) 这里顺带科 ...

  4. const在c/c++中的区别

    #include <iostream> using namespace std; int main() { ; ; }; ; i < sizeof array / sizeof *a ...

  5. PE文件格式介绍

    Useful Tools: 1. WDK安装目录下搜下depends.exe,这个工具可以查看.exe文件依赖的.dll,以及用到的dll中的api. 2.PE文件格式分析器: 有很多的PE格式分析器 ...

  6. perf原理再看

    vim ./arch/x86/kernel/hw_breakpoint.c perf如何控制采样的频率 perf采样不同的事件,得到的不是一样 cycles: 向PMU中增加不同的函数,增加不同 使用 ...

  7. 前端工程师必须要知道的SEO技巧(2):制作比设计还要漂亮的代码(内容和语义化代码)实现下

    提醒自己:上一篇文章属于纯理论的文章,我自己有的部分之从网上摘抄的,我自己也是不理解的.或许过一段日子我就能全明白了.我自己还是喜欢实战,做几个例子就明白了. 怎么做让自己网页的标签来实现语义化,我直 ...

  8. [洛谷P3743]kotori的设备

    题目大意:ことり有$n$个设备,每个设备每秒共减少$a_i$能量(也就是说每一瞬间都在减少,而不是在一个时刻突然减少),开始前有$b_i$能量,ことり还有一个充电宝,无限能量,每秒共可以提供$p$的能 ...

  9. Flash by sshockwave [树dp]

    题目 给定一棵树,每个点有一个活动时间,长度为正整数$t_i$ 你需要安排每个点的活动时间什么时候开始什么时候结束,并且满足:任何一个时刻没有两个相邻的点都在活动 开始时刻为0,在以上条件下最小化所有 ...

  10. cf 442 D. Olya and Energy Drinks

    cf 442 D. Olya and Energy Drinks(bfs) 题意: 给一张\(n \times m(n <= 1000,m <= 1000)\)的地图 给出一个起点和终点, ...