システムで一意な値を生成する

syntax

SYS_GUID
return [ RAW ]

parameter

なし

return

  • 接続中のデータベースの環境やプロセスから一意なバイト列を生成する。

avail

  • SQL および PL/SQL の両方で使用可能。

SYS_GUID 関数の内容

コール毎に接続中のセッションに関する情報からグローバルで一意な(※) 16 バイトの RAW 型を生成する。生成されるバイト列は巡回するシーケンスな数値というものではない。

マニュアルによると導出元の情報は以下

「ホスト識別子」、「プロセス」 または 「プロセスやスレッドのスレッド識別子」
および、そのプロセスやスレッドに対する非反復値(バイトの順序)

で構成されていると書かれている。'または' の区切り方で異なる解釈をしてしまいそうなので…「ホスト識別子」+「プロセス(+スレッド)」+「プロセス or スレッド単位の非反復値」で構成されるということ。

テスト環境では各要素が特定のバイト列を構成しているようには見えない。(Windows Oracle 10g の場合)適当に ハッシュ加工 されているのかと思われる。また OS によって実装が異なっているようでもある。

使用目的を想定すると「ホスト識別子」 を取り入れていることから、データベースサーバーを横断するような中短期的な一意な ランダムコード(パスワード、暗号やセキュリティに関するものは除外)。ユニークキーが存在しない統合されたログデータなどの一意性を補強するためキーが欲しいときに使用するのだろうかと思う。サーバーを横断しないのならば 日付、 SCN と循環する シーケンス を使った ストアドプロシージャを作成した方が安心して使えると思う。(シーケンスの正の最大値は 10^28)

単独キーとして使用した場合に衝突する危険性を考えると MD5 と同じビット長 128 ビット(16 バイト:3.40282367 × 10^38 通り)なので確率も相当低いのは間違いないといえる。しかし、仕組みが公開されていないブラックボックスなのでよくわからず、OS によっても違いがあり、特定条件下においてユニーク性を 100% 保証しているとの明記もないので単独のユニークキーとして使用するには抵抗がある。

 

SYS_GUID 使用例

コマンドが別ならもちろん、同一行に複数書いても異なる値を戻す。

SQL> select SYS_GUID() from dual;
 
SYS_GUID()
--------------------------------
4159ACEF646D419AA824C6B68B14529B
 
SQL> select SYS_GUID(), SYS_GUID() from dual;
 
SYS_GUID()                       SYS_GUID()
-------------------------------- --------------------------------
3CB34C0ABE1147008CF96816378865E9 8FF1F1F22F444682B6AD0F029AF8B729

SYS_GUID は ユーザーIDの UID とはまったく無関係で。Globally Unique ID の略。



 
アルファベット別 関数一覧 ショートカット
ABCDEFG
HILMNOP
RSTUVWX
日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle Web セミナー