Oracle PL/SQL proqramlarında asılılıqların idarəsi
Bu yazıda Oracle 10g və 11g VBİS-lərində PL/SQL proqramlarında asılılıqları idarəsi və fərqlərini izah etməyə izah edəcəm.
Oracle VBİS-i PL/SQL proqramlarının digər obyektlərdən asılılığını tam obyekt səviyyəsində izləyir. Bu o deməkdir ki, hər hansı bir cədvələ yeni sütun əlavə edilsə, ondan asılı olan bütün obyektlər(view, procedure, function və s.) avtomatik olaraq invalid olacaq. Amma bizim prosedur məntiqi olaraq yeni əlavə edilmiş sütundan asılı deyil, onu istifadə etmir. Eyni məsələ bizim prosedurun select etmədiyi hər hansı bir sütunun tipinin dəyişməsi üçün də keçərlidir. Cədvəlin hər hansı bir sütunu dəyişdirildikdə, bizim prosedur ondan asılı olmasa da Oracle VBİS-i onu avtomatik olaraq invalid edir. Oracle 11g VBİS-də bu vəziyyət müsbət yöndə dəyişdirilmişdir. Artıq Oracle 11g VBİS-i asılılıqları tam obyekt səviyyəsində yox, daha kiçik səviyyədə izləyə bilir.
Bu məsələyə əvvəlcə Oracle 10g VBİS üzərində baxaq.
SYS istifadəçisi ilə Oracle 10g VBİS-nə qoşuluruq.
HR istifadəçisi altında aşağıdakı paketi yaradırıq:
create or replace package hr.pkg_test is function get_manager(p_employee_id in number) return varchar2; end pkg_test; create or replace package body hr.pkg_test as function get_manager(p_employee_id in number) return varchar2 is l_manager varchar2(50); begin select m.first_name || ' ' || m.last_name into l_manager from hr.employees e, hr.employees m where e.manager_id=m.employee_id and e.employee_id=p_employee_id; return l_manager; end get_manager; end pkg_test;
Yeni yaratdığımız paketin cari vəziyyətini yoxlayırıq.
select object_name, object_type, status from all_objects where owner='HR' and object_name='PKG_TEST'
Paket içərisindəki GET_MANAGER funksiyası verilmiş işçi koduna əsasən onu rəhbərinin adını, soyadını qaytarır. Bu funksiya HR.EMPLOYEES cədvəlinin EMPLOYEE_ID, MANAGER_ID, FIRST_NAME və LAST_NAME sütunlarından asılır. Bu cədvəlin strukturu aşağıdakı kimidir:
İndi isə bu cədvəldəki email sütununu aşağıdakı kimi dəyişək:
alter table hr.employees modify email varchar2(40);
Paketin cari vəziyyətinə baxaq:
Gördüyünüz kimi GET_MANAGER funksiyası email sütunundan asılı olmasa, bütün paket invalid oldu.
GET_MANAGER funksiyasını istifadə etsək, Oracle əvvəlcə paketi kompilyasiya edəcək, statusu valid olduqdan sonra onu istifadə etməyimizə imkan verəcək.
select hr.pkg_test.get_manager(110) from dual;
Oracle 11g VBİS-də asılılıqların idarəsi daha da inkişaf etdirilmilmişdir, artıq PL/SQL proqramlarının asılılığı obyektin içindəki elementlər səviyyəsində izlənilir. Eyni əməliyyatları Oracle 11g VBİS-də yoxlayaq.
Əvvəlcə SYS istifadəçisi ilə Oracle 11g VBİS-nə qoşuluruq.
Eyni paketi yeni bazada yaradıb vəziyyətini yoxlayaq:
Email sütununu aşağıdakı kimi dəyişib paketin statusunu təkrar yoxlayaq:
alter table hr.employees modify email varchar2(40);
Gördüyünüz kimi paketin statusu valid olaraq qaldı, çünki o email sütunundan asılı deyil.
İndi isə manager_id sütununu aşağıdakı kimi dəyişək və paketin cari vəziyyətinə baxaq:
alter table hr.employees modify manager_id number(7);
Gördüyünüz kimi manager_id sütunu dəyişildikdən sonra paket avtomatik olaraq invalid oldu, çünki həmin sütun get_manager funksiyasında istifadə olunur.
Fine-grained dependency haqqında daha ətraflı məlumat almaq üçün aşağıdakı qaynağa müraciət edə bilərsiniz:
Oracle® Database Advanced Application Developer’s Guide, 11g Release 2 (11.2), Part Number E10471-05, “18.Schema Object Dependency”
Ümid edirəm ki, Oracle 11g VBİS-dəki bu yenilik aydın oldu. Sual, tənqid və təklifləriniz üçün şərh yazmaqdan çəkinməyin!
Uğurlar!
Cox gozel izah elemisen Ramin, tesekkurler.
Ulfet
8 Sentyabr 2010
Çox sağ ol.
Ramin Orucov
8 Sentyabr 2010