一.触发器的概念理解。 数据库
数据库触发器是一个与表关联的存储下来的能够自动执行的PL/SQL程序。每当一个特定的数据操做语句在指定的表上发出时,Oracle自动的执行触发器中定义的语句序列。好比,你要实现银行卡数据的插入,插入姓名,数据库就自动的为你插入卡的ID和你帐户的ID,这样的功能就可使用触发器来实现。固然,还有其余的做用。 安全
一个表能够建立多个触发器。 app
一个触发器能够实现多个功能。 函数
在触发器中能够用IF INSERTING THEN 、IF DELETING THEN 、 IF UPDATING THEN 结构来判断哪一种操纵触发了触发器从而来实现对应的触发器功能。(至关于多个触发器总合在一块儿) server
触发器是一把双刃剑,添加了触发器,在项目开发的过程当中,若是遇到了工做交接,这时就必须沟通好,因此触发器的注释必定要写好。 开发
触发器也能够调用存储过程和存储函数。 rem
什么状况下可能会用到触发器: 同步
1.数据确认。 it
2.实施复杂的安全性检查。 io
3.作审计,跟踪表上所作的数据操做等。
4.数据的备份和同步。
查询触发器: select * from user_triggers;
查询触发器、函数、过程: select * from user_source;
二.触发器的分类。
语句级触发器就是在数据操做前或者操做后执行的一次性的触发器。无论这个操做影响了多少行。
数据操做影响到的每一条记录都被触发,使用old和new伪记录变量,识别值的状态。
在行级触发器中伪变量与触发语句的适用。
触发语句
:old
:new
insert
将要插入的数据
update
更新前该行的值
更新后的值
delete
删除前该行的值
列级触发器仅限于update操做时才会触发。
三.经过实例来建立触发器。
-----------触发器的语法---------
CREATE [OR REPLACE] TRIGGER 触发器名称
{BEFORE|AFTER} BEFORE|AFTER:触发触发器数据操做以前执行触发器仍是以后执行触发器。
{DELETE|INSERT|UPDATE[OF列名]} DELETE|INSERT|UPDATE[OF列名]:触发触发器数据操做的类型。
ON 表名
[FOR EACH ROW [WHEN(条件)]] FOR EACH ROW:行级触发器的关键字。WHEN:给行级触发器加一个条件,知足条件才执行,从而实现行级判断。
PL/SQL块
------------实现一个自动增加的ID列的触发器-------------
--建立一个id,name的person表--
create table person(
id number primary key,
name varchar2(20) not null
);
---由于是自动增加的触发器,因此要先建立一个增加的序列--
create sequence id_incr
start with 1001
increment by 1
nomaxvalue
nocycle
cache 10;
--------建立好序列以后就能够建立触发器了------------------
--建立一个插入name时触发ID自动插入的触发器--
create or replace trigger id_tri
before
insert on person
for each row
declare
nextid number;
begin
select id_incr.nextval into nextid from dual;
:new.id:=nextid;
end;
-----全部准备工做完成就能够插入数据了----
insert into person(name) values('张三');
insert into person(name) values('李四');
select * from person;
-----------实现一个插入数据时判断姓名是否以j开头的触发器-------------
表仍是person表
create or replace trigger j_name
before
insert on person for each row
begin
if :new.name like 'j%' then
raise_application_error(-20000,'不能使用j开头的姓名');
end if;
end;
insert into person(name) values('j云霞');执行这条语句时就会抛出应用程序异常,提示不能使用j开头的姓名。至关于高级的约束。
------------------在触发器中针对某种类型的触发实现针对的功能---------
表仍是person表
create or replace trigger is_what
before
insert or update or delete on person
begin
if inserting then
dbms_output.put_line('这是插入数据时触发的');
elsif updating then
dbms_output.put_line('这是更新数据时触发的');
else
dbms_output.put_line('这是删除数据时触发的');
end if;
end;
使用下列三条语句体来检测:
set serveroutput on;
insert into person(name) values('徐文帅');
set serveroutput on;
update person set name='张三' where name='徐文帅';
set serveroutput on;
delete person where name='张三';
注意:is_what触发器是语句级触发器,因此你在增删改检测的时候,不论person有几条语句被牵扯到,它只会put_line一条提示语句。这就是语句级触发器和行级触发器的一个区别。
------------------------给id建立一个列级触发器--------
create or replace trigger id_up
before update of id on person
begin
dbms_output.put_line('更新id的触发器被触发了');
end;
set serveroutput on;
update person set id=0000 where id='1001'; 这条语句执行的时候就会触发id_up触发器。
set serveroutput on; update person set name='aaa' where name='bbb';这条语句执行的时候就不会触发id_up触发器。