oracle数据库触发器

instead of触发器

instead of触发器介绍
instead of触发器代替触发动作,并在处理约束之前激发(对于每个触发操作,每个表或视图都只能有一个instead of触发器。而一个表对于每个触发操作可以有多个after触发器)
instead of触发器的创建模板:
create or replace trigger 触发器名
instead of 触发事件 on 表名|视图名
pl/sql 程序体
instead of触发器的主要优点:
可以使不能更新的视图支持更新。(疑问:通过以下的实验结果得出普通视图不是也可以更新么?)
以下是关于instead of触发器的一个代码示例:

/*准备工作
//先创建一个主表stu2
create table stu2
(
name varchar(10) primary key,
phone number(10)
);

//再创建一个从表stu3
create table stu3
(
id number(10) primary key,
name2 varchar(10) references stu2(name),
xuehao number(10)
);

//向stu2中插入一行数据
insert into stu2
values('佟丽娅',1);
//向stu3中插入一行数据
insert into stu3
values(1.'佟丽娅',1);

//创建一个视图
 create view weiview
 as
 select stu2.name,stu2.phone,stu3.xuehao,stu3.id from stu2,stu3
 where stu2.name=stu3.name2;


*/


/*接下来是创建一个instead of触发器

create or replace trigger myinsteadoftrigger
instead of update on weiview
begin
update stu2 set name=:new.name,phone=:new.phone
where name=:old.name;
update  stu3 set name2=:new.name,xuehao=:new.xuehao,id=:new.id
where id=:old.id;
end;
/
*/

以上就是一个简单的instead of触发器
它的功能就是:当对视图weiview做更新操作时,相应的表也将随之更新。那么问题来了,如果不创建instead of触发器,那么数据库视图支持更新操作么(增删改)?如果支持更新,那么视图更新后,相应的表会更新么?(接下来就做一个简单的实验来解答:还是沿用上面的两个表:stu2和stu3,只不过在新建一个视图,且这次不再给视图加任何触发器,以下是实验代码)

/*问题:oracle数据库中视图支持update操作么(是否视图仅仅用来查看?)

//创建一个视图weiview1
 create view weiview1
 as
 select stu2.name,stu3.id from stu2,stu3
 where stu2.name=stu3.name2;

//尝试对视图(两个表所连接起来的视图)进行update操作
update weiview1 set id=2
where name='迪丽热巴';

//注:执行结果是表stu3id被改变,变成了2(我并没有设置instead of 触发
器)!!!!可见oracle数据库的视图支持更行操作,并且与视图相关联的(即试图从那些表中查找数据)表也将随之更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值