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;
以上で設定は終了です。