Za każdym razem, gdy wprowadzamy zmianę w obiekcie bazy danych, każdy kod od niej zależny jest unieważniany. Ma to wpływ na wyzwalacze, widoki i procedury składowane. Jednak następnym razem, gdy coś wywoła ten kod, baza danych automatycznie go ponownie skompiluje.
Więc nie musimy się tym martwić, prawda? No tak, do pewnego momentu. Chodzi o to, że unieważnienie wyzwalaczy (lub czegokolwiek) jest dla nas flagą, że została dokonana zmiana, która może wpłynąć na działanie tego wyzwalacza, co może mieć skutki uboczne. Najbardziej oczywistym efektem ubocznym jest to, że wyzwalacz nie skompiluje się. Bardziej subtelnie, wyzwalacz kompiluje się, ale kończy się niepowodzeniem podczas operacji.
Dlatego dobrym pomysłem jest wymuszenie ponownej kompilacji wyzwalaczy w środowisku deweloperskim, aby upewnić się, że nasza zmiana zasadniczo niczego nie zepsuła. Ale możemy pominąć ten krok, gdy wdrażamy naszą zmianę w środowisku produkcyjnym, ponieważ jesteśmy tak pewni, że wszystko zostanie ponownie skompilowane na żądanie. Zależy od naszych nerwów :)
Oracle udostępnia mechanizmy automatycznej ponownej kompilacji wszystkich nieprawidłowych obiektów w schemacie.
-
Najprostszym jest użycie
DBMS_UTILITY.COMPILE_SCHEMA()
. Ale było to podejrzane od wersji 8i (ponieważ obsługa procedur składowanych Java wprowadziła potencjalne zależności cykliczne) i nie gwarantuje już pomyślnej kompilacji wszystkich obiektów za pierwszym razem. -
W 9i Oracle dał nam skrypt
$ORACLE_HOME/rdbms/admin/utlrp.sql
który przekompilował rzeczy. Niestety wymaga dostępu SYSDBA. -
W 10g dodali pakiet UTL_RECOMP, który w zasadzie robi wszystko, co robi ten skrypt. Jest to zalecane podejście do ponownej kompilacji dużej liczby obiektów. Niestety wymaga również dostępu SYSDBA. Dowiedz się więcej .
W 11g Oracle wprowadził drobnoziarniste zarządzanie zależnościami. Oznacza to, że zmiany w tabelach są oceniane z większą szczegółowością (zasadniczo na poziomie kolumn, a nie na poziomie tabeli) i dotyczy to tylko obiektów, na które zmiany mają bezpośredni wpływ. Dowiedz się więcej .