【PostgreSQL-0013】PostgreSQLでUUIDを生成する

PostgreSQLでUUID(Universally Unique Identifier)を生成する方法について調査及び研究し、その成果をまとめています。

 

目的

このサイトのメインコンテンツであるオープンソースのERP iDempiereでは、ほぼすべてのレコードにUUIDが設定されています。その際に、基本的にはJavaでUUIDを生成していますが、PostgreSQLで生成されている箇所も少しだけあります。

PostgreSQLでUUIDを生成する際には、iDempiereではgenerate_uuid()関数が使用されていますが、この関数はラッパーで、uuid_generate_v4()関数を呼び出しているだけです。

このuuid_generate_v4()関数は、OSSP UUIDライブラリに依存していますが、そのOSSP UUIDライブラリ自体がメンテナンスされなくなっているそうです(参照:PostgreSQL 9.4.5文書 付録 F. 追加で提供されるモジュール)。

そのため、このコンテンツではuuid_generate_v4()関数を他の関数に置き換える事を目的としています。

 

使用する関数

pgcryptoモジュールのgen_random_uuid()

先のPostgreSQLのドキュメント(参照:PostgreSQL 9.4.5文書 付録 F. 追加で提供されるモジュール)で、「ランダムに生成された(バージョン4)UUIDのみが必要な場合には、代わりにpgcryptoモジュールのgen_random_uuid()を利用すること検討してください。」とありましたので、実際に試してみたいと思います。

設定の手順

pgctyptoを使用できるようにする

CREATE EXTENSION pgcrypto;

スキーマをadempiereに変更する

generate_uuid()関数の修正

CREATE OR REPLACE FUNCTION adempiere.generate_uuid()

RETURNS character

    LANGUAGE 'plpgsql'

    COST 100

    VOLATILE 

AS $BODY$

BEGIN

return gen_random_uuid()::char(36);

END;

$BODY$;

 

ALTER FUNCTION adempiere.generate_uuid()

    OWNER TO adempiere;

以上で設定は終了です。