Oracle之触发器(Trigger)

目录

  • 阐述
  • 语法
  • 小结

阐述

  • Trigger触发器。理解起来其实是很容易的
  • 触发器,在声明的条件,一般来说,某个表中的数据特别重要,或是几个DB之间的数据进行互相引用和联系
  • 数据抛送、交互、备份,很多时候都会用到
  • 触发器又分为after之前触发和之后触发instead of,下面只介绍之后触发和数据的插入

语法

  • Trigger 作为数据库很强大的功能,创建一个视图如下,很多解释都标注在了创建Trigger的脚本中。
    • Trigger的创建
    CREATE OR REPLACE TRIGGER TRIGGER_GSS
   AFTER INSERT   ---当SD_GSS表中的数据发生变化的时候,这个TRIGGER 开始触发执行
   ON SD_GSS
   REFERENCING NEW AS NEW OLD AS OLD
   FOR EACH ROW
   DECLARE
   VAR_YYEAR VARCHAR2(20);--声明一个变量
   BEGIN  
   SELECT YYEAR INTO VAR_YYEAR FROM SD_GSS WHERE YYEAR = :NEW.YYEAR;
   IF YYEAR='2017' THEN
   INSERT INTO   SD_GSS2 SELECT *FROM   SD_GSS  
   END IF;
    EXCEPTION
    --这边触发器异常时执行的,很多情况下是往一个表中插入记录,可以用异常抛送的方式做成短信通知或者是邮件通知
    --这块自己有做过微信提醒和邮件提醒
   END;
  • Trigger这个触发器就创建完成,他的大概意思就是,当SD_GSS中的数据发生变化, 且满足当前变量的条件时
  • 会往SD_GSS2 中插入一笔数据
  • 实际写SQL的时候,如下SQL会存在很大的风险,当SD_GSS2 或者是SD_GSS 的表结构发生变化的时候,这个Trigger就会一直跳到EXCEPTION那里出现异常
 INSERT INTO   SD_GSS2 SELECT *FROM   SD_GSS 
  • REFERENCING NEW AS NEW OLD AS OLD解释

  • For each row的意义是:在一次操作表的语句中,每操作成功一行就会触发一次;不写的话,表示是表级触发器,则无论操作多少行,都只触发一次

  • REFERENCING OLD 和 REFERENCING NEW 的含义不同,具体取决于触发器是行级还是语句级触发器。对于行级触发器,REFERENCING OLD 子句允许引用更新或删除之前行中的值,REFERENCING NEW 子句允许引用已插入或更新的值。在 BEFORE 和 AFTER 触发器中可以引用 OLD 和 NEW 行。REFERENCING NEW 子句允许在插入或更新操作发生之前在 BEFORE 触发器中修改新行
    *:NEW 和:OLD使用方法和意义,new 只出现在insert和update时,old只出现在update和delete时。在insert时new表示新插入的行数据,update时new表示要替换的新数据、old表示要被更改的原来的数据行,delete时old表示要被删除的数据

  • begin前面出现的new,old不加冒号,begin和end之间出现的new和old都要在前面加上":"

  • Trigger的触发器机制在实际工作中很实用,快捷方便

  • Trigger,在Oracle中“干”掉一样东西,大部分都是用DROP 视图也是一样,删除如下

  DROP TRIGGER  TRIGGER_GSS
```SQL


### 小结
* 数据库是一门功能很强大的语言,任何一门学科都达到了一种无底洞的地步。要想品疆域之寥落,还需不断前行,攀登高峰。

### 感激
星星之火可以燎原,今日点滴的付出,是日后的苦尽甘来。莫愁前路漫漫,天下谁人不识君。感谢你阅读此文稿,也希望你能不吝赐教。推荐比较全面的个人学习网站,希望对你有帮助。

* [简书](http://www.jianshu.com/)
* [菜鸟教程](http://www.runoob.com/) 
* [开源中国](http://www.oschina.net/)
* [CSDN](http://www.csdn.net/) 
* [51CTO](http://www.51cto.com/) 
* [GitHub](https://github.com/)
* [StackOverFlow](http://stackoverflow.com/)


##关于作者

```javascript
  var normalChild = {
    nickName  : "墨客码",
    site : "http://www.cnblogs.com/gss0525/"
    descTarget : ".net后台开发者,热衷分享技术,心怀感恩,深耕不缀。"
  }
posted @ 2017-08-19 06:50  工业互联开发百科  阅读(666)  评论(1编辑  收藏  举报