create or replace view emp_v
as select * from emp where sal>1500;
我们建立了一个视图,并且sql>1500,那么我们向视图emp_v插入一条记录,sal为1350
insert into emp_v values(7905,'myview','IT',7782,'23-1月-83',1350,10,20);
这样做就会出现一个问题,当我们再次查看emp_v时,并没有发现刚插入的数据。那主要是英文插入的数据不符合条件sal>1500所致。
但我们使用select * from emp;进行查询时,刚才的插入的那条记录已经插入emp表里了。
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ---------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ---------- ---------- ---------- ----------
7900 JAMES CLERK 7698 03-12月-81 950 30
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
7905 myview IT 7782 23-1月 -83 1350 10 20
这样就会产生一个令人困惑的现象,但我们有一个解决的办法,就是在创建视图的时候,当sal<1500的时候就不能插入了,这样可以保持前后一致。我们修改创建视图的语句,加上一句,with check option;
create or replace view emp_v
as select * from emp where sal>1500
with check option;
我们再次插入刚才的那条语句,那么就会处理错误,
SQL> insert into emp_v values(7905,'myview','IT',7782,'23-1月-83',1350,10,20);
insert into emp_v values(7905,'myview','IT',7782,'23-1月-83',1350,10,20)
*
ERROR 位于第 1 行:
ORA-01402: 视图 WITH CHECK OPTIDN 违反 where 子句
我们可以创建一个只读的视图:
create or replace view v_read
as
select * from emp
with read only;
这是我们就不能对视图进行更新了。
我们可以通过desc user_views查看当前用户的视图:
SQL> desc user_views;
名称
---------------------
VIEW_NAME
TEXT_LENGTH
TEXT
TYPE_TEXT_LENGTH
TYPE_TEXT
OID_TEXT_LENGTH
OID_TEXT
VIEW_TYPE_OWNER
VIEW_TYPE
SUPERVIEW_NAME