Oracle视图和触发器

视图和触发器
一、视图
视图是一个虚拟表,包含一些带有名称的列和行数据。但是,视图中没有数据值,其数据值来自定义视图时的查询语句。

1、创建视图。需要管理员授予权限
grant create view to scott;

create or replace view 视图名 as select语句。

with read only; --只读

2、查看视图内天
select * from 视图名

3、删除视图
drop view 视图名

二、触发器

触发器是一种通过“触发事件”来执行的pl/sql命名程序块。
作用:
1、管理复杂的完整性约束
2、监控对表的增加、修改和删除
3、实现对数据的审计。
比如:插入insert、修改update和删除delete

语法:

create [or replace] trigger 触发器名 触发时间 触发事件
on 表名
[for each row]
begin
  pl/sql语句
end

解释:
触发时间:指明触发器何时执行,该值可取:
before:表示在数据库动作之前触发器执行;
after:表示在数据库动作之后触发器执行。
触发事件:指明哪些数据库动作会触发此触发器:
insert:数据库插入会触发此触发器;
update:数据库修改会触发此触发器;
delete:数据库删除会触发此触发器。
表 名:数据库触发器所在的表。
for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次

1、触发器类型
1)语句级触发器
不使用for each row。无论数据操纵影响多少行,都只执行一次。

例如:创建触发器tri_stu,当向student表中插入数据之前,触发器自动把操作写入日志表stu_log中

–删除表
drop table student;

–创建表student
create table student —创建student表
(
id number not null, --id
name VARCHAR2(10) not null, --姓名
sex varchar2(10) not null,–性别
age NUMBER not null
);
–删除日志表
drop table stu_log;

–创建学生日志表stu_log
create table stu_log —创建student表
(
action VARCHAR2(10), --操作类型。增、删、改
shijian date --时间
);

–创建触发器
create or replace trigger tri_stu
before insert or update or delete on student --创建触发器。当向表student中插入、修改或删除时触发
declare
action varchar2(10); --声明变量。保存操作的类型
begin
if inserting then --当执行插入操作时,inserting为true
action := ‘插入’;
elsif updating then --当执行修改操作时,updating 为true
action := ‘修改’;
elsif deleting then --当执行删除操作时,deleting 为true
action := ‘删除’;
end if;
insert into stu_log (action, shijian) values (action, sysdate);
end;
/

–向student表中插入数据
insert into student values(1,‘张三’,‘男’,18);
insert into student values(2,‘李四’,‘男’,18);
insert into student values(3,‘王五’,‘男’,18);
insert into student values(4,‘赵六’,‘男’,18);

2)行级触发器
行级触发器针对DML操作所影响的每一行数据都执行一次触发器。必须在语法中使用for each row

例如:创建触发器,当向商品表good中每插入一行数据时,可以自动使用序列,产生编号
–先删除good表
drop table good;

–创建表good。商品表
create table good(
id number not null primary key, --编号,主键,非空
name varchar2(10) not null --姓名,非空
);

–先删除序列
drop sequence stu_id;

–创建序列
create sequence stu_id
start with 1
increment by 1
minvalue 1
maxvalue 200
order;

–创建触发器
create or replace trigger tri_good
before insert on good
for each row
begin
select stu_id.nextval into :new.id from dual;
end;
/

提示::new.id为列标识符,用来指向新行的id列。
给:new.id赋值,相当于给当前行的id列赋值

–插入语句
insert into good values(‘苹果’);
insert into good values(‘香蕉’);
insert into good values(‘菠萝’);

5、创建替代触发器
对"视图"进行操作时定义的触发器,替代触发器只能定义在"视图"上

语法:
create [or replace] trigger trigger_name --触发器名称

instead of trigger_event --触发事件

on view_name --视图名称

for each row --替代触发器必须指定为行级的触发器

[when trigger_condition] --触发条件

trigger_body --触发体,PL/SQL块
end trigger_name;

例如:创建触发器,当删除只读视图中的数据时,student表中原来的数据也被删除

1)首先创建视图view。需要管理员权限
create or replace view v_stu as select * from student
with read only;

2)创建替代触发器
create or replace trigger stu_instand_tri
instead of delete on stu_view
for each row
begin
delete from student where id = :old.id;
end stu_instand_tri;
/

提示::old.id是表示当前行id列的原始值

6、删除触发器
drop trigger 触发器名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值