与其他模式对象不同,为什么我们不能删除引用的类型

时间:2017-12-28 01:21:36

标签: oracle plsql user-defined-types

当尝试删除或替换具有依赖项的Type时,oracle会抛出错误。与删除对象的其他模式对象(如过程)不同,它会被删除,依赖对象获得invalid。我的两个问题是

1)为什么Type如此特殊以至于当它具有依赖性时它会阻止掉落/替换。

2)什么逻辑分离了Type的上述行为。

创建

ORA-02303: cannot drop or replace a type with type or table dependents.

1 个答案:

答案 0 :(得分:3)

  

"为什么Type非常特别"

类型和程序之间存在两个差异。

  1. 子类型对其超类型具有绝对依赖性。如果存储过程依赖于函数,并且我们删除该函数,则该过程无效。但是我们只需编辑代码就可以使程序有效,因此它不会使用该功能。如果我们丢弃超类型,则子类型永久失效;我们无法编辑它以消除它对超类型的依赖,因为超类型定义它。简单地说,在我们重新创建超类型之前,子类型是不可操作的。

  2. 我们可以使用Type来声明数据库表和表列。这些是具有持久状态的结构:由于数据,我们不能像存储过程那样使表列无效。如果我们删除数据库表使用的Type,我们将丢失Type结构中保存的数据。

  3. 有一种语法可以删除带有依赖关系的Type而不会抛出ORA-02303:

    <option *ngFor="let type  of ListType" [ngValue]="type " [attr.selected]="type .name== type.name ? true : null">{{ type.name  }}</option>

    这会使所有子类型无效,并且 - 更彻底地 - 将任何相关表列设置为drop type my_type force; 并使任何相关表无效。有效删除unused表列;它的数据无法访问。要恢复未使用的列(或无效的表),需要a tablespace point-in-time recovery on an auxilliary instance,这不是一项微不足道的工作。 (很容易无意中使数据无法恢复是对象关系表不是一个好主意的一个原因。)