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