oracle触发器

--insert 触发器
create trigger tri_insert
on student  --将要进行更改的表名
for insert  --给表插入一条数据的时候触发
as
declare @student_id char(10) --定义一个变量
select @student_id=s.student_id from  --把查询出的指定字段的值赋值给变量
student s inner join inserted i
on s.student_id=i.student_id
if @student_id='0000000001'
begin
    raiserror('不能插入1的学号!',16,8)
    rollback tran
end
go

--update触发器
create trigger tri_update
on student --将要进行更改的表名
for update --给表修改一条数据的时候触发
as
if update(student_id)
begin
    raiserror('学号不能修改!',16,8)
    rollback tran
end
go


--delete触发器
create trigger tri_delete
on student --将要进行更改的表名
for delete --给表删除一条数据的时候触发
as
declare @student_id varchar(10)
select @student_id=student_id from deleted
if @student_id='admin'
begin
    raiserror('错误',16,8)
    rollback tran
end

解释在删除(delete)数据的时候,可以假定数据库将要删除的数据放到一个deleted临时表中,我们可以向读取普通的表一样,select 字段 from deleted
而insert的时候道理一样,只不过是把要插入的数据放在inserted表中。
更新操作可以认为是执行了两个操作,先把那一行记录delete掉,然后再insert,这样update操作实际上就对deleted表和inserted表的操作,所以不会有updated表了,有的时候两个表是主外键关系,想删除主表数据的同时把子表相关的数据也删除,这个时候如果用触发器就没有效果了,因为这个触发器是在你删除表后才触发的,这个时候直接终止,提示“有主外键关系,不能删除等”,所有这样的删除触发器是没有效果

 

 

 

CREATE OR REPLACE TRIGGER 触发器名称
   before DELETE   --在删除一行之前执行begin里的语句,根据需要更改触发的事件update,insert,delete三种情况
   ON 表名1  --对这个表进行删除行的时候触发时间
   FOR EACH ROW    --每更新一行就触发一   
BEGIN
delete from 表名2 where LEVELID= :old.id;
END;

 

解释:Oracle 里面对触发器也提供了特殊的对象 :NEW :OLD 来访问更新前后的数据 

      :NEW 表示进行操作后的表

      :OLD 表示进行操作前的表

例如:上面的:old.id是表示“表名1”里所删除行的ID

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值