检查所有无效的表依赖关系并动态重新编译它们

时间:2019-06-13 23:51:28

标签: sql oracle plsql

我修改了表的两列,现在我具有无效的依赖关系,我需要检查所有这些依赖关系并动态重新编译

原来是

CREATE TABLE AHO_CUENTA_AHORRO 
(
    ID_CUENTA NUMBER(8) NOT NULL,
    ID_SOCIO NUMBER(12) NOT NULL,
    ESTADO VARCHAR2(1) NOT NULL,
    TASA_INTERES NUMBER(3,1) NOT NULL,
    FECHA_APERTURA DATE NOT NULL,
    FECHA_CANCEL DATE,
    SALDO_BLOQUEADO NUMBER(12) NOT NULL,
    SALDO_DISPONIBLE NUMBER(12) NOT NULL,

    CONSTRAINT PK_ID_AHORRO PRIMARY KEY (ID_CUENTA)
);

ALTER TABLE AHO_CUENTA_AHORRO 
    ADD CONSTRAINT SOCIO_CUENTA_AHORRO_FK
        FOREIGN KEY (ID_SOCIO)
        REFERENCES SOC_SOCIO (ID_SOCIO);

ALTER TABLE AHO_MOVIMIENTOS_CUENTA 
    ADD CONSTRAINT CUENTA_AHORRO_MOVIMIENTOS
        FOREIGN KEY (ID_CUENTA)
        REFERENCES AHO_CUENTA_AHORRO (ID_CUENTA);

现在我添加了这个

ALTER TABLE AHO_CUENTA_AHORRO
ADD (
SALDO_REAL  NUMBER(12) DEFAULT 0 NOT NULL,
ID_TARIFARIO NUMBER(15) DEFAULT 1 NOT NULL,
 CONSTRAINT FK_TARIFA FOREIGN KEY (ID_TARIFARIO) REFERENCES TARIFARIO(ID))

1 个答案:

答案 0 :(得分:5)

要识别无效对象,可以运行以下查询:

SELECT * FROM all_objects WHERE status = 'INVALID';

然后您可以使用下面的DDL手动对它们进行手动编译:

ALTER <object_type> <object_name> COMPILE;

例如:

ALTER VIEW some_invalid_view COMPILE;

如果您只有几个无效的对象而没有很多依赖性,那么这种方法可能会很好地工作。

另一种方法是调用下面的过程,该过程按依赖关系顺序编译指定架构中的无效对象。

DBMS_UTILITY.compile_schema(schema => '<your_schema>', compile_all => false);

compile_all => false仅编译无效的对象。

here