GUID (Globally Unique Identifier) leri eşsiz ID ler yaratmak için sıkça kullanırız. GUID lerinde SEQUENCE’lardan farkı bizim için sıralı olmayan ve tahmin edilmesi çok zor olan karakter kümesi üretmesidir. Bu eşsiz ID leri de güvenlik amaçlı olarak yaygın olarak kullanılır.

Ben sizlere Oracle da GUID üretmek için kullanılan SYS_GUID() fonksiyonundan biraz bahsedeceğim.
  • SYS_GUID() fonksiyonu da oracle’ın pek çok “build-in” fonksiyonu gibi SYS.STANDARD paketindedir.
  • SYS_GUID() fonksiyonu çağrıldığında bize RAW tipinde 32 karakterlik rakam ve büyük harflerden oluşan eşsiz bir karakter kümesi döner.
  • SYS_GUID()’yi Oracle daki ROWID ile karıştırmamak gerekir. ROWID farklı bir konudur.  Oracle dökümantasyonundaki açıklaması (1) :
SYS_GUID generates and returns a globally unique identifier (RAW value) made up of 16 bytes. On most platforms, the generated identifier consists of a host identifier, a process or thread identifier of the process or thread invoking the function, and a nonrepeating value (sequence of bytes) for that process or thread.

Aşağıdaki görüldüğü gibi SYS_GUID sorgulandığında her zaman bize eşsiz bir ID  getirmektedir.

SQL> SELECT E.EMPLOYEE_ID, ROWID, SYS_GUID(), SYS_GUID() FROM EMPLOYEES E ORDER BY 1;


EMPLOYEE_ID ROWID              SYS_GUID()                       SYS_GUID()
----------- ------------------ -------------------------------- --------------------------------
        100 AAAEAUAAEAAAADNAAA 2821F6A306944EC5B8197B46F7249204 65CF4539C76F4F049689A9650025A551
        101 AAAEAUAAEAAAADNAAB 01B97056FFEE45D08728E97D4AB3FB9A F8EE170E33924477B8195F233870AFDF
        102 AAAEAUAAEAAAADNAAC 94D432B4F6B84F94B55C7DE56EB618C5 ACA81875CEDE42D8904354E7E61D88F2
        103 AAAEAUAAEAAAADNAAD 7768CE4398DF41DEB84D575ABEEA46C3 7433523FEF2B48F48F30E623FD9AAB1F
        104 AAAEAUAAEAAAADNAAE 5F82E5E74A984CBEB145ED939E0E26D9 2D95F0E83C774E3C9894BF0C5727A4CC
        105 AAAEAUAAEAAAADNAAF D1071E58C1A0424586EB639FA871807B 33238197CA324C739D4D5704EEFFA221
        106 AAAEAUAAEAAAADNAAG 743F776BF8E446DE8E9B9229637C92A2 3C3067CDBBC6425AAEF9A8AC6A93292D
        107 AAAEAUAAEAAAADNAAH 8DAFDA3416D34573A2E54217DE45B05E 6B864D7293C445DA83FE444D59228506
        108 AAAEAUAAEAAAADNAAI F2F19214E8F34AF98DA25CE49BC5BB65 A4611A06A3CC491F8F5DEA2CA53930E3
        109 AAAEAUAAEAAAADNAAJ 81AC784FCEA647ADB5B111C836892D0B F9E5F6E97F7E448F96AAD2B10F021757
        110 AAAEAUAAEAAAADNAAK 22FA296EB1274D25B46610DF4B4FA834 1DA3A9C193AE4F849CC14B0989E866EE

Sorguyu çalıştırdığım platform bilgileri :

SQL> select * from v$version order by 1;


BANNER
--------------------------------------------------------------------------------
CORE    11.2.0.2.0      Production
NLSRTL Version 11.2.0.2.0 - Production
Oracle Database 11g Express Edition Release 11.2.0.2.0 - Beta
PL/SQL Release 11.2.0.2.0 - Beta
TNS for 32-bit Windows: Version 11.2.0.2.0 - Beta


Şimdi gelelim SYS_GUID() kullanımındaki probleme; Ne hikmetse Bu SYS_GUID() bazı platformlarda beklendiği gibi çalışmamaktadır. Yukarıdaki sorguyu farklı bir platformda çalıştırdığımızda;

SQL> SELECT E.EMPLOYEE_ID, ROWID, SYS_GUID(), SYS_GUID() FROM egitim1.EMPLOYEES E ORDER BY 1;


EMPLOYEE_ID ROWID              SYS_GUID()                       SYS_GUID()
----------- ------------------ -------------------------------- --------------------------------
                                          *                                *              
        100 AACWsZAAJAAAZJ/AAA E4D372D7CF5A0092E0430AC9E8CF0092 E4D372D7CF5B0092E0430AC9E8CF0092
        101 AACWsZAAJAAAZJ/AAB E4D372D7CF5C0092E0430AC9E8CF0092 E4D372D7CF5D0092E0430AC9E8CF0092
        102 AACWsZAAJAAAZJ/AAC E4D372D7CF5E0092E0430AC9E8CF0092 E4D372D7CF5F0092E0430AC9E8CF0092
        103 AACWsZAAJAAAZJ/AAD E4D372D7CF600092E0430AC9E8CF0092 E4D372D7CF610092E0430AC9E8CF0092
        104 AACWsZAAJAAAZJ/AAE E4D372D7CF620092E0430AC9E8CF0092 E4D372D7CF630092E0430AC9E8CF0092
        105 AACWsZAAJAAAZJ/AAF E4D372D7CF640092E0430AC9E8CF0092 E4D372D7CF650092E0430AC9E8CF0092
        106 AACWsZAAJAAAZJ/AAG E4D372D7CF660092E0430AC9E8CF0092 E4D372D7CF670092E0430AC9E8CF0092
        107 AACWsZAAJAAAZJ/AAH E4D372D7CF680092E0430AC9E8CF0092 E4D372D7CF690092E0430AC9E8CF0092
        108 AACWsZAAJAAAZJ/AAI E4D372D7CF6A0092E0430AC9E8CF0092 E4D372D7CF6B0092E0430AC9E8CF0092
        109 AACWsZAAJAAAZJ/AAJ E4D372D7CF6C0092E0430AC9E8CF0092 E4D372D7CF6D0092E0430AC9E8CF0092
                                          *                                *              

