2010-07-08 45 views
13

Algunos de los desencadenantes en mi base de datos se vuelven inválidos después de ciertos cambios en las tablas. Pero parece que todavía están trabajando. El único problema que tengo es que si uso SQL Developer, hay cruces rojas en el lado izquierdo de los activadores que indican que no son válidos. ¿Es un gran problema?El desencadenador no es válido en Oracle

Sé que puedo recompilar el desencadenador para solucionarlo, pero no estoy seguro si este es realmente un problema que vale la pena preocuparse. De ser así, tendré que revisar mis cientos de cambios anteriores y descubrir qué está causando el problema. Gracias.

Respuesta

16

Cada vez que implementamos un cambio en un objeto de base de datos, cualquier código que dependa de él se invalida. Esto afecta los desencadenantes, vistas y procedimientos almacenados. Sin embargo, la próxima vez que algo llame a ese código, la base de datos lo recompilará automáticamente.

Así que no tenemos que preocuparnos por esto, ¿verdad? Bueno, sí, hasta cierto punto. El hecho es que la invalidación de los desencadenantes (o lo que sea) es una señal de que se ha realizado un cambio que podría afectar el funcionamiento de ese activador, que podría tener efectos secundarios. El efecto secundario más obvio es que el desencadenador no se compilará. Más sutilmente, el gatillo se compila pero falla durante las operaciones.

Por lo tanto, es una buena idea forzar la recompilación de desencadenantes en un entorno de desarrollo, para garantizar que nuestro cambio no haya roto nada. Pero podemos omitir ese paso cuando implementamos nuestro cambio en la producción, porque lo hacemos con la confianza de que todo volverá a compilarse a pedido. Depende de nuestro nervio :)

Oracle proporciona mecanismos para recompilar automáticamente todos los objetos no válidos en un esquema.

  • Lo más sencillo es usar DBMS_UTILITY.COMPILE_SCHEMA(). Pero esto ha sido dudoso desde 8i (porque el soporte para Java Stored Procedures introdujo el potencial de dependencias circulares) y ya no se garantiza la compilación de todos los objetos con éxito la primera vez.

  • En 9i, Oracle nos dio un script $ORACLE_HOME/rdbms/admin/utlrp.sql que recompilaba las cosas. Desafortunadamente requiere acceso a SYSDBA.

  • En 10g agregaron el paquete UTL_RECOMP, que básicamente hace todo lo que hace esa secuencia de comandos. Este es el enfoque recomendado para recompilar grandes cantidades de objetos. Desafortunadamente también requiere acceso a SYSDBA. Find out more.

En 11g Oracle introdujo la administración de dependencias de grano fino. Esto significa que los cambios en las tablas se evalúan con una granularidad más fina (básicamente el nivel de columna en lugar de la tabla) y solo se ven afectados los objetos que se ven directamente afectados por los cambios. Find out more.

+0

Gracias, esta explicación se ve muy bien. Hice clic en el enlace de arriba de la documentación de 10g y dice Debe estar conectado COMO SYSDBA para ejecutar este script. Parece que tengo que iniciar sesión como SYSDBA de todos modos. – newguy

+0

@Newguy - oops tienes razón. – APC

0

No es un gran problema.

Simplemente haga clic derecho sobre ellos para volver a compilar y listo. Estoy escribiendo esto desde mi propia experiencia.

Si hay algún error con el código que acabas de modificar, aparecerán para que puedas arreglarlo. El compilador le dirá dónde están los problemas (números de línea, nombres de variables, etc.) en caso de errores.

+0

¿Qué sucede si ni siquiera recompilo los desencadenantes? Voy a implementar la base de datos en una docena de servidores de clientes, por lo que sería complicado recompilar todo el tiempo. – newguy

+0

Pero creo que recompilar es necesario. Puede asegurarle que no hay errores con su código de base de datos. El tiempo consume pero realmente es realmente necesario. Cuando están marcados con cruces rojas, significa que el código de las referencias de activación se modificó de alguna manera. Esta es una alerta para que pueda tomar medidas para recompilarla y afirmar que no hay ningún error que se origine a partir de los cambios en su código. –

+0

Es un GRAN problema si cientos de activadores, procedimientos, funciones y vistas no son válidos. Y me lleva una semana resolver las consecuencias de diez minutos de recompilación. – PhatHV

0

Si los desencadenadores funcionan, es probable que Oracle esté atrapando un error ORA-04068 cuando dispare el desencadenador y vuelva a intentar el desencadenante después de que se haya recompilado automáticamente.

+1

No, si intentas ejecutar cualquier activador o proceso almacenado que esté marcado como "NO VÁLIDO", Oracle primero intentará recompilarlo antes de ejecutarlo. ORA-04068 tiene que ver con el estado del paquete y no tiene nada que ver con el estado de un desencadenador. –

Cuestiones relacionadas