1.为什么使用视图
1)限制数据的存取:用户只可以看见基表部分信息。 方法:赋予用户访问视图对象的权限,而不是表的对象权限
2)使复杂的查询变得容易(内联视图)
3)提供数据的独立性
并不存数据库,而是根据视图定义访问基表;基表删了,视图对象还在;典型对象,有权限的区别
简单试图(可以改,通过试图改基表,可做update)和复杂视图(键值保留表)
特性 | 简单试图 | 复杂视图 |
表个数 | 1 | 1..n |
含函数 | 无 | 有 |
含组函数 | 无 | 有 |
含distinct | 无 | 有 |
DML操作 | 可以 | 不一定 |
复杂试图可以设置instance触发器来修改;
视图是用来查询的,修改的话会受限制
2.语法
create [or replace] [force|noforce] view view
[(alias[,alias]...)]
as subquery(子查询,访问的基表)
[with check option [constraint constraint]]
[with read only]
2.1 force的作用:可以先建视图,后键基表
create force view view1 as select * from test1;
2.2 with check option作用:对视图where子句进行约束。不允许对限定关键字修改
create view view2 as select * from emp deptno=10 with check option;
2.3 with read only 作用:禁止对试图执行DML操作
create view view3 as select * from emp where deptno=10 with read only;
2.4 关于视图的注意事项
1) 只要视图中的数据不是来自基表的原始数据,就尽量不要对该数据做DML操作;
2)视图的DML操作
含有如下情况,则不能删除视图中的数据
- 含有聚合函数
- 含有group by子句
- 含有distinct关键字
- 含有rownum这个伪列
含有如下情况,不能修改该视图中的数据:
- 上面提到的任意一种情况
- 列由表达式来定义
含有如下情况,不能增加该视图中的数据:
- 上面提到的任何一种情况
- 在基表中包含有not null约束的列,然而该列并没有在视图中出现
3.复杂视图的更新,键保留表的概念
select * from user_views
如果建立了视图 想查看其中的定义,可以访问如下视图dba_views中的text字段(long型);
自建pl/sql过程,参照一下
declare
v_text dba_views.text%type;
v_name dba_views.view_name%type;
begin
select text,view_name into v_test,v_name from dba_views where view_name='V1';
dbms_output.put_line(v_name||'define is:'||v_text);
end;
/