可更新的连接视图

时间:2018-01-03 05:31:33

标签: sql oracle11g

我目前正在使用hr scheme(EMP,DEPT Table)尝试updatable_join_view。

我尝试加入名为emp和dept的表。我也是这样看的。

create or replace view v4
as
select e.empno, e.ename, d.dname, d.loc
from emp e, dept d
where e.deptno = d.deptno;

所以,我在上面做了这样的观点,作为连接视图,e.empno列上只有一个约束为 not null

在此之后,如果我尝试使用此代码,

select *
from user_updatable_columns
where table_name = 'V4';

我可以看到这样的

OWNER      TABLE_NAME COLUMN_NAM UPDATA INSERT DELETA
---------- ---------- ---------- ------ ------ ------
ACE24      V4         EMPNO      NO     NO     NO
ACE24      V4         ENAME      NO     NO     NO
ACE24      V4         DNAME      NO     NO     NO
ACE24      V4         LOC        NO     NO     NO

为了制作可更新的连接视图,我在e.empno上添加了主键约束,以便可以保留密钥。

alter table emp
add constraint empno_pk primary key(empno);

所以,我希望我可以在dept表的dname,loc列上更新或插入或删除。但我仍然可以找到这个结果。

OWNER      TABLE_NAME COLUMN_NAM UPDATA INSERT DELETA
---------- ---------- ---------- ------ ------ ------
ACE24      V4         EMPNO      NO     NO     NO
ACE24      V4         ENAME      NO     NO     NO
ACE24      V4         DNAME      NO     NO     NO
ACE24      V4         LOC        NO     NO     NO

我想知道这是什么问题。

1 个答案:

答案 0 :(得分:0)

唯一约束需要在父级上,以便数据库知道查找不会创建重复项。

alter table dept add constraint dept_pk primary key (deptno);

alter view v4 compile;

然后我得到:

OWNER         TABLE_NAME    COLUMN_NAME   UPDATABLE INSERTABLE DELETABLE
------------- ------------- ------------- --------- ---------- ---------
DSL_OWNER_82  V4            EMPNO         YES       YES        YES
DSL_OWNER_82  V4            ENAME         YES       YES        YES
DSL_OWNER_82  V4            DNAME         NO        NO         NO
DSL_OWNER_82  V4            LOC           NO        NO         NO