2019独角兽企业重金招聘Python工程师标准>>>

触发器可实现表间数据的一致性和完整性。当一个基表被修改时,相应的触发器会自动执行。对表数据的操作有插入、修改和删除,相应的维护数据的触发器也大致有insert、update和delete三种。

触发器的类型有三种:

(1)DML触发器:在对表进行DML操作的时候触发。

(2)替代触发器:由于在Oracle中不能直接对有两个以上表建立的视图进行DML操作,所以给出了替代触发器,它是Oracle专门为进行视图操作的一种处理方法。

(3)系统触发器:它可以在Oracle数据库系统的事件中进行触发,如数据库的开启和关闭。

触发器中的关键词:

触发器中有两个非常重要的关键词,一个是old,一个是new,old用于修饰操作完成前的值,new用于修饰完成后的值,可以代表一行。此外,只有行级的触发器才能使用这两个关键字。

一、利用SQL语句创建触发器

1、利用SQL创建触发器的语法格式:

create [or replace] trigger [schema.]trigger_name{before | after | instead of}{delete [or insert][or update [of column,...n]]}on [schema.]table_name | view_name[for each row [when(condition)]]sql_statement[,...n]

其中,before:触发器在操作前执行;after:触发器在操作后执行;instead of:指定创建替代触发器。

delte、insert、update:指定触发事件,多个事件间用or连接。

of Column:指定在哪些列上执行update触发。

for each row:表示该触发器是行级的,只有行级的触发器才能使用old和new关键字。

示例代码:

create or replace trigger moduleInsertTrigger after inserton t_modulebegindbms_output.put_line('The Name is: ' || :new.name);end;

2、创建触发器的限制

(1)触发器代码大小必须小于32KB

(2)触发器中有效语句可以包括DML语句,但不能包括DDL语句;rollback、commit、savepoint也不能使用。但是,对于系统触发器可以使用create、alter、drop table和alter...compile语句。

(3)long、long raw和lob的限制:

a.不能插入数据到long或long raw

b.来自long或long raw的数据可以转换成字符型,但是不能超过32KB

c.使用long或long raw不能声明变量

d.在long或long raw列中不能使用:new和:parent

e.在lob中的:new变量不能修改

(4)引用包变量的限制:如果update或delete语句检测到当前的update冲突,则Oracle会执行rollback到savepoint上并重新启动更新。

3、触发器触发顺序

(1)执行before语句的触发器

(2)执行before语句的行级触发器

(3)执行DML语句

(4)执行after语句的行级触发器

(5)执行after语句的触发器

4、创建DML触发器

触发器有单独的名字空间,所以触发器名可以与表名和过程名相同,但在同一个schema中的触发器不能重名。

假设现在这样一个表t_module(id,name),然后这里面的数据非常重要,我们希望能够保留它的删除记录,这样我们就可以给该表建立如下这样一个触发器:

create or replace trigger module_delete_trigger after deleteon t_module for each rowbegininsert into t_module_deleted values(:old.id, :old.name, current_timestamp);end;

5、创建替代触发器

由于视图有可能是由多个表进行关联而成,这种情况下,直接通过更新视图来更新基表是不可行的,这个时候我们就可以通过替代触发器来工作了。

示例代码:

/*创建视图*/create or replace view t1_t2_viewasselect t1.name t1_name, t2.name t2_name, t2.id t2_id from table1 t1 join table2 t2 on t1.id=t2.t1id;/*创建对应的更新触发器*/create or replace trigger t1_t2_view_trigger instead of updateon t1_t2_view for each rowbeginupdate table2 t2 set t2.name = :new.t2_name where id = :new.t2_id; end;

6、创建系统触发器

系统触发器是在进行数据库系统事件时进行触发,主要包括DDL语句,其语法格式如下:

create or replace trigger [schema.]trigger_name{before | after}{DDL_EVENT_LIST | database_event_list}on {database | [schema.]SCHEMA}[when_clause]trigger_body

其中,DDL_EVENT_LIST表示一个或多个DDL事件,多个事件可以用or分开;

database_event_list表示一个说多个数据库事件,多个事件中间用or分开;

database表示数据库级触发器;schema表示用户级触发器。

示例代码如下:

create or replace trigger create_triggerbefore create on schemabegininsert into table10(id, name) values (100, 'HELLO');end;

二、触发器的修改

和过程、视图一样,Oracle也提供了alter trigger语句,但是该语句只是用于重新编译现有触发器的,需要修改触发器需要使用create or replace trigger...语句。

