专注Java教育14年 全国咨询/投诉热线:444-1124-454
星辉LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 实例解析Oracle触发器

实例解析Oracle触发器

更新时间:2021-02-25 17:37:58 来源:星辉 浏览1119次

触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行。因此触发器不需要人为的去调用,也不能调用。然后,触发器的触发条件其实在你定义的时候就已经设定好了。本文我们就来通过实例解析Oracle触发器

我们先来看一下Oracle触发器的基本语法:

create [or replace] tigger 触发器名 触发时间 触发事件

on 表名

    [for each row]

begin

    pl/sql语句

End

下面我们来介绍触发器每个部分的定义:

触发器名:触发器对象的名称。由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途

触发时间:指明触发器何时执行,该值可取

before:表示在数据库动作之前触发器执行

after:表示在数据库动作之后触发器执行

触发事件:指明哪些数据库动作会触发此触发器

insert:数据库插入会触发此触发器

update:数据库修改会触发此触发器

delete:数据库删除会触发此触发器

表 名:数据库触发器所在的表

for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。

通过上面的Oracle触发器的基本语法,我们下面给出几个具体的Oracle触发器实例:

1、下面的触发器在更新表tb_emp之前触发,目的是不允许在周末修改表:

create or replace trigger auth_secure before insert or update or DELETE

on tb_emp

begin

  IF(to_char(sysdate,'DY')='星期日') THEN

    RAISE_APPLICATION_ERROR(-20600,'不能在周末修改表tb_emp');

  END IF;

END;

2、使用触发器实现序号自增

创建一个测试表:

create table tab_user(

  id number(11) primary key,

  username varchar(50),

  password varchar(50)

);

创建一个序列:

create sequence my_seq increment by 1 start with 1 nomaxvalue nocycle cache 20;

创建一个触发器:

CREATE OR REPLACE TRIGGER MY_TGR

 BEFORE INSERT ON TAB_USER

 FOR EACH ROW--对表的每一行触发器执行一次

DECLARE

 NEXT_ID NUMBER;

BEGIN

 SELECT MY_SEQ.NEXTVAL INTO NEXT_ID FROM DUAL;

 :NEW.ID := NEXT_ID; --:NEW表示新插入的那条记录

END;

向表插入数据:

insert into tab_user(username,password) values('admin','admin');

insert into tab_user(username,password) values('fgz','fgz');

insert into tab_user(username,password) values('test','test');

COMMIT;

查询表结果:

SELECT * FROM TAB_USER;

3、当用户对test表执行DML语句时,将相关信息记录到日志表

--创建测试表

CREATE TABLE test(

  t_id  NUMBER(4),

  t_name VARCHAR2(20),

  t_age NUMBER(2),

  t_sex CHAR

);

--创建记录测试表

CREATE TABLE test_log(

  l_user  VARCHAR2(15),

  l_type  VARCHAR2(15),

  l_date  VARCHAR2(30)

);

创建触发器:

--创建触发器

CREATE OR REPLACE TRIGGER TEST_TRIGGER

 AFTER DELETE OR INSERT OR UPDATE ON TEST

DECLARE

 V_TYPE TEST_LOG.L_TYPE%TYPE;

BEGIN

 IF INSERTING THEN

  --INSERT触发

  V_TYPE := 'INSERT';

  DBMS_OUTPUT.PUT_LINE('记录已经成功插入,并已记录到日志');

 ELSIF UPDATING THEN

  --UPDATE触发

  V_TYPE := 'UPDATE';

  DBMS_OUTPUT.PUT_LINE('记录已经成功更新,并已记录到日志');

 ELSIF DELETING THEN

  --DELETE触发

  V_TYPE := 'DELETE';

  DBMS_OUTPUT.PUT_LINE('记录已经成功删除,并已记录到日志');

 END IF;

 INSERT INTO TEST_LOG

 VALUES

  (USER, V_TYPE, TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mi:ss')); --USER表示当前用户名

END;

/

--下面我们来分别执行DML语句

INSERT INTO test VALUES(101,'zhao',22,'M');

UPDATE test SET t_age = 30 WHERE t_id = 101;

DELETE test WHERE t_id = 101;

--然后查看效果

SELECT * FROM test;

SELECT * FROM test_log;

上述的三个Oracle触发器的实例能够帮助我们掌握Oracle触发器的基本用法,我们想要深入学习Oracle触发器的小伙伴可以观看本站的Oracle教程,学习各种Oracle相关的知识点,提升自己对Oracle知识体系的掌握能力。

 

 

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>