查看有关限制的限制?

问题描述 投票:0回答:2

我发现我们无法从视图中删除在查询中具有明显区别但我想显示示例的信息:

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中删除。因此,我对限制感到困惑吗?需要专家的帮助。

oracle view distinct
2个回答
0
投票

通过在表上运行不同操作创建的任何视图都应阻止您从视图中删除。使用上面的示例,我不同意即使tb001中没有重复项,也可以从vw_tb001中删除。


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>
© www.soinside.com 2019 - 2024. All rights reserved.