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