触发器的概述、分类
触发器是一个特殊的过程,不能带参数,触发器的主要作用是对表进行完整性的约束。
触发器组成---------------触发事件
-----------------触发对象
事务的概述
什么是事务:事务是数据库中重要的机制,用于确保数据完整性和并发处理的能力,他将一条/一组sql语句当作一个逻辑上的单元,用来保证这些语句都成功/失败。
事务的特性:
事务具有ACID四大特性:
某种意义上说,原子性是手段,一致性是目的,通过原子性的手段达到一致性的目的。
A: 原子性: 做都做 不做都不做-------手段
C:一致性: 做事务操作的前后,数据保持一致性-----目的
I: 隔离性: 隔离性越强,并发性越弱
---------用for update 来实现事务的隔离性 通过锁的特性:
|
是一个加锁过程
D:永久性:同一个事务在commit 之后不能rollback
notes: oracle中 DML语言 发生时 oracle 只操作内存,并不能自动提交
行触发器:
DML 行触发器:
example:
create or replace trigger mytri
after delete on d for each row
begin
delete from e where e.id=:old.id;
end mytri;
create or replace trigger mytri
after insert on e
begin
insert into d value(:new.id,'name');
end;
行触发器的工作原理是 俩个重要的内存表
old new
insert ---- ok
update ok ok
delete ok ----
create or replace trigger mytri
after update on d for each row
begin
update e set id=:new.id where id=:old.id;
end;
notes:触发器语句内不能有commit和rollback
用触发器来控制表
---------
create or replace trigger mytri
after delete on e for each row
begin
if
ld.id='0001' then
raise_application_error(-20000,'不能删除');
end if; |
end; 范围是(-20999,-20000)
语句级触发器:
example:
create table mylog(
curr_user varchar2(10),
curr_date date,
curr_act char(1));
create or replace trigger mytri
after insert or update or delete on e
begin
if inserting then
insert into mylog values(user,sysdate,'I');
else if updating then
insert into mylog values(user,sysdate,'U');
else
insert into mylog values(user,sysdate,'D');
end if;
end;
触发器和序列的共同应用 实现表主键自增
create sequence myseq
start with 1
increment by 1
order
no cycle;
create or replace trigger mytri
before insert on e
declare
sn number(4);
begin
select myseq.nextval into sn from dual;
:new.id=sn;
end;
oracle 中的替换触发器的应用:
笔者解读:oralce中替换触发器是行级触发器中的特例,核心思想是利用了内存中的new表和old表
用替换触发器可以解决视图中更新多个基表的操作
在oracle中 替换触发器只能建立在视图上
example:
create or replace trigger view_tri
instead of insert on myview for each row
begin
insert into d values(:new.id,:new.dname);
insert into e(eid,ename,sex,id) values(:new.eid,:new.ename,:new.sex,:new.id);
end;