Oracle基础<5>--触发器

一、触发器

  触发器是当特定事件出现时自动执行的代码块。比如,每次对员工表进行增删改的操作时,向日志表中添加一条记录。触发器和存储过程是由区别的:触发器是根据某些条件自动执行的,存储过程是手动条用的。

  (一)触发器的类型:

    1、行级触发器:操作数据行的时候触发。   《行级触发器对DML语句影响的每一行执行一次》

  行级触发器可以在create trigger 命令中指定for each row 子句创建行级触发器

    2、语句级触发器:一个DML语句触发一次的触发器。行级触发器和语句级触发器一起也成为DML触发器。

    (语句触发器是create trigger 命令创建的触发器的默认类型)

    3、INSTEADOF 触发器:主要是在视图上定义的触发器。

    4、模式触发器:用户事务触发器。

    5、数据库触发器:创建在数据库事件上的触发器。

  (二)触发器可以分为三个部分:

    1、触发器语句:触发器语句是哪些可以导致触发器的事件,即在表或者视图上执行INSERT、DELETE、UPDATE之类的DML语句,在模式对象上执行的DDL语句或数据库事件。所有可以导致触发器的事件都是触发器的语句。

    2、触发器限制:触发器限制条件包含一个布尔表达式,该值必须为”真“才能激活触发器,如果该值为”假“或”未知“,将不运行触发器操作。

    3、触发器操作:触发器操作时触发器的主体,包含一些SQL语句和代码,这些代码在执行触发器有且触发器限制条件为”真“时运行。行级触发器允许触发器操作中的语句访问行的列值。

  

  (三)触发器的常用功能如下:

  1、允许/限制对表的修改。

  2、自动生成派生列。

  3、强制数据一致性。

  4、强制复杂的完整性约束条件。

  5、提供审计和日志记录。

  6、防止无效的事件处理。

  7、启动复杂的业务逻辑。

  由于触发器是对数据进行监控的一个对象,随时监控着数据库中的数据和表,造成使用触发器的性能低下。这点尤为重要。

二、创建触发器:

  语法:

  CREATE [OR REPLACE] TRIGGER trigger_name  --触发器的名称

  {BEFORE | AFTER                --在事件发生之前 或 之后激发触发器

  | INSTEAD OF}                 -- 表示执行触发器代码来代替导致触发器调用的事件

  {INSERT | DELETE | UDPATE | [OF column[,column]]}

  [OR {INSERT | DELETE | UPDATE [OF column[,column]]}]

  ON [schema.]table_or_view_name

  [REFERENCING [NEW AS new_row_name] [OLD AS old_row_name]]

  [FOR EACH ROW]

  [WHEN (condition)]

  [DECLARE

    variable_declation]

  BEGIN

    statements;

  [EXCEPTION

    exception_handlers]

  END[trigger_name];

说明:

  trigger_name:触发器的名称

  BEFORE | AFTER :表示在事件发生之前或之后激活触发器

   INSTEAD OF:表示可以执行触发器代码来代替导致触发器调用的事件。

  INSERT | DELETE | UDPATE :指定构成触发器事件的数据库操作类型,UPDATE还可以指定列的列表。

  REFERENCING :指定新行(即将更新)和旧行(更新前)的其他名称,默认为NEW和OLD。

  (旧值OLD:在DML 语句之前存在的语句。 UPDATE 和DELETE通常引用旧值)

  (新值NEW: DML 创建的数据值)引用的时候使用OLD后面加点或“NEW”后面加点,然后在接字段名。

  table_or_view_name:触发器所监控的表或者视图的名称。

  FOR EACH ROW:表示是否对受影响的每一行都执行触发器,即行级触发器。如果不使用此语句,则为语句触发器,使用此语句则为行级触发器。

  WHEN (condition):限制执行触发器的条件,该条件可以包括新旧数据值的检查。

  DECLARE:声明触发器所使用的局部变量

  statements:触发器所执行的PL-SQL语句。

  exception_handlers:异常处理代码。

三.触发器的管理

  (1)触发器的状态

     desabled:未启用状态

     enabled:已启用状态

语法:

  alter trigger trigger_name {desabled | enabled}; --启用和禁止触发器

   drop trigger trigger_name;  --删除触发器

  SQL> DESC USER_TRIGGERS;  --查看触发器

例1:生成一个自动编号(行级触发器)



--创建测试表,学生表
CREATE TABLE student
(
    stu_id NUMBER CONSTRAINT pk_id PRIMARY KEY,
    stu_name VARCHAR2(20) NOT NULL,
    stu_phone VARCHAR2(20) NOT NULL
);

--创建一个序列,从1开始累加,每次加1
CREATE SEQUENCE seq_student
    START WITH 1       --序列开始,从1开始计数
    INCREMENT BY 1     --每次增加1
    NOMAXVALUE         --不设置最大值
    NOCYCLE            --只累加,不循环
    CACHE 20;          --缓存20

--创建一个触发器

create or replace trigger student_insert_seq
  before insert on student          --在插入之前
  for each row                      --行级触发器
begin
  :new.stu_id := seq_student.nextval;  --将插入的stu_id属性设置为序列的下一个值    --触发器的操作
end student_insert_seq;

