13 Ocak 2010 Çarşamba

Synonym

Merhaba,

Oracle veritabanında bulunan objelere "synonym" olarak bilinen takma isimler verilebilir. Bu takma isimleri kullanmamızdaki sebeplerden birkaçı, başka kullanıcıların synonym'i yaratan kullanıcının objesine direkt erişim sağlayabilmeleri ya da veri güvenliğinin sağlanması olarak özetlenebilir. Bir diğer avantajı ise uzun isimlendirilmiş obje isimlerinin kısaltılmasıdır.

Synonym'ler CREATE SYNONYM komutu koşturularak yaratılırlar ve PUBLIC ya da PRIVATE olabilirler. PUBLIC synonym'leri bütün veritabanı kullanıcıları okuyabilirken, PRIVATE synonym'leri sadece yaratan kullanıcı okuyabilir. Sonuçta PRIVATE synonym yaratmak biraz daha güvenli olacaktır ancak kullanım alanına da dikkat etmek gerekiyor.

Synonym'lerin devreye girdiği en önemli nokta ise bir SELECT bloğundaki kullanımları. Bu konu üzerine çok fazla soru gelir ve sertifikasyon sınavlarında bile karmaşık synonym soruları sorulabilir. Ben şimdi sorgudaki sıralamadan bahsetmek istiyorum.

Diyelim aşağıdaki gibi bir sorgu koşturduk (HR kullanıcısı ile);

SQL > SELECT EMP_NO, EMP_NAME FROM EMPLOYEES;

Yukarıdaki sorgunun ilk bakacağı EMPLOYEES objesi, HR şeması içerisindeki EMPLOYEES view ya da tablosudur. Eğer böyle bir obje geçerli ise tablodaki bütün emp_no ve emp_name bilgileri döndürülecektir. Ancak HR şemasında böyle bir view ya da tablo yoksa Oracle'ın ikinci adımda bakacağı bilgi PRIVATE synonym'i olup olmadığıdır. PRIVATE synonym ile isimlendirilmiş bir tablo ya da view'dan veri getirilecektir. Bu noktada aşağıdaki örneği dikkatli incelemenizde fayda var;

# sqlplus nortel_switching/*******@

SQL*Plus: Release 10.2.0.4.0 - Production on Wed Jan 13 16:52:47 2010

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> desc brstat;
Name Null? Type
----------------------------------------- -------- ----------------------------
DATETIME_INS DATE
DATETIME NOT NULL DATE
SWITCH_NAME NOT NULL VARCHAR2(50)
DURATION NUMBER
BRSCAP NUMBER
BRSCMPLX NUMBER
BRSSCHED NUMBER
BRSFORE NUMBER
BRSMAINT NUMBER
BRSDNC NUMBER
BRSOM NUMBER
BRSGTERM NUMBER
BRSBKG NUMBER
BRSIDLE NUMBER
BRSAUXCP NUMBER
BRSNETM NUMBER
BRSSNIP NUMBER

Yukarıda BRSTAT isimli bir objemizin olduğu anlaşıldı. Şimdi bu isimle bir synonym yaratmaya çalışıyorum;

SQL> create synonym BRSTAT for BRSTAT;
create synonym BRSTAT for BRSTAT
*
ERROR at line 1:
ORA-01471: cannot create a synonym with same name as object

Yaratırken yukarıdaki hatayı aldım. Bir obje ile aynı isimli synonym yaratılamayacağını öğrendim. Şimdi ise private değil de, public synonym yaratmak istiyorum;

SQL> create public synonym BRSTAT for nortel_switching.BRSTAT;
create public synonym BRSTAT for nortel_switching.BRSTAT
*
ERROR at line 1:
ORA-01031: insufficient privileges

Yine yaratamadım çünkü create synonym hakkına sahip bir kullanıcı ile bağlanmadım. Bu hakka sahip bir kullanıcı ile bağlanıyorum.

SQL> conn system/******
Connected.
SQL> create public synonym BRSTAT for nortel_switching.BRSTAT;

Synonym created.

BRSTAT isminde bir public synonym tanımladım ve başarılıyla yaratıldı. Bu noktadan itibaren bütün veritabanı kullanıcı ben aşağıdaki hakkı verdikten sonra nortel_switching kullanıcısın BRSTAT tablo ya da view'ına erişim sağlayabilecek;

SQL> conn nortel_atm/password
Connected.
SQL> select * from BRSTAT where rownum <>
select * from BRSTAT where rownum <>
*
ERROR at line 1:
ORA-00942: table or view does not exist

SQL> conn system/******
Connected.
SQL> grant select on brstat to public;

Grant succeeded.

SQL> conn nortel_atm/password
Connected.
SQL> select * from BRSTAT where rownum <>

DATETIME_ DATETIME SWITCH_NAME DURATION BRSCAP BRSCMPLX BRSSCHED BRSFORE BRSMAINT BRSDNC BRSOM BRSGTERM BRSBKG BRSIDLE BRSAUXCP BRSNETM BRSSNIP
--------- --------- -------------------------------------------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
12-OCT-09 12-OCT-09 AFYNTUSHDS0 15 0 335 196 24 51 5 33 1 752 0 13 0 5
12-OCT-09 12-OCT-09 ANTLTUALDS0 15 0 197 201 24 51 5 37 0 665 0 13 0 5
12-OCT-09 12-OCT-09 ISBLTUTT02T 15 14 408 87 30 38 105 29 0 621 0 3 0 2
12-OCT-09 12-OCT-09 AGRITUAG01T 15 0 238 180 31 56 5 30 1 873 0 13 0 5
12-OCT-09 12-OCT-09 GRSNTUBACG0 15 0 199 197 28 51 5 28 0 769 0 13 0 5


Yukarıdaki örnekler dikkatli incelendiği zaman public synonym'in neye yaradığı gözükmektedir. Şimdi gelelim sıralamaya;

1) Sorgu sahibi kullanıcının kendi objesine bakılır. (OBJE)
2) Sorgu sahibi kullanıcının kendi objesi yoksa private synonym aranır. (PRIVATE SYNONYM)
3) Private synonym de bulunamazsa Public synonym kontrol edilir. (PUBLIC SYNONYM)

Synonym'lerin gerçekten kullanışlı olduğunu ve çok kuvvetli olduklarını belirtmem gerekiyor.

İyi çalışmalar dilerim,

Ogan


Hiç yorum yok:

Takip et: @oganozdogan