Zarządzanie podprogramami składowanymi

Zależności pomiędzy podprogramami

Kiedy jakiś podprogram jest kompilowany, w słowniku danych zapisywane są wszystkie obiekty, do których odwołuje się ten podprogram. Jest on od nich bezpośrednio zależny.

Obiekty w bazie mogą być od siebie również zależne pośrednio, tworząc pewnego rodzaju łańcuchy zależności. Status podprogramu jest zaznaczany jako INVALID, jeśli jakakolwiek operacja DDL jest wykonywana na obiekcie, od którego ten podprogram zależy bezpośrednio lub pośrednio.

Jeżeli użytkownik próbuje wykonać podprogram, który ma status INVALID (rozkompilował się), to Oracle podejmuje próbę jego kompilacji oraz, jeżeli jest to potrzebne, próbę kompilacji wszystkich obiektów, od których jest zależny wołany podprogram.

Jeżeli próba ta się powiedzie, to podprogram jest wykonywany bez informowania użytkownika o zaistniałym procesie. Jeżeli próba się nie powiedzie, to zgłaszany jest błąd.

W przypadku, gdy podprogram wywołuje procedurę zawartą w pakiecie, to jest on zależny tylko od specyfikacji, tzn. przekompilowanie ciała pakietu nie spowoduje zmiany statusu podprogramu.

Zależności pomiędzy obiektami w wielu bazach

Jeżeli zmieniany jest jakikolwiek obiekt w tej samej bazie danych, to inwalidacja obiektów od niego zależnych następuje natychmiast, ponieważ zależności są zapisane w słowniku systemowym.

W przypadku zależności pomiędzy wieloma bazami danych (za pośrednictwem db linku) zależności nie są nigdzie zapisane, a zatem muszą być sprawdzane w momencie wykonywania się podprogramu.

Istnieją dwie metody sprawdzania, czy zdalny obiekt był zmieniany:

Oparta na znaczniku czasu – w słowniku user_objects kolumna LAST_DDL_TIME zawiera czas ostatniej modyfikacji. Czasy te są porównywane dla obu obiektów, i jeśli istnieje taka konieczność, to obiekt zależny zostaje przekompilowany.

Oparta na sygnaturze – (od wersji 7.3) – przy stosowaniu tej metody na podstawie nagłówka obliczany jest pewien klucz. Jeżeli ten klucz się nie zmienił, to oznacza, że chociaż zdalna procedura mogła być zmieniana, to nie trzeba rekompilować zależnej od niej innej procedury. Aby była stosowana metoda oparta na sygnaturze, należy wstawić do pliku parametrów linię REMOTE_DEPENDENCIES_MODE = SIGNATURE.

Przywileje związane z podprogramami, kontekst podprogramów

Aby wykonać jakikolwiek podprogram potrzebne jest uprawnienie EXECUTE na tym podprogramie. Użytkownik wykonujący podprogram nie musi mieć praw do obiektów, do których odwołuje się podprogram. Podprogramy są wykonywane w kontekście danych i obiektów właściciela podprogramu.

Jeżeli w podprogramie występuje pełne odwołanie do obiektu (z nazwą schematu), to użytkownik, który wykonuje podprogram musi mieć również prawa do tego obiektu i to nadane bezpośrednio (nie przez rolę).

W Oracle 8i wprowadzono możliwość wykonywania się podprogramów zarówno w kontekście praw właściciela jak i użytkownika uruchamiającego podprogram.


CREATE OR REPLACE PROCEDURE procedura1 [lista_parametrów]
[AUTHID {CURRENT_USER | DEFINER}]
IS
...
                        

Dostęp do obiektów jest określany przy kompilacji, a więc w kontekście praw właściciela, dlatego może pojawić się błąd podczas wykonywania poprawnie skompilowane j procedury, jeżeli będzie ona przeznaczona do wykonywania się w kontekście użytkownika wywołującego, który nie będzie miał odpowiednich przywilejów.

Słownik danych

Procedury, funkcje i pakiety są przechowywane w systemowym słowniku danych w postaci kodu źródłowego i w postaci skompilowanej. Nie dotyczy to podprogramów lokalnych, które są przechowywane wraz z podprogramami, w których są zdefiniowane.

Informacja o podprogramach jest dostępna w wielu różnych widokach słownika systemowego.

user_objects

Przechowuje informację między innymi o podprogramach, oraz o tym, czy są skompilowane poprawnie, czy też muszą byś zrekompilowane.

user_source

Zawiera kod źródłowy podprogramów.

user_errors

Zawiera informacje o błędach, jakie wystąpiły podczas kompilacji podprogramu.

user_dependencies

Zawiera informacje o wszystkich zależnościach pomiędzy obiektami użytkownika, w tym również o podprogramach.