--插入数据
INSERT INTO student (stu_name,stu_phone) VALUES(‘张三‘,‘110‘);
INSERT INTO student (stu_name,stu_phone) VALUES(‘李四‘,‘120‘);

--查询,数据插入成功
SELECT * FROM student



例2:实现表操作日志


--新建日志表序列
CREATE SEQUENCE logs_id_squ INCREMENT BY 1
            START WITH 1 MAXVALUE 9999999 NOCYCLE NOCACHE;

--日志表
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 or replace trigger trig_log
  after INSERT OR UPDATE OR DELETE
    on emp
  for each row
DECLARE
  V_USERNAME VARCHAR2(20);
BEGIN
  SELECT USER INTO V_USERNAME FROM dual;   --获取当前用户
  IF INSERTING THEN
      INSERT INTO logs VALUES(logs_id_squ.nextval,‘emp‘,‘insert‘,:new.Empno,sysdate,V_USERNAME);
  ELSIF UPDATING THEN
      INSERT INTO logs VALUES(logs_id_squ.nextval,‘emp‘,‘update‘,:new.Empno,sysdate,V_USERNAME);
  ELSIF DELETING THEN
      INSERT INTO logs VALUES(logs_id_squ.nextval,‘emp‘,‘delete‘,:new.Empno,sysdate,V_USERNAME);
  END IF;
END TRIG_LOG;

 

二:触发器和存储过程的区别

  1.触发器是自动执行的(遇到某种情况自动执行) 不能进行显示调试

  触发器是对数据进行监控的一个对象   触发器缺陷:性能较低

  2.存储过程是可以被调用的

时间: 2024-10-05 23:06:05

Oracle基础<5>--触发器的相关文章

Oracle实践--PL/SQL基础之触发器和程序包

PL/SQL基础之触发器和程序包  程序包 /* 程序包:对相关存储过程,函数,变量,游标和异常等对象的封装 有声明和主体组成 优点:1.模块化:2.更轻松的应用程序设计;3.信息隐藏;4.性能更佳 */ --程序包的声明:关键字:package is end create or replace package my_pack as procedure packageTest(v_num number); end my_pack;--也可以是 end; --程序包的主体 create or re

【转载:Oracle基础知识】Oracle数据库体系结构

先来看张直观的图:                                            oracle 11g 体系结构图 理解Oracle体系结构要充分理解三个概念:数据库(database),数据库实例(instance),会话(session),一定不要把这三个概念弄混. 数据库的概念 (A)    物理存储结构由数据文件.控制文件.重做日志文件组成: 1.       数据文件(datafile) select * from dba_data_files; 数据文件包括存

Oracle中的触发器

Oracle中的触发器,布布扣,bubuko.com

Oracle基础实训

一.Oracle基础SQL练习 班级表:班级编号(主键.标识列).班级名称.班主任.开班日期老师表:老师编号(主键.标识列) .姓名.性别(默认值‘男’).身份证号(必须是18位数字).联系电话学生表:学号(主键.固定五位数字) .班级编号.姓名.性别.出生日期.联系电话.家庭地址成绩表:编号(主键.标识列) .学号.科目名称.分数 1.表格创建 create table();语法 CREATE TABLE [schema.]table (column datatype [DEFAULT exp

oracle 存储过程 ,触发器练习

/*以下代码是对emp表进行显示宽度设置 */col empno for 9999;col ename for a10;col job for a10;col mgr for 9999;col hiredate for a12;col sal for 9999;col comm for 9999;col deptno for 99;col tname for a12;set pagesize 50; //----------------------------------------------

oracle 如何用触发器实现更新刚插入的数据集合

oracle 如何用触发器实现更新刚插入的数据集合 1.建立测试表 create table TEST_TB ( ID   NUMBER, WLID NUMBER, PM   VARCHAR2(100), DJZT VARCHAR2(10), SL   NUMBER, PH   VARCHAR2(100) ); 2.建立带ref cursor定义的包和包体及函数: CREATE OR REPLACE package pkg_test as /* 定义ref cursor类型 不加return类型

Oracle基础知识笔记(10) 约束

大清早打开vs2008,出现这么诡异的错, 删了一个dll的就好了.如图 Oracle基础知识笔记(10) 约束

Oracle基础 shutdown和startup

原文:Oracle基础 shutdown和startup 一.shutdown命令:SHUTDOWN有四个参数:NORMAL.TRANSACTIONAL.IMMEDIATE.ABORT.缺省不带任何参数时表示是NORMAL. SHUTDOWN NORMAL:不允许新的连接.等待会话结束.等待事务结束.做一个检查点并关闭数据文件.启动时不需要实例恢复. SHUTDOWN TRANSACTIONAL:不允许新的连接.不等待会话结束.等待事务结束.做一个检查点并关闭数据文件.启动时不需要实例恢复. S

Oracle基础学习3--Oracle创建用户并授权

Oracle服务器端的操作一般如下: 1)       安装Oracle服务器软件 2)       创建数据库(安装时自动创建) 3)       配置监听(安装时自动配置) 4)       启动Oracle实例 5)       创建用户表空间 6)       创建新用户并授权 下面就开始讲创建用户表空间.创建新用户并授权两项: 首先要用系统管理员登陆Oracle(sqlplus/as sysdba) ?  创建用户表空间(D盘根目录创建名为ts_zhangsan的表空间) create