`

Oracle触发器

 
阅读更多

1、触发器的定义?
触发器是在触发一定事件的时候隐式执行的一段sql语句,触发器不能接收参数。其中oracle事件指的是对数据库进行insert、update、delete操作或对视图进行类似的操作,还有一些系统的事件,比如数据库的关闭或开启。
2、触发器的分类?
(1)、数据操纵语言(DML)触发器:创建在表上,有DML时间来触发的触发器;
(2)、替代(instead of)触发器:创建在视图上,用来替换对视图进行添加、修改和删除操作。
(3)、数据定义语言(DDL)触发器:定义在模式上,触发事件是对数据库对象的创建和修改操作。
(4)、数据库系统触发器:定义在整个数据库上,触发的时间是数据库的操作,比如数据库的启动和关闭。
3、触发器的组成?
(1)、触发的事件:即在何种情况下触发trigger,例如:insert、update、delete。
(2)、触发的时间:即该trigger是在触发事件之前(before)还是在触发事件之后(after),也就是触发的事件和该trigger主体的先后顺序。
(3)、触发器本身:即触发器在触发事件的时候要执行的操作,例如:pl/sql块。
(4)、触发的频率:说明该触发器内定义的动作被执行的次数。即语句级触发器和行级触发器。语句级触发器是指当某个事件发生时,该触发器只执行一次。而行级触发器,在某个事件发生时,对受到该操作影响的每一行数据,都会单独执行一次触发器。

创建表:

--创建表
--员工表
CREATE TABLE emp(  
        emp_ID NUMBER(10) PRIMARY KEY,  
        emp_name VARCHAR2(20) NOT NULL,  
        emp_sex VARCHAR2(10),  
        emp_address VARCHAR2(15)  
); 
--日志表
CREATE TABLE logs(  
        LOG_ID NUMBER(10) PRIMARY KEY,  
        LOG_TABLE VARCHAR2(10) NOT NULL,  
        LOG_DML VARCHAR2(10),  
        LOG_KEY_ID NUMBER(10),  
        LOG_DATE DATE,  
        LOG_USER VARCHAR2(15)  
); 
--创建序列
CREATE SEQUENCE logs_id_squ INCREMENT BY 1   
            START WITH 1 MAXVALUE 9999999 NOCYCLE NOCACHE;  
CREATE SEQUENCE emp_id_squ INCREMENT BY 1   
            START WITH 1 MAXVALUE 9999999 NOCYCLE NOCACHE;  

 一、创建DML触发器:

--创建触发器:当添加一条员工信息的时候,同事添加一条日志信息
create or replace trigger add_trigger
after insert on emp
for each row
begin
    insert into logs values(logs_id_squ.nextval,'emp','insert',:new.emp_id,sysdate,'zxf');
end;

--行级触发器,如果修改的行的条数有10条,那么也将触发10次行级触发器,也就会插入10条日志记录
create or replace trigger edit_trigger
after update of emp_name on emp
for each row
begin
   insert into logs values(logs_id_squ.nextval,'emp','update',:old.emp_id,sysdate,'zxf');
end;
update emp e set e.emp_name='zxf_noimp' where e.emp_name='zxf_noimp1'
--禁用触发器
alter trigger edit_trigger disable 

--语句级触发器,如果修改的行数有10条,只会触发一次事件
create or replace trigger edit2_trigger
after update of emp_name on emp
begin
   insert into logs values(logs_id_squ.nextval,'emp','update',0,sysdate,'语句触发器');
end;

--使用when子句
create or replace trigger edit3_trigger
after delete on emp
for each row --行级触发器
when (old.emp_id=3)
begin
   insert into logs values(logs_id_squ.nextval,'emp','delete',:old.emp_id,sysdate,'zxf');
end;

 二、创建instead of 触发器:只能对视图建立instead of触发器,不能对表、模式和数据库建立instead of触发器。

--创建视图
create or replace view emp_view as
select * from emp e left join logs l on l.log_key_id=e.emp_id
--查询视图
select * from emp_view
--删除视图中的一条记录,此时会报错
delete emp_view e  where e.emp_id=2

--创建instead of触发器
create or replace trigger instead_del_trigger 
instead of delete on emp_view
for each row
begin
  delete emp e where e.emp_id = :old.emp_id;
end;
--再执行,就没有错误了
delete emp_view e  where e.emp_id=2

 三、创建DDL触发器:

--系统触发器
create or replace trigger drop_table_trigger
after drop on database
begin
      insert into logs values(logs_id_squ.nextval,'emp','drop',0,sysdate,'zxf');
end;

 四、创建数据库系统触发器:

--系统触发器:数据库启动的时候触发
create or replace trigger drop_table_trigger
after startup on database
begin
      insert into logs values(logs_id_squ.nextval,'emp','drop',0,sysdate,'zxf');
end;
--数据库关闭的时候触发
create or replace trigger drop_table_trigger
before shutdown on database
begin
      insert into logs values(logs_id_squ.nextval,'emp','drop',0,sysdate,'zxf');
end;
 

其中:for each row说明触发器为行级触发器。行级触发器和语句级触发器的区别在于:行级触发器要求当一个DML语句操作影响数据库中的多行数据时,对于其中的每行数据,只要他们符合触发约束条件,均激活一次触发;而语句级触发器将整个语句操作作为一个触发事件,当它符合约束条件时,只激发一次触发器操作。当省略for each row语句时,before和after触发器为语句级触发器,而instead of为行级触发器。

4、触发器的限制?

(1)、create trigger 语句的字符长度不能超多32kb;

(2)、触发器体内的select语句只能为select .....into .....结构,或者为定义游标所使用的select语句;

(3)、触发器中不能使用数据库事务控制语句,如:commit、rollback、savepoint语句;

(4)、由触发器调用的过程或函数也不能使用数据库事务控制语句;

(5)、触发器中不能使用lang、lang row类型;

(6)、触发器可以参照lob类型类的列值,但不能通过:new 来修改lob列中的值;

(6)、触发器所涉及的表收到表约束的限制

分享到:
评论

相关推荐

    调试oracle触发器方法

    调试Oracle触发器是开发和维护数据库应用程序时的重要步骤,可以帮助我们找出潜在的错误和逻辑问题。下面我们将详细探讨如何调试Oracle触发器。 1. **PL/SQL Developer工具调试**: - PL/SQL Developer是一款强大...

    oracle 触发器实时调用java 中http接口

    总之,"Oracle触发器实时调用Java中HTTP接口"是一个数据库与应用程序实时通信的示例,涉及Oracle的触发器、存储过程和UTL_HTTP包,以及Java HTTP服务器的设计和实现。这样的设计需要对Oracle PL/SQL和Java网络编程有...

    关于oracle触发器before和after的应用问题

    ### Oracle触发器Before和After应用详解 #### 引言 Oracle数据库系统中,触发器是一项核心功能,用于响应特定事件的自动执行代码块。本文旨在深入解析Oracle触发器中的Before和After两种触发时机,以及它们在...

    Oracle触发器语法详解

    "Oracle触发器语法详解" Oracle 触发器是一种特殊的存储过程,它在插入、删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。触发器可以基于数据库的值使用户具有操作...

    个人亲测oracle触发器调用java程序

    Oracle触发器调用Java程序 Oracle触发器是Oracle数据库中的一种机制,可以在数据库中执行特定的操作。在本文中,我们将介绍如何使用Oracle触发器调用Java程序。 一、加载Java程序 首先,我们需要将Java程序加载到...

    Oracle触发器与存储过程高级编程-第3版itpub.rar

    《Oracle触发器与存储过程高级编程》第3版是一本深入探讨Oracle数据库中触发器和存储过程技术的专业书籍。在Oracle数据库系统中,触发器和存储过程是数据库管理员和开发人员进行复杂业务逻辑处理和数据管理的重要...

    oracle触发器的创建与使用

    【Oracle触发器的创建与使用】是数据库管理中不可或缺的一部分,尤其在Oracle数据库系统中,触发器扮演着关键角色。触发器是一种存储过程,当特定的数据库事件发生时(如INSERT、UPDATE或DELETE操作),它会被自动...

    Oracle触发器实验报告

    Oracle触发器是数据库管理系统中的一种特殊程序,它与数据库表的操作紧密相关,可以在特定的数据操作事件(如INSERT、UPDATE或DELETE)发生时自动执行。在本实验报告中,主要涉及了Oracle触发器与参照完整性约束的...

    Oracle触发器 实例讲解

    Oracle 触发器实例讲解 Oracle 触发器是一种特定事件出现的时候,自动执行的代码块。类似于存储过程,但是用户不能直接调用他们。它主要有以下几个功能: 1. 允许/限制对表的修改:触发器可以控制对表的修改操作,...

    Oracle触发器备份表数据

    在深入探讨如何利用Oracle触发器备份表数据之前,我们首先需要理解几个关键概念:Oracle数据库、触发器以及备份策略。Oracle数据库是全球领先的数据库管理系统之一,以其强大的性能、可靠的安全性和丰富的功能受到...

    Oracle触发器修改自身表

    1、行级触发器不支持 update 、select 、delete 对自身表的操作。 2、表级触发器 不支持 :new 和 :old对象 所以想要触发器对自身表数据做修该,则用行级触发器得到 :new 和 :old对象中的相关数据,然后将这样的数据...

    oracle触发器功能介绍

    Oracle触发器是数据库对象之一,它在特定的数据库操作(如INSERT、UPDATE或DELETE)发生时自动执行。触发器主要用于实现复杂的业务规则和数据验证,它们可以扩展SQL的功能,允许在数据修改前后执行一系列的动作。...

    oracle触发器调用存储过程

    "Oracle触发器调用存储过程" Oracle触发器可以调用存储过程,以实现业务逻辑的自动化执行。然而,在触发器中调用存储过程时,需要注意事务的隔离性,以避免出现锁定和死锁的问题。Oracle自治事务(Autonomous ...

    oracle_触发器的种类和触发事件

    "oracle触发器的种类和触发事件" Oracle触发器是一种特殊的存储过程,它可以在数据库中自动执行一些操作,主要用于实现数据的完整性、数据的安全性和业务逻辑的实现。触发器可以分为四种类型:DML触发器、DDL触发器...

    oracle触发器语法要点

    ### Oracle触发器语法要点 #### 一、触发器概述 Oracle触发器是一种存储过程,它在特定的数据库事件(如INSERT、UPDATE或DELETE)发生时自动执行。触发器可以用于实施复杂的业务规则、数据完整性检查或者自动生成...

    oracle触发器执行顺序.pdf

    Oracle触发器可以响应数据表的DML(数据操纵语言)事件,如INSERT、UPDATE或DELETE,也可以响应DDL(数据定义语言)事件,如CREATE、ALTER或DROP等。在本文件中,主要讨论的是针对数据表UPDATE操作的触发器执行顺序...

    oracle触发器与存储过程高级编程

    本节将深入探讨“Oracle触发器与存储过程高级编程”的相关知识。 **触发器(Triggers)** 触发器是一种数据库对象,它在特定的数据库事件(如INSERT、UPDATE或DELETE)发生时自动执行。通过定义触发器,我们可以...

    oracle触发器

    ### Oracle触发器详解 在Oracle数据库管理中,触发器是一种非常强大的工具,它允许你在特定的数据库事件(如数据插入、更新或删除)发生时自动执行预定义的SQL语句或PL/SQL代码块。这使得数据库能够在无需外部程序...

    Oracle触发器里调用Java程序

    本篇文章将探讨如何在Oracle触发器中调用Java程序,以扩展数据库的功能并利用Java丰富的库资源。 首先,我们需要了解Oracle的PL/SQL(Procedural Language/Structured Query Language)语言,它是Oracle数据库内置...

    Oracle触发器与存储过程高级编程

    在深入探讨《Oracle触发器与存储过程高级编程》这一主题之前,我们首先应当明确Oracle数据库在企业级应用中的核心地位。Oracle数据库以其强大的数据处理能力、高可用性和安全性,成为众多大型企业和组织首选的数据...

Global site tag (gtag.js) - Google Analytics