`
1140566087
  • 浏览: 555856 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
博客专栏
2c4ae07c-10c2-3bb0-a106-d91fe0a10f37
c/c++ 入门笔记
浏览量:18403
3161ba8d-c410-3ef9-871c-3e48524c5263
Android 学习笔记
浏览量:312781
Group-logo
J2ME 基础学习课程集
浏览量:18535
A98a97d4-eb03-3faf-af96-c7c28f709feb
Spring 学习过程记录...
浏览量:17466
社区版块
存档分类
最新评论

Oracle 触发器

阅读更多
SQL> set serveroutput on;
SQL> remark 触发器的特点:触发器存储在数据库中,并与所相关的表是分别存储的,触发器只能在表上进行定义。
SQL> remark 触发器的作用:自动的生成导出的列值;防止无效的事务;实施更为复杂的安全性检查;提供高级的审计;维护同步表的复制;
SQL> remark 一个触发器有如下的几个基本要素:触发源、触发时机、触发事件、触发器的限制、触发器的动作;
SQL> remark 触发器的分类:数据库触发器和DML触发器
SQL> remark 如果是每条修改的语句都触发的触发器成为行级触发器,如果一条DML无论修改多少条记录,都只会触发一次的触发器称为语句级触发器。如果对于一个DML 语句无法法直接修改的触发器会启用替代触发器(instead of)
SQL> remark 行级触发器中有两个内置的对象 new old
SQL> remark 触发器案例:
SQL> remark 首先创建一张表
SQL> create table tritest
  2  (
  3  stuid int,
  4  stuname char(5),
  5  stuindex int
  6  );

Table created.

SQL> remark 创建触发器
SQL> create or replace trigger over_tri
  2  before insert on tritest
  3  for each row
  4  begin
  5  if:new.stuindex>=30 then
  6  raise_application_error(-20001,'超出一个班的范围');
  7  end if;
  8  end;
  9  /

Trigger created.

SQL> remark 注:在条件表达式中new old 对象不需要添加 :
SQL> create or replace trigger over_tri1
  2  before insert on tritest
  3  for each row
  4  when(new.stuid<2000)
  5  begin
  6  if:new.stuindex>=30 then
  7  raise_application_error(-20001,'超出一个班的范围');
  8  end if;
  9  end;
10  /

Trigger created.

SQL> insert into tritest values(1000,'Mike',40);
insert into tritest values(1000,'Mike',40)
          *
ERROR at line 1:
ORA-20001: 超出一个班的范围
ORA-06512: at "SYSTEM.OVER_TRI1", line 3
ORA-04088: error during execution of trigger 'SYSTEM.OVER_TRI1'


SQL> remark 当插入一条值的时候触动了触发器,并抛出对应的错误;
SQL> remark 语句级的触发器是在触发的时候无论DML语句修改多少条记录,触发器的主体只会被执行一次;
SQL> create or replace trigger updateemptri
  2  before insert or update or delete
  3  on emp
  4  begin
  5  if user not in('scott') then
  6  raise_application_error(-20001,'该用户不能操作此表');
  7  end if;
  8  end;
  9  /
on emp
   *
ERROR at line 3:
ORA-00942: table or view does not exist


SQL> edit;
Wrote file afiedt.buf

  1  create or replace trigger updateemptri
  2  before insert or update or delete
  3  on scott.emp
  4  begin
  5  if user not in('scott') then
  6  raise_application_error(-20001,'该用户不能操作此表');
  7  end if;
  8* end;
SQL> /

Trigger created.

SQL> delete from scott.emp where empno=7369;
delete from scott.emp where empno=7369
                  *
ERROR at line 1:
ORA-20001: 该用户不能操作此表
ORA-06512: at "SYSTEM.UPDATEEMPTRI", line 3
ORA-04088: error during execution of trigger 'SYSTEM.UPDATEEMPTRI'


SQL> remark 替代触发器的使用:替代触发器被激发来替代执行修改视图的DML 语句;
SQL> remark 不可变更的视图如下几种情况:
SQL> remark 集合操作(union , union all , minus)
SQL> remark 分组计算函数(sum,avg...)
SQL> remark connect by 或 start with
SQL> remark 去除多行:distinct
SQL> remark 对于这些视图的DML 操作不能直接操作,而使用触发器进行转换;
SQL> remark 语法:
SQL> remark create or replace trigger 触发器名称 {before|after|instead of} 触发事件 referencing_clause [whe [when 触发条件] [for each row] begin ......end;
SQL> remark referencing_clause  用来引用正在处于修改状态下的行中的数据;
SQL> remark for each row  指定触发器是行级触发器,如果不指定那么是语句级触发器;
SQL> remark 对替代触发器进行测试:
SQL> remark 首先创建三个表进行数据测试
SQL> create table student
  2  (
  3  stuid int primary key,
  4  stuname varchar(10)
  5  )
  6  ;

Table created.

SQL> remark 创建课程表
SQL> create table subject
  2  (
  3  pid int primary key,
  4  pname varchar(10)
  5  );

Table created.

SQL> remark 创建成绩表
SQL> create table score
  2  (
  3  cid int primary key,
  4  stuid int references student,
  5  pid int references subject,
  6  computer number
  7  );

Table created.

SQL> remark 创建视图
SQL> create view stu_score
  2  as
  3  select cid,student.stuid,stuname,subject.pid,pname,computer
  4  from score , student,subject
  5  where score.stuid = student.stuid and score.pid = subject.pid;

View created.

SQL> remark 插入测试数据
SQL> insert into student values(1,'Tom');

1 row created.

SQL> insert into student values(2,'Tom2');

1 row created.

SQL> insert into student values(3,'Tom3');

1 row created.

SQL> insert into subject values(10,'math');

1 row created.

SQL> insert into subject values(20,'chinese');

1 row created.

SQL> insert into score values(1,1,10,80);

1 row created.

SQL> insert into score values(1,2,10,90);
insert into score values(1,2,10,90)
*
ERROR at line 1:
ORA-00001: unique constraint (SYSTEM.SYS_C005257) violated


SQL> insert into score values(2,2,10,90);

1 row created.

SQL> insert into score values(3,2,20,70);

1 row created.

SQL> remark 创建一个触发器
SQL> create or replace trigger stu_score
  2  instead of insert or update or delete
  3  on stu_score
  4  for each row
  5  begin
  6  if inserting then
  7  insert into student values(:new.stuid,:new.stuname);
  8  insert into subject values(:new.pid,:new.pname);
  9  insert into score values(:new.cid,:new.stuid,:new.pid,:new.computer);
10  dbms_output.put_line('已经成功的想三张表中插入了数据!');
11  elsif updating then
12  null;
13  elsif deleting then
14  null;
15  end if;
16  end;
17  /

Trigger created.

SQL> remark 动作指令:inserting updating deleting 可以作为条件进行判断
SQL> remark instead of  替代触发器
SQL> remark 变异表
SQL> remark 变异表:是触发器触发源语句正在修改的表或者被修改表的级联表;
SQL> remark .........................................................
SQL> remark 触发器的管理:
SQL> remark 对于已经创建的触发器可以通过启用和禁用触发器进行管理。
SQL> remark 对单一的触发器进行管理的语法:alter trigger 触发器名称 disable|enable
SQL> remark 如果一个表上的触发器很多,可以对一个表上的所有触发器进行禁用;
SQL> remark alter table 表名 disable |enable all triggers;
SQL> spool off;
分享到:
评论

相关推荐

    调试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