一,触发器简介
触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行。因此触发器不需要人为的去调用,也不能调用。然后,触发器的触发条件其实在你定义的时候就已经设定好了。
二,触发器的作用
* 对数据库的操作进行审计,存储历史数据
*完成数据库初始化处理
*控制数据库的数据完整性
*进行相关数据的修改
*完成数据复制
*自动完成数据库统计计算
*限制数据库操作的时间、权限等,控制实体的安全
三,触发器的组成
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 点击打开链接