Sorguyu çalıştırdığım platformun bilgileri :

SQL> SELECT * FROM V$VERSION ORDER BY 1;


BANNER
--------------------------------------------------------------------------------
CORE    11.2.0.2.0      Production
NLSRTL Version 11.2.0.2.0 - Production
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
PL/SQL Release 11.2.0.2.0 - Production
TNS for IBM/AIX RISC System/6000: Version 11.2.0.2.0 - Production

Dikkat ederseniz sadece yıldızlı sıradaki harfler farklı. Aslında Oracle yalan söylemiyor. Bize her çağrıldığında farklı bir ID üretiyor ama aslında bu tam olarak GUID den beklediğimiz şekilde bir ID değil.  İncelemelerime göre bu durum Oracle’ın çalıştığı OS’e bağlı. Linuxmakinalarında bu tip bir durum gözlemledim (Aşağıda test yaptığım makina versiyonlarını görebilirsiniz). (Bu sorunu (2) Steven yıllar önce tespit edip bir makale hazırlamış aslında) SYS_GUID()’yi kullanacağınız Oracle platformunda öncelike bunu test edip daha sonra kullanmakta fayda var.

ALTERNATİF ÇÖZÜM

Bu durumla karşı karşıya kaldıysanız benim tavsiyem Oracle’ın DBMS_RANDOM  paketini (3)  kullanmak.  SYS_GUID()’ye benzer bir içerik üretmek için “DBMS_RANDOM.STRING('X',32)” fonksiyonunu kullanabilirsiniz. Bu fonksiyon size RAW tipinde değil VARCHAR2 tipinde bir değer dönecektir ama zaten GUID leri genellikle string amaçlı kullanıyoruz. İhtiyaç halinde çevirmeler yapılabilir.

Örnek;

SQL> SELECT SYS_GUID(), DBMS_RANDOM.STRING('X',32) AS rnd  FROM egitim1.EMPLOYEES E WHERE ROWNUM < 11;


SYS_GUID()                        RND
--------------------------------  --------------------------------
E4D372D7D0BB0092E0430AC9E8CF0092  TYW14HQDWSJ2260LG0Y4E2JVOE16SJ3X
E4D372D7D0BC0092E0430AC9E8CF0092  J4T9J59O3XJ7DJJ6GMT9ZOUIDY7W1UAG
E4D372D7D0BD0092E0430AC9E8CF0092  WDCLBAAKYICRL3140VFR8XFW205KZK5Z
E4D372D7D0BE0092E0430AC9E8CF0092  BVTPTUQE461KRVMEUMNARQDZEH6AVFJ9
E4D372D7D0BF0092E0430AC9E8CF0092  D5HFXSJ52GBZT2BWNSVQBIYPDZ0OAANI
E4D372D7D0C00092E0430AC9E8CF0092  CIZPO6JW2YAKSOV1A116XIYR5H4736NE
E4D372D7D0C10092E0430AC9E8CF0092  YBPH8VTQR5B36URN11V7TM9IZ3WRD7A1
E4D372D7D0C20092E0430AC9E8CF0092  AZ21KOS26DA4DQE7JZFWTWWYFL9M24S2
E4D372D7D0C30092E0430AC9E8CF0092  4E5RJJP8F5C6COPI3CO637ZPLCNNSK4B
E4D372D7D0C40092E0430AC9E8CF0092  SFVWA4FY4R25KLGIXXS6BRRPRSEC4TJ7

GUIID’yi beklediğimiz gibi üretmeyen diğer ortam bilgilerine örnekler;

CORE   10.2.0.5.0   Production
NLSRTL Version 10.2.0.5.0 - Production
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
PL/SQL Release 10.2.0.5.0 - Production
TNS for IBM/AIX RISC System/6000: Version 10.2.0.5.0 – Productio

CORE   10.2.0.4.0   Production
NLSRTL Version 10.2.0.4.0 - Production
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
TNS for IBM/AIX RISC System/6000: Version 10.2.0.4.0 – Productio

CORE   10.2.0.5.0   Production
NLSRTL Version 10.2.0.5.0 - Production
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
PL/SQL Release 10.2.0.5.0 - Production
TNS for Solaris: Version 10.2.0.5.0 – Production

CORE   11.2.0.2.0   Production
NLSRTL Version 11.2.0.2.0 - Production
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
PL/SQL Release 11.2.0.2.0 - Production
TNS for Linux: Version 11.2.0.2.0 – Production

0 comments:

Post a Comment

 
Top