oracle触发器简介与使用方法

一,触发器简介

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

二,触发器的作用

             * 对数据库的操作进行审计,存储历史数据
             *完成数据库初始化处理
             *控制数据库的数据完整性
             *进行相关数据的修改
             *完成数据复制
             *自动完成数据库统计计算

             *限制数据库操作的时间、权限等,控制实体的安全

三,触发器的组成

             1、触发时间:触发器事件的时间次序(before, afer)[2]
             2、触发事件:什么SQL语句会引起触发器触发(Insert, delete, update)[3]
             3、触发子体:触发器触发时要执行的操作(一个完整的PL/SQL程序)
             4、触发类型:触发器被执行的次数(语句级、行级)[2] //语句级只执行一次,行级会执行多次。
                          [*]一个表上最多可以创建12个不同类型的触发器:3*2*2 = 12

四,触发器语法

create [or replace] tigger 触发器名 触发时间 触发事件
on 表名
[for each row]
begin
 pl/sql语句
end

    触发器名:触发器对象的名称。由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。
    触发时间:指明触发器何时执行,该值可取:
    before:表示在数据库动作之前触发器执行;
    after:表示在数据库动作之后触发器执行。
    触发事件:指明哪些数据库动作会触发此触发器:
    insert:数据库插入会触发此触发器;
    update:数据库修改会触发此触发器;
    delete:数据库删除会触发此触发器。
    表 名:数据库触发器所在的表。
    for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。

五,示例

   1) 实现当操纵员工表时自动将员工人数统计到部门表中:

    部门表下有三个字段,分别是部门编码,部门名称,总人数

create table dept1(dno int,dname varchar(20),population int);

    员工表下有三个字段,分别是员工编码,员工名称,部门编码

create table emp1(eid int,ename varchar2(20),dno int);

    编写触发器

SQL> create or replace trigger trigger01
   after delete or insert or update on emp1
    for each row
    begin
    if inserting then                                 
    update dept1 set population=population+1     
     where dept1.dno=:new.dno;
    elsif deleting then
    update dept1 set population=population-1
  where dept1.dno=:old.dno;
   elsif updating then
   update dept1 set population=population+1
   where dept1.dno=:new.dno;
  update dept1 set population=population-1 
  where dept1.dno=:old.dno;
   end if;
   end;
/
((特殊变量:   :new    :old
   :new代表你所新输入的数据
   :old代表更改前的数据
  使用方式 :old.列名
  insert 操作只有 :new
  delete 操作只有 :old

  update 操作 :new  :old 都有)

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

    创建一个序列

create sequence SEQ_TEST
minvalue 1        --最小值
nomaxvalue        --不设置最大值
start with 1      --从1开始计数
increment by 1    --每次加1个
nocycle           --一直累加,不循环
nocache;          --不建缓冲区

 创建测试表

create table TEST
(
  NID int PRIMARY KEY,
  test1 varchar2(20)
);

创建触发器

CREATE OR REPLACE TRIGGER tg_test
BEFORE INSERT ON test 
FOR EACH ROW WHEN (new.nid is null)
begin
select seq_test.nextval into:new.nid from dual;
end;
/

插入几条数据验证下吧

select * from test;
insert into test(nid,test1) values(4,'aaa'); --手动插入序号
insert into test(test1) values('bbb');       --自动插入序

博主还写过使用触发器配置oracle用户登录信息日志功能,可以直接复制在生产库使用,详情请点击以下链接

https://blog.csdn.net/zcb_data/article/details/80497414 点击打开链接

猜你喜欢

转载自blog.csdn.net/zcb_data/article/details/80680597