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>';
Te invito a seguir consultando más articulos relacionados a Oracle dando clic aquí.