11 Mart 2012 Pazar

[TR] Oracle nesne isim çözünürlüğü mekanizması

Oracle veritabanında; SQL cümleleri içerisinde db nesne isimlerinin, aşağıdaki formatta belirtilmesi tavsiye edilir.

          şema_ismi.nesne_ismi.nesne_bileşen_ismi

Ancak SQL cümleleri içerisinde genelde bu format kullanılmaz. Çoğunlukla "şema_ismi" ve "nesne_bileşen_ismi" belirtilmez, sadece "nesne_ismi" belirtilir. Bu sebeple Oracle, SQL cümleleri içerisinde tam ve kesin olarak hangi nesnenin belirtildiğini saptamak üzere bir mekanizma geliştirmiştir. Oracle nesne
isim çözünürlüğü mekanizması. Bu mekanizma şu mantıkta çalışır;

1. SQL komutundaki birinci parça kontrol ediliyor.

 A1. Birinci parça, SQL komutunu çalıştıran db kullanıcısının şeması altındaki bir nesne ile eşleşiyor mu kontrol edilir. Eşleşiyorsa A2'ye geçilir.Eşleşmiyorsa, B1'e geçilir.



B1. Birinci parça, db'deki public synonym'lerden biriyle eşleşiyor mu kontrol edilir. Eşleşiyorsa B2'ye geçilir. Eşleşmiyorsa, C1'ye geçilir.

C1. Birinci parça, db'deki şemalardan biriyle eşleşiyor mu kontrol edilir. Eşleşiyorsa C2'ye geçilir. Eşleşmiyorsa komut hata verir.


2. SQL komutundaki ikinci parça kontrol ediliyor.

 A2. İkinci parça yoksa eşleşme tamamlanmış demektir. İkinci parça varsa; ikinci parça, nesne bileşenlerinden biriyle eşleşiyor mu diye kontrol edilir. Eşleşiyorsa, A3'e geçilir. Eşleşmiyorsa, B1'e geçilir.

 B2. İkinci parça yoksa eşleşme tamamlanmış demektir. İkinci parça varsa; ikinci parça, nesne bileşenlerinden biriyle eşleşiyor mu diye kontrol edilir. Eşleşiyorsa, B3'e geçilir. Eşleşmiyorsa, C1'e geçilir.

 C2. İkinci parça yoksa komut hata verir. İkinci parça varsa; ikinci parça, eşleşen şema altındaki bir nesne ile eşleşiyor mu kontrol edilir. Eşleşiyorsa, C3'e geçilir. Eşleşmiyorsa, komut hata verir.


3. SQL komutundaki üçüncü parça kontrol ediliyor.

A3. Üçüncü parça yoksa eşleşme tamamlanmış demektir. Üçüncü parça varsa B1'e geçilir.

B3. Üçüncü parça yoksa eşleşme tamamlanmış demektir. Üçüncü parça varsa C1'e geçilir.

 c3. Üçüncü parça yoksa eşleşme tamamlanmış demektir. Üçüncü parça varsa; üçüncü parça, nesne bileşenlerinden biriyle eşleşiyor mu diye kontrol edilir. Eşleşiyorsa, eşleşme tamamlanmış demektir. Eşleşmiyorsa, komut hata verir.





Oracle nesne isim çözünürlüğü mekanizması; db link'lerin kullanıldığı dağıtılmış db ortamlarında, isim çözümleme işleminin bir kısmını komutun çalıştırıldığı db'de geri kalan kısmını da db link'in gittiği db'de yapmak suretiyle çalışır.

Oracle nesne isim çözünürlüğü mekanizması, nesne bağımlılıkları ile iç içe çalışan karmaşık bir yapıdır. Dolayısıyla, çok dikkatli olmamızı gerektiren bazı handikapları vardır. Bunlardan en önemlisi; bağımlı bir nesnenin referans nesneleri ile arasındaki bağımlılık ilişkisinin, bu referans nesnelerle aynı isimde başka nesnelerin bulunmamasına bağlı olmasıdır. Bir takım şartlara bağlı olarak sonradan; referans nesnelerle aynı isimlerde nesneler yaratmamız, aradaki bu bağımlılık ilişkisinin kopup bağımlı nesnenin INVALID duruma düşmesine sebep olabilir. Ve hatta bağımlı nesnenin yeniden derlenmesi sonucunda, artık yeni yaratılan yanlış referans nesnelerini kullanmasına sebep olabiliriz. Ki bu, bağımlı nesnenin INVALID durumda kalmasına nazaran çok daha ciddi sorunlara sebep olabilir. Bu handikapa, "var olmayan nesnenin sonradan yaratılması handikapı" denilecektir. Örnek olarak şu senaryoyu verebiliriz;

Senaryo;
S1 şemasında T1 isimli bir tablomuz olsun. S1.T1 tablosu için PUBLIC rolüne okuma yetkisi verilmiş olsun. S1.T1 tablosu için yaratılmış, T1 isimli bir de public synonym'imiz olsun. S2 şemasında T1 isimli hiçbir nesne bulunmuyor olsun. S2 kullanıcısı kendi şemasında aşağıdaki view'i yaratmış olsun;

           CREATE VIEW S2.V1 AS SELECT ... FROM T1 GROUP BY ... ORDER BY ...;

View içerisindeki T1, public synonym'dir. Eğer view yaratılırken S2 şemasında T1 isimli bir nesne olsaydı; view, referans nesne olarak bu nesneyi kullanacaktı. Ancak olmadığı için artık T1 public synonym'ini kullanıyor ve Oracle nesne isim çözünürlüğü mekanizması bağımlılık ilişkisini T1 public synonym'ine göre kurdu. Peki, sonradan S2 şemasında T1 isimli bir nesne yaratırsak ne olur? Oracle bağımlılık ilişkisinin koptuğunu hemen tespit eder ve S2.V1 view'ini INVALID duruma alır. Ancak az önce de söylediğimiz gibi, bu senaryonu çok ciddi bir riski vardır. INVALID durumdaki S2.V1 view'i; biz daha farkına bile varmadan bir db oturumu tarafından çağırılır ve Oracle tarafından otomatik olarak başarılı bir şekilde derlenirse, artık referans nesne olarak T1 public synonym'i yerine S2.T1 nesnesini kullanmaya başlar. Bu durum çok çok ciddi sorunlara sebep olabilir.

Sonuç olarak; db'mizde, "var olmayan nesnenin sonradan yaratılması handikapı"na yakalanma ihtimalimizin olup olmadığını aşağıdaki sorgu ile öğrenebiliriz;

select * from dba_dependencies where REFERENCED_TYPE = 'NON-EXISTENT';

Hiç yorum yok:

Yorum Gönder