我发现以下信息:我们无法从视图中删除查询中有区别的行,但我想显示示例:
create table tb001 ( id number );
insert into tb001 values (1);
insert into tb001 values (2);
create table tb002 ( id number );
insert into tb002 values (1);
insert into tb002 values (2);
insert into tb002 values (2);
create view vw_tb001 as select distinct(id) from tb001;
create view vw_tb002 as select distinct(id) from tb002;
所以在第一个版本中,我们可以从视图vw_tb001
中删除,因为我们没有重复的行
在第二个版本中,我们无法从视图vw_tb002
中删除。
因此,我对限制感到困惑吗?需要专家的帮助。
答案 0 :(得分:0)
通过在表上运行独特操作创建的任何视图都应阻止您从视图中删除。使用上面的示例,即使tb001中没有重复项,我也不同意您可以从vw_tb001中删除。
答案 1 :(得分:0)
从技术上讲,您仍然可以从这种视图中删除行。就是这样。
首先测试用例:
SQL> drop table tb002;
Table dropped.
SQL> create table tb002 ( id number );
Table created.
SQL> insert into tb002 values (1);
1 row created.
SQL> insert into tb002 values (2);
1 row created.
SQL> insert into tb002 values (2);
1 row created.
SQL> create view vw_tb002 as select distinct(id) from tb002;
View created.
SQL>
关键字:代替触发器;我将创建一个“替换”删除功能。插入或更新也可以这样做。基本上,它告诉Oracle从视图中删除时该怎么做,所以-“代替”从视图中删除行,而是从其基础表中删除行:
SQL> create or replace trigger trg_iof_vw
2 instead of delete on vw_tb002
3 for each row
4 begin
5 delete from tb002 where id = :old.id;
6 end;
7 /
Trigger created.
SQL>
让我们看看它是如何工作的:
开头的内容:
SQL> select * from tb002;
ID
----------
1
2
2
SQL> select * from vw_tb002;
ID
----------
1
2
删除:
SQL> delete from vw_tb002 where id = 2;
1 row deleted.
结果:
SQL> select * From tb002;
ID
----------
1
SQL> select * from vw_tb002;
ID
----------
1
SQL>