文档章节

聊聊oracle(四)触发器

你我他有个梦
 你我他有个梦
发布于 2015/12/18 23:03
字数 602
阅读 23
收藏 0

--触发器
--执行顺序:前语句触发->前行级触发->后行级触发->后语句触发
--instead of 类型的触发器主要解决视图的不可更新问题,比如多表关联或者group by语句 的,或者通过函数生成的复杂视图不可更新

CREATE TRIGGER tri_del
AFTER DELETE
ON jobs
BEGIN
IF deleting THEN
   dbms_output.put_line('删除数据操作!');
END IF;
END;


 

SELECT * FROM user_source WHERE NAME='TRI_DEL' ORDER BY line;

SELECT * FROM log_tab;
--创建序列
CREATE SEQUENCE log_tab_id
MINVALUE 100000000
MAXVALUE 999999999
START WITH 100000000
INCREMENT BY 1


--创建触发器,如果向表jobs中插入数据,就向日志表中进行记录

CREATE TRIGGER job_oper_tri
BEFORE INSERT
ON jobs
FOR EACH ROW--表示行级触发,没插入一行记录就触发一次
BEGIN
   IF inserting THEN
      INSERT INTO log_tab VALUES(
      log_tab_id.nextval,
      'jobs',
      'insert',
      :new.job_id,
      SYSDATE
   );
   dbms_output.put_line('插入数据的主键:'||:new.job_id);
   END IF;  
END;


--下面两条语句是针对上述两个触发器进行测试的语句

INSERT INTO jobs VALUES('123','ceshi','1000','2000');
UPDATE jobs SET job_title='update' WHERE job_id='123';
DELETE FROM jobs WHERE job_id='123';


---使用多种触发事件,:new和:old表示在行级触发中来访问变更前后的数据

CREATE TRIGGER job_oper
BEFORE INSERT OR UPDATE OR DELETE
ON jobs
FOR EACH ROW--表示行级触发,没插入一行记录就触发一次
BEGIN
  CASE
   WHEN inserting THEN
      INSERT INTO log_tab VALUES(
      log_tab_id.nextval,
      'jobs',
      'insert',
      :new.job_id,
      SYSDATE
   );
    dbms_output.put_line('插入数据的主键:'||:new.job_id);
   WHEN updating THEN
      INSERT INTO log_tab VALUES(
      log_tab_id.nextval,
      'jobs',
      'insert',
      :new.job_id,
      SYSDATE
   );
    dbms_output.put_line('修改数据的主键:'||:old.job_id);
   WHEN deleting THEN
      INSERT INTO log_tab VALUES(
      log_tab_id.nextval,
      'jobs',
      'insert',
      :new.job_id,
      SYSDATE
   );
   dbms_output.put_line('删除数据的主键:'||:old.job_id);
   END CASE;  
END;

SELECT * FROM jobs;


--触发器中使用if语句

CREATE TRIGGER job_if
BEFORE UPDATE OF MIN_SALARY ON jobs
FOR EACH ROW
BEGIN

IF(TO_CHAR(SYSDATE,'dd')=27 AND OLD:MIN_SALARY>2000)THEN
raise_application_error(-20000,'今天是27号,不允许修改最低工资2000以上的数据!');
  INSERT INTO log_tab VALUES(
      log_tab_id.nextval,
      'jobs',
      'insert',
      :new.job_id,
      SYSDATE
   );
   END IF;
dbms_output.put_line('数据修改完成,主键是:'||:old.job_id);
END;



--触发器也可以进行级联修改,再操作中可以更新,插入,删除操作同时做


--DDL触发器

CREATE TRIGGER job_ddl
BEFORE CREATE OR UPDATE OR DROP OR RENAME ON schema
BEGIN
  IF sysevent ='create' THEN
    dbms_output.put_line(dictionary_obj_name||'创建中...');
  elseif sysevent ='drop' THEN
    IF dictionary_obj_name='TEST' THEN
    raise_application_error(-20000,'不允许删除表');
    END IF;
  elseif sysevent='alter' THEN
    raise_application_error(-20000,'不允许修改表');
  END IF;
END;




--系统触发器,级别是数据库级别,该触发器用于记录每个用户登陆的时间

CREATE TRIGGER logon_tgr
AFTER
LOGIN
ON
DATABASE
BEGIN
  INSERT INTO log_user VALUES(log_tab_id.nextval,sys.login_user,SYSDATE);
END;

 

© 著作权归作者所有

你我他有个梦

你我他有个梦

粉丝 95
博文 110
码字总数 98858
作品 0
昌平
程序员
私信 提问
oracle pl/sql之触发器(trigger)

一.oracle触发器介绍 触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时...

ZIJIAN1012
2014/04/21
0
0
Oracle 触发器

Oracle触发器 一、定义: 在触发事件发生时隐式自动运行的(PL/SQL)程序块。触发器不能接收参数,不能被别的程序、函数等调用。 二、构成: 触发器名称 触发器的触发事件 触发器的限制条件 触...

一别经年
2016/05/15
17
0
Oracle笔记 目录索引

Oracle笔记 一、oracle的安装、sqlplus的使用 Oracle笔记 二、常用dba命令行 Oracle笔记 三、function 、selectOracle笔记 四、增删改、事务 Oracle笔记 五、创建表、约束、视图、索引、序列...

ibm_hoojo
2011/05/03
0
0
Oracle 笔记(九)、触发器

1、触发器一旦创建就会立刻生效,有时可能需要临时禁用触发器,最常见的原因就是涉及数据加载。 ALTER TRIGGER trigger_name [ENABLE | DISABLE]; 2、Oracle 触发器里两个重要的内存逻辑表 ...

qvodnet
2018/06/27
0
0
Oracle的NUMBER数据类型

一、NUMBER (precision, scale) 1、precision表示数字中的有效位;如果没有指定precision的话,Oracle将使用38作为精度。 2、如果scale大于零,表示数字精确到小数点右边的位数;scale默认...

HarleyZhuge
2018/02/28
4
0

没有更多内容

加载失败,请刷新页面

加载更多

Angular 英雄编辑器

应用程序现在有了基本的标题。 接下来你要创建一个新的组件来显示英雄信息并且把这个组件放到应用程序的外壳里去。 创建英雄组件 使用 Angular CLI 创建一个名为 heroes 的新组件。 ng gener...

honeymoose
3分钟前
0
0
Kernel DMA

为什么会有DMA(直接内存访问)?我们知道通常情况下,内存数据跟外设之间的通信是通过cpu来传递的。cpu运行io指令将数据从内存拷贝到外设的io端口,或者从外设的io端口拷贝到内存。由于外设...

yepanl
今天
3
0
hive

一、hive的定义: Hive是一个SQL解析引擎,将SQL语句转译成MR Job,然后再在Hadoop平台上运行,达到快速开发的目的 Hive中的表是纯逻辑表,就只是表的定义,即表的元数据。本质就是Hadoop的目...

霉男纸
今天
3
0
二、Spring Cloud—Eureka(Greenwich.SR1)

注:本系列文章所用工具及版本如下:开发工具(IDEA 2018.3.5),Spring Boot(2.1.3.RELEASE),Spring Cloud(Greenwich.SR1),Maven(3.6.0),JDK(1.8) Eureka: Eureka是Netflix开发...

倪伟伟
昨天
9
0
eclipse常用插件

amaterasUML https://takezoe.github.io/amateras-update-site/ https://github.com/takezoe/amateras-modeler modelGoon https://www.cnblogs.com/aademeng/articles/6890266.html......

大头鬼_yc
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部