三、触发器的删除

语法格式:

drop trigger [schema.]trigger_name.

转载于:https://my.oschina.net/NEMOCoder/blog/608959

Oracle——15触发器相关推荐

  1. Oracle Tigger触发器 实例

    Oracle Tigger触发器 实例 --实例1------------------------ --创建触发器,当用户对test表执行DML语句时,将相关信息记录到日志表 --创建测试表 CREA ...

  2. oracle 停止触发器语句,oracle触发器语句

    ORACLE中触发器的判断IF语句 加一行 NULL 即可例如:SQL> DECLARE 2 testvalue INT; 3 BEGIN 4 testvalue := 200; 5 6 IF ...

  3. oracle 创建 触发,Oracle 创建触发器

    create or replace trigger DATA_SYNC_@TABLE@ before insert or update or delete on @TABLE@ REFERENCING ...

  4. oracle中触发器的讲解

    触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行.即触发器是当某个事件发生时自动地隐式运行.并且,触发器不能接收参数. ...

  5. oracle中触发器的语法,解析Oracle触发器的语法

    导读:触发器是一种特殊的存储过程,触发器的执行不是由程序调用,也不是手工启动,而是由事件来触发,Oracle数据库是大家非常熟悉的数据库系统啦,那么Oracle触发器的语法是怎样的呢?下文中将为大家带 ...

  6. Oracle 把触发器说透

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

  7. oracle触发器比较,Oracle使用触发器和mysql中使用触发器的比较

    一.触发器 1.触发器在数据库里以独立的对象存储, 2.触发器不需要调用,它由一个事件来触发运行 3.触发器不能接收参数 --触发器的应用 举个例子:校内网.开心网.facebook,当你发一个日志, ...

  8. oracle 数据库 触发器 trigger 语法

    http://shixm.iteye.com/blog/401564 关键字: oracle 数据库 触发器 trigger 语法 语法规则: Create [or replace] trigger ...

  9. oracle 创建触发器_oracle创建触发器

    创建触发器 创建触发器的一般语法是: CREATE [OR REPLACE] TRIGGER trigger_name {BEFORE | AFTER } {INSERT | DELETE | UPD ...

最新文章

  1. opencv-3.3安装记录-ubuntu 14.04
  2. MATLAB实战系列(十九)-遗传算法解决TSP(旅行商)问题-应用及解析(文末附MATLAB源码)
  3. java中怎么找类的路径_Java中获取类加载路径和项目根路径的5种方法
  4. 字符设备驱动基础篇5——驱动如何操控硬件(动静态映射操作LED)
  5. mysql索引结构优缺点_mysql索引优缺点及注意事项
  6. 知识选择visual studio 2012 知识笔记
  7. HDU 1828:Picture(扫描线+线段树 矩形周长并)
  8. 2017.3.25 魔术球问题 思考记录
  9. java jdbc连接_CPT201 ODBC与JDBC比较
  10. 记录POJO类、DO、DTO、BO概念
  11. CAD基础+常用快捷(四)
  12. ftp服务器无法上传文件,ftp无法上传文件的原因
  13. php订阅号怎么借服务号权限,微信订阅号已经认证能否有网页授权功能
  14. Java从入门到高级(第三天)
  15. gps android 卫星位置,Android手机GPS获取卫星数量不正确问题
  16. 全差分运放阻抗匹配计算(四)
  17. linux修改X2APIC参数,虚拟机对x2apic destination mode的选择
  18. Win11硬盘怎么分区?Win11固态硬盘分区教程
  19. matlab火箭升空,火箭升空原理
  20. 树莓派一键变身无线路由器

热门文章

  1. Oracle数据库查看表空间sql语句、查看Oracle数据库表空间剩余 、修改表空间、库备份
  2. git本地ben远程分支_git 本地分支与远程分支
  3. px word 表格宽度_word怎样批量修改表格的宽度(2)
  4. fastdfs 测试客户端_Nginx+FastDFS+MacOS图片服务器的搭建
  5. BOM事件对象even
  6. php中mb substr,php中中文截取函数mb_substr()详细
  7. 全面解析虚拟内存概念
  8. 计算机基础知识关于进制,计算机基础知识-- 进制和编码
  9. 吉大19秋学期计算机应用基础在线作业,吉大16秋学期《计算机应用基础》在线作业一答案...
  10. 服务器空岛怎么修改地形,迷你世界空岛地形码是什么 空岛地形码怎么输入[多图]...