--触发器

触发器有三类:
 数据操作触发器
    用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. Floatingip

    浮动IP相关功能点: 模块 功能 描述 备注 FloatingIP 创建浮动IP 指定带宽大小创建单个/多个浮动IP   指定子网.指定IP创建浮动IP   绑定浮动IP,修改带宽 绑定浮动IP到指定 ...

  2. 官方文档 恢复备份指南五 Configuring the RMAN Environment

    本章内容: Configuring the Environment for RMAN Backups    配置RMAN环境 Configuring RMAN to Make Backups to a ...

  3. linux备忘录-系统服务daemon

    服务(daemon)及其分类 Linux中的服务被称为daemon(daemon是守护神,恶鬼的意思哦).这些daemon会常驻在内存当中,从而对我们的系统和任务等进行一些辅助性的工作.实际上,dae ...

  4. Uva 12627 Erratic Expansion(递归)

    这道题大体意思是利用一种递归规则生成不同的气球,问在某两行之间有多少个红气球. 我拿到这个题,一开始想的是递归求解,但在如何递归求解的思路上我的方法是错误的.在研读了例题上给出的提示后豁然开朗(顺便吐 ...

  5. C语言单元测试

    转自http://blog.csdn.net/colin719/article/details/1420583 对于敏捷开发来说,单元测试必不可少,对于Java开发来说,JUnit非常好,对于C++开 ...

  6. 深入理解Java Web——Servlet

    1.概述 狭义上看,是java的一个接口. 广义上看,任何直接或间接实现了Servlet接口的类. 2.核心对象 下面就是Servlet接口的内容: public abstract interface ...

  7. linux系统基础文件属性

    记录用户登录前显示的信息 cat /etc/issue vim  /etc/motd    设置登录提醒 隐藏执行命令的历史记录用history –d  加上历史记录行号 如history -d 38 ...

  8. 【bzoj2326】[HNOI2011]数学作业 矩阵乘法

    题目描述 题解 矩阵乘法 考虑把相同位数的数放到一起处理: 设有$k$位的数为$[l,r]$,那么枚举从大到小的第$i$个数(即枚举$r-i+1$),考虑其对$Concatenate(l..r)$的贡 ...

  9. VisualStudio2010项目转换为VisualStudio2005项目:解决方案和工程项目文件转换方法(2)

    因为我现在不喜欢把一篇博客写的很长很长,这篇博客是接着上一篇博客来写的.上一篇文章我很详细的说明了修改项目文件解决方案的过程.这篇文章我就说说项目中的项目文件该怎么修改.因为我平日里主要做的是ASP. ...

  10. BZOJ4584 APIO2016赛艇(动态规划+组合数学)

    如果值域不大,容易想到设f[i][j]为第i个学校选了j的方案数,枚举上一个学校是哪个选了啥即可,可以前缀和优化.于是考虑离散化,由于离散化后相同的数可能可以取不同的值,所以枚举第一个和其所选数(离散 ...