加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

oracle SQL篇(八)-视图创建当中的with check option约束

(2012-04-14 17:10:22)
标签:

sql小知识

视图约束

杂谈

分类: oracle技术

视图创建当中的with check option约束

视图创建过程当中,在语句的最后可以添加两个约束1、with read only 2、with check option,对于with read only比较好理解,就是说视图创建之后只允许查询操作,而不能做DML语句。那么with check option约束表示什么意思呢?我们来看一个小实验。

 

首先使用scott用户登录,创建一个测试表demo
sys@DB01> conn scott/tiger
Connected.
scott@DB01> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
DEPT                           TABLE
EMP                            TABLE
BONUS                          TABLE
SALGRADE                       TABLE

scott@DB01> create table demo as select empno,ename,sal,deptno from emp;

Table created.

scott@DB01> set pagesize 100
scott@DB01> select * from demo;

     EMPNO ENAME             SAL     DEPTNO
---------- ---------- ---------- ----------
      7369 SMITH             800         20
      7499 ALLEN            1600         30
      7521 WARD             1250         30
      7566 JONES            2975         20
      7654 MARTIN           1250         30
      7698 BLAKE            2850         30
      7782 CLARK            1200         10
      7788 SCOTT            3000         20
      7839 KING             5000         10
      7844 TURNER           1500         30
      7876 ADAMS            1100         20
      7900 JAMES             950         30
      7902 FORD             3000         20
      7934 MILLER           1300         10

14 rows selected.


创建视图v1,显而易见这是一个简单视图,默认是可以使用DML语句的,我们在最后加了一个约束with check option,这个约束的意思是说,如果你对视图v1操作,只能操作10号部门的记录,我们来看下面的演示

scott@DB01> create view v1 as select deptno,ename,sal from demo where deptno=10 with check option;
View created.

插入10号部门的数据,可以。当然了记录最终是被插入到底层的基表demo
scott@DB01> insert into v1 values(10,'TOM',1200);
1 row created.

scott@DB01> commit;
Commit complete.

scott@DB01> select * from demo;

     EMPNO ENAME             SAL     DEPTNO
---------- ---------- ---------- ----------
      7369 SMITH             800         20
      7499 ALLEN            1600         30
      7521 WARD             1250         30
      7566 JONES            2975         20
      7654 MARTIN           1250         30
      7698 BLAKE            2850         30
      7782 CLARK            1200         10
      7788 SCOTT            3000         20
      7839 KING             5000         10
      7844 TURNER           1500         30
      7876 ADAMS            1100         20
      7900 JAMES             950         30
      7902 FORD             3000         20
      7934 MILLER           1300         10
           TOM              1200         10

15 rows selected.

 

插入20号部门,不被允许,修改20号部门,同样也不被允许,oracle会报错ora-01402,违反约束

scott@DB01> insert into v1 values (20,'JACK',1500);
insert into v1 values (20,'JACK',1500)
            *
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation


scott@DB01> select * from v1;

    DEPTNO ENAME             SAL
---------- ---------- ----------
        10 CLARK            1200
        10 KING             5000
        10 MILLER           1300
        10 TOM              1200

scott@DB01> update v1 set deptno=30 where ename='TOM'
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation

 

其实根据上面的视图的例子,我们可以做一个扩展,我们知道在insert语句后面同样可以使用子查询,其实从本质上来讲,我们把子查询看成是一个视图就可以非常容易理解了,既然是这样,在子查询当中,也是可以使用with check option的。

 

scott@DB01> insert into (select empno,ename,deptno from emp where deptno=20 with check option)
         values(1000,'ROSE',20);
1 row created.

scott@DB01> commit;
Commit complete.

scott@DB01> insert into (select empno,ename,deptno from emp where deptno=20 with check option)
  values(1000,'ROSE',10);
insert into (select empno,ename,deptno from emp where deptno=20 with check option)
                                            *
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation


 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有