Objetos inválidos en Oracle

Oracle-logo

En Oracle es muy común tener objetos inválidos, sin embargo, para la coherencia de nuestra base de datos, no es lo ideal. Por lo cual es muy importante y hace parte de nuestro trabajo como DBA’s, mantener esta coherencia con un constante análisis.

La razón por la que deberíamos evitar estos objetos en nuestra base de datos, se debe a que si en algún momento requerimos utilizar cualquiera de estos o algún otro objeto que haga utilidad de este, nos va a presentar error, puesto que al tener un estado invalido, no será posible utilizarlo.

Las consultas descritas a continuación, son las que por mi parte utilizo día a día para hacer un análisis y evaluar cómo actuar ante la situación, pues me permite compilar los objetos de se posible.

Validar objetos inválidos

Para hacer un conteo de los objetos que tiene nuestra base de datos, ejecutar el siguiente query

SQL> SELECT COUNT(1) DATO
FROM DBA_OBJECTS
WHERE STATUS != 'VALID';

      DATO
----------
         1

Así mismo, para obtener el nombre de esos objetos, podemos utilizar este otro query

SQL> SET LINES 999
SET PAGES 999
COL OWNER FORMAT A10
COL OBJECT_TYPE FORMAT A20
COL OBJECT_NAME FORMAT A40
SELECT OWNER, OBJECT_TYPE, OBJECT_NAME
FROM DBA_OBJECTS
WHERE STATUS != 'VALID'
ORDER BY OWNER, OBJECT_TYPE;

OWNER                OBJECT_TYPE                    OBJECT_NAME
-------------------- ------------------------------ --------------------------------------------------
SYS                  TRIGGER                        TRGVGUARDACONEXIONES

Ya sabemos identificar estos objetos . Pero ahora, ¿Cómo podemos recopilarlos?

Recopilación de objetos

Oracle nos ofrece una herramienta para la recopilación de los objetos

SQL> @?/rdbms/admin/utlrp.sql;

Sin embargo, no siempre es la forma más útil de realizarlo, pues en algunas ocasiones puede que no compile todos los objetos. Por lo que se debe recopilar los objetos de forma manual

SQL> SET LINESIZE 999
SET PAGESIZE 999
COL OWNER FOR A10
COL OBJECT_TYPE FOR A20
COL OBJECT_NAME FOR A40
COL COMPILAR FOR A80
SELECT OWNER, OBJECT_TYPE, OBJECT_NAME, LAST_DDL_TIME,
  DECODE( OBJECT_TYPE, 'PACKAGE BODY','ALTER PACKAGE '||OWNER||'.'||OBJECT_NAME||' COMPILE BODY;','ALTER '||OBJECT_TYPE||' '||OWNER||'.'||OBJECT_NAME||' COMPILE;') COMPILAR
FROM DBA_OBJECTS
WHERE STATUS != 'VALID'
ORDER BY LAST_DDL_TIME;

OWNER      OBJECT_TYPE          OBJECT_NAME                              LAST_DDL_ COMPILAR
---------- -------------------- ---------------------------------------- --------- --------------------------------------------------------------------------------
SYS        TRIGGER              TRGVGUARDACONEXIONES                     11-NOV-20 ALTER TRIGGER SYS.TRGVGUARDACONEXIONES COMPILE;

Los objetos inválidos no siempre son recopilados de esta manera, pues aunque si es una ayuda, en ocasiones debido a que tienen fallas internas en el código. Se deben analizar y solventar para una compilación exitosa.

¿Qué hago si no compila?

La única manera de compilar objetos inválidos que no compilan de forma automática con los querys anteriormente descritos. Es analizar el error entregado tras la siguiente consulta y de esta manera, solucionar de forma manual el error presentado.

SET LINESIZE 999
SET PAGESIZE 999
COL OWNER FOR A10
COL TYPE FOR A20
COL NAME FOR A40
COL TEXT FOR A80
COL ATTRIBUTE FOR A20
SELECT OWNER, TYPE, NAME, SEQUENCE, LINE,
  POSITION, TEXT, ATTRIBUTE, MESSAGE_NUMBER
FROM DBA_ERRORS WHERE NAME = '<NOMBRE_OBJETO>';

 

Acerca de JulianOrtiz0506

Soy administrador de bases de datos y desarrollador web, desde mis inicios en el mundo de la informática, he implementando proyectos personales y empresariales. Por consiguiente esto me ha permitido contar con una amplia calificación y destreza sobre mis áreas de conocimiento. Sobre todo suelo estar en constante aprendizaje, diariamente me estoy informando sobre nuevas tecnologías. Ya queme gusta estar actualizado en la tecnología de punta para todas las plataformas que me apasionan y con las cuales trabajo día a día.

Ver todas las entradas de JulianOrtiz0506 →

Deja una respuesta

Tu dirección de correo electrónico no será publicada.