1. 触发器:
概念:
可以看成一个特殊的过程,它是自动执行的,并且它是不允许带参数的。
利用触发器可以自动的进行一些操作,行触发器、数据触发器等等,主要是数据操纵语言的触发器
2、事务:
概念:为了确保数据完整性的能力。用于将一条或者多条sql组成一个逻辑上的单元。然后执行,这样的话结果就会都成功或者都失败。
特性阐述:
原子性:2个或者2个以上的表被操作的时候,对其中一个操作成功,其他操作不成功的时候。就出现了错误,这就是原子性起到的错误。都成功或者都失败,也就是2个组成了1个单元。
一致性:举例说明:银行账户打款说明‘汇款方减去相应的金钱、收款方也得加上相应的金钱。’
隔离性:隔离性和并发性相结合,隔离性越强、并发性越低。正相反
Commit和Rollback:
概述:
当我们对表进行了DML修改之后,我们如果不commit我们只是对内存中的数据进行了更改,表中并没有修改。但是我们用另外一个用户查这个内容是没有变化的。
这就是事务的隔离等级。
并发性和隔离性:
概述:
2个用户对一个表同时进行查询、修改等操作。造成数据的不一致。
举例说明:
查看页面目前火车有5张票,甲买2张,乙此时也查看火车票有5张,乙买4张,这样的话火车票被卖了6次。这是不合乎情理的。所以,当我们甲如果对火车票进行操作的时候,[加锁],甲处理完成之后[解锁]。乙在甲处理的时候,它是不能对这火车票进行操作的。乙如果点击了提交、而此时系统会提示“无法完成操作,没有那么多票。”这就是降低了并发性、提高了隔离性
永久性:一旦提交了就不可以再回滚了,一旦回滚就不可以再提交了。因为提交了以后就已经改变了物理数据。所以也不能再回滚了。
触发器实际应用:
注意:触发器语句体里面是不可以写rollback语句的
RAISE_APPLICATION_ERROR(‘-20000’,’不能删除’) 两个参数分别是错误号和提示内容,实现控制触发器,错误号在
-20999----20000之间
两个重要的内存表:OLD表和NEW表
Old和New使用方式为”:old.id和:new.id”
:new --为一个引用最新的列值;
:old --为一个引用以前的列值; 这两个变量只有在使用了关键字 "FOR EACH ROW"时才存在.且update语句两个都有,而insert只有:new ,delect 只有:old;
触发器案例:
案例1:创建触发器 –删除dept表的行的时候,也删除emp对应的行
一、创建触发器
create or replace trigger del_dept --创建触发器
after delete on dept --在删除dept表删除动作之后触发
for each row --行级触发器
begin --触发器语句块
delete from emp where eid=:old.eid; --old表示内存表,在这里如此调用表示删除时候的dept的eid的应用
end del_dept; --结束
二、执行触发的语句
Delete from dept where eid=1;
案例2:创建触发器 –限制删除emp表的行(行级触发器)
create or replace trigger del_xianzhi_dept --创建触发器
after delete on dept --在给dept表删除动作之后
for each row --行级触发器
begin
if :old.eid=3 then
RAISE_APPLICATION_ERROR(-20001,'cant'); --提示错误,不在进行操作
dbms_output.put_line('aaaaa');
end if;
end del_xianzhi_dept;
案例3:语句级触发器
注意:语句级触发器不需要写什么for each row等
create or replace trigger ti --创建触发器
after insert or delete or update on dept --语句级触发器三种动作都可以触发的写法
begin --下面是一些逻辑处理就好
if inserting then
dbms_output.put_line('I');
elsif deleting
dbms_output.put_line('D');
else updating
dbms_output.put_line('U');
end if;
end;
/
三:替换触发器只能建立到视图上,可以解决视图不能同时更新多表的问题
大家都知道2个表组成的视图是不能够对两个表同时进行操作的。然而替换触发器可以完成这个问题
create or replace trigger tr_view1 --创建触发器
instead of insert on view1 --替换触发器,在view上
for each row --行级触发器,可以用new
begin --业务处理。在此时在两个表分别插入
insert into emp values(:new.id,'aaa');
insert into dept(:new.id,:new.id,'bbb');
end;
/
PL/SQL基础编程之(九)[事务的一致性、隔离性、并发性][行级触发器、语句触发器、替换触发器]
最新推荐文章于 2022-10-01 20:46:57 发布