提供了一个雇员表table1,我必须创建一个视图,列出具有管理职位的雇员。没问题。 然后必须从此视图列出属于部门10的人员。没问题。 但是随后,我仍然持相同观点,要求我插入一个属于部门20的新推销员。 这样做时,新创建的行不会出现在视图中,但会出现在原始table1中。我不懂为什么。这是我的代码:
-- I create the view here
create view v_senior
as
select *
from emp
where job like 'manager' or job like 'president';
--Here I filter by department 10
select *
from v_senior
where deptno = 10;
-- Here I try to add the new Salesman
insert into v_senior (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values(8888,'Luxian', 'SALESMAN', '5678', '2019-06-06', '100000', '500', 20)
在这里,当我尝试从v_senior中获取所有数据时,仅返回的数据是处于管理职位的员工,而没有我新加推销员的迹象。但是,当我从emp(原始表)中获取所有数据时,就会出现该推销员。请问有人给我一个解释,我不知道出了什么问题,感到迷茫。 非常感谢。
答案 0 :(得分:0)
由于视图中的过滤条件,您的视图正在过滤出新数据。
由于这是一个家庭作业问题,我假设讲师可能正在要求您直接将不匹配的行插入EMP表中,并观察到它在视图中不可见(这就是视图的目的)。但是您通过在视图中插入发现了一个更有趣的情况,这种“消失的行”行为是众所周知的现象。
您可以轻松防止“消失的行”行为:
create view v_senior
as
select *
from emp
where job like 'manager' or job like 'president'
with check option;
带有检查选项位告诉Oracle验证查询视图时,您使用该视图所做的任何更改(INSERTS或UPDATES)仍然可见。 存在此功能是为了防止出现类似情况。
这是一项可选功能,如果您未启用它,您将不时看到“消失行”问题。
在新视图中,我做了一个(稍作修改)插入:
insert into v_senior (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values(8888,'Luxian', 'SALESMAN', '5678', DATE'2019-06-06', '1000', '500', 20)
并收到此错误:
ORA-01402:使用检查选项查看子句违反情况
这是预期的。