Objetos inválidos después de un alter

En este post, muestro una peculiaridad de Oracle. Esta se basa en el hecho de que cuando un objeto como una tabla es alterado en su estructura o en la forma en que está almacenada en la base de datos, los programas que hacen referencia a ella, aparecen como inválidos.

Aquí, de inicio, se requiere una herramienta para poder analizar las dependencias de los programas y las tablas que son usadas en ellos, y que se encuentran almacenados en la base de datos para un usuario. Dicha herramienta, será el siguiente query; el cual, nos ayudará para mostrar dicha información:

select name, type, referenced_owner, referenced_name, referenced_type
from   dba_dependencies
where  owner = upper ('&propietario')
order by 1, 2, 3, 4;

Basta con ejecutarlo con un usuario con el rol DBA o con SYS o SYSTEM. Con esto veremos qué programas se invalidarán si hacemos un alter a alguna tabla.

Aquí, hay que considerar una característica especial de Oracle. Al momento de ejecutar una función, procedimiento o paquete,  se intenta compilar de nuevo de manera automática. Si estaba inválido, este puede quedar en estatus válido nuevamente.

Sin embargo, volviendo al caso de que se modifique un objeto de la base de datos como una tabla; si la modificación hecha a la tabla, tiene una repercusión directa en la forma en que es accesada dentro del programa almacenado inválido, causará que aunque se intente compilar, seguirá manteniendo el estatus de inválido.

Esto es, por ejemplo si dentro del programa hay un query, y en él, se hace un select sobre un determinado número de campos; y con el cambio, uno de ellos dejó de existir. En el código siguiente, muestro un ejemplo de lo que menciono en este post:

SQL> select object_name, object_type
     from   user_objects
     where  status = 'INVALID'
     order by 2, 1;
no rows selected

SQL> alter table rit_access_trail drop partition RAT200804;
Table altered.

SQL> select object_name, object_type
     from   user_objects
     where  status = 'INVALID'
     order by 2, 1;
OBJECT_NAME                    OBJECT_TYPE ------------------------------ -------------------- RIT_AUDIT_TRAIL                PACKAGE BODY

SQL> exec rit_audit_trail.password_change ('prueba24');
PL/SQL procedure successfully completed.

SQL> select object_name, object_type
     from   user_objects
     where  status = 'INVALID'
     order by 2, 1;
no rows selected

SQL>

Si la información de este post te ha sido de utilidad o quieres que agregue algo más, deja por favor un comentario, contestaré a la brevedad.

About these ads

3 Responses to Objetos inválidos después de un alter

  1. Manuel Pérez dice:

    Hola,

    estoy intentando realizar una traza pero al ejecutar la línea

    exec rit_audit_trail.process_trail(sysdate);

    me da el siguiente error:

    ERROR en línea 1:
    ORA-06550: línea 1, columna 7:
    PLS-00201: el identificador ‘RIT_AUDIT_TRAIL.PROCESS_TRAIL’ se debe declarar
    ORA-06550: línea 1, columna 7:
    PL/SQL: Statement ignored

    Alguien me podría echar una mano?

    Parece ser que necesito tener el package RIT_AUDIT_TRAIL, cómo podría conseguirlo?

    Muchas gracias.

  2. orlandoolguin dice:

    Hola Manuel,

    El paquete RIT_AUDIT_TRAIL es uno que desarrollé hace tiempo. Si quieres replicar lo que muestro en este post, te sugiero los pasos:

    1. Crear o disponer de una tabla.
    2. Crear un programa almacenado que haga uso de la tabla de alguna forma.
    3. Probar y ver el estatus del programa almacenado.

    Repetir los siguientes pasos las veces que gustes para probar lo que muestro en este post:
    4. Alterar la tabla.
    5. Ver el estatus del programa almacenado.
    6. Ejecutar el programa almacenado.

    Orlando.

  3. Pingback: Problema al usar roles « Orlando Olguín Olvera

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 488 seguidores

A %d blogueros les gusta esto: