先日、OpenLDAPのback-sqlの使い方について解説してみたのですが、その際にちょっと気になっていたことがありました。OpenLDAPのサンプルのSQLに引きづられて文字列型にvarchar型を利用していたのですが、実際のところ互換性の話を考えなければ、PostgreSQLでvarchar型を使う理由はあまりありません。むしろ効率などの面でもPostgreSQLではtext型の方がオススメです。
というわけで、back-sqlのテーブルのvarchar型を全てtext型に変更してみました。たとえば、edupersonのテーブルは次のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
CREATE TABLE eduperson ( id serial NOT NULL PRIMARY KEY, uid text UNIQUE NOT NULL, ou text NOT NULL, cn text, sn text, givenname text, displayname text, userpassword text, mail text, edupersonprincipalname text, jasn text, jagivenname text, jadisplayname text, jaou text, updated timestamp with time zone ); |
さらに、back-sqlが内部的に用いるテーブルであるldap_attr_mappings, ldap_entries, ldap_entry_objclasses, ldap_oc_mappings内のvarchar型もtext型に直してみました。たとえば、ldap_attr_mappingsは次のようになります。
|
CREATE TABLE ldap_attr_mappings ( id serial NOT NULL PRIMARY KEY, oc_map_id integer NOT NULL, name text NOT NULL, sel_expr text NOT NULL, sel_expr_u text, from_tbls text NOT NULL, join_where text, add_proc text, delete_proc text, param_order integer NOT NULL, expect_return integer NOT NULL ); |
これでデータベースを作りなおしてみたところ、問題なく動作しました。もし、現用の環境をそのまま変更したいのであれば、バックアップ(もしくはVMのスナップショット)を取った上で、slapdを停止すれば、alter tableで型の変更が可能です。たとえば、
|
alter table eduperson alter uid type text; |
のように実行すれば(この例はedupersonのuidを変更する場合)、データは保ったままtext型に変更可能です。なお、edupersonのuidにはNOT NULLの制約がありますが、これはそのままtext型に変更しても受け継がれます。
これで、根拠の無いvarcharの文字数指定がなくなってすっきりしました。
以前、802.1X用のFreeRadiusのバックエンドにPostgreSQLを用いた際も、サンプルのSQLをほぼそのまま使ったらセッションIDをしまう部分がvarchar(32)型で、新しく導入したCiscoのAPが返すセッションID(33文字)を格納しきれずにvarchar(64)型にalter tableしたことを思い出します(本当はtext型にalter tableしたかったのだけれども、動いているシステムにそれを行うのは怖いので、varchar型の文字数を変えるにとどめました)。
こういうソフトのバックエンドにPostgreSQLを使われる開発者の方は、開発の段階でvarchar型ではなくtext型を使ってほしい…と個人的には思ってます。