AWS RDS(PostgreSQL)で、キャストを設定(CREATE CAST)する方法をご紹介します。
#まずハマります
AWS RDS(PostgreSQL)のDBマスターユーザーで「CREATE CAST」を実行すると2行目のエラーが出力されました。
CREATE CAST (character AS numeric) WITH INOUT AS IMPLICIT;
ERROR: must be owner of type character or type numeric
#原因
PostgreSQLでキャスト設定するには、「CREATE CAST」をスーパーユーザー権限で実行する必要があります。(すべての場合にスーパーユーザーが必要な訳ではないようです)
ですが、AWS RDSでは、スーパーユーザーは使用できません。
代わりに[rds_superuser]ロールが割り当てられたマスターユーザーというものを使用できます。
但し、これはスーパーユーザーとは厳密には異なります。
#解決方法
スーパーユーザーが使えなくとも、
キャストするデータ型の所有者になれば「CREATE CAST」が実行できます。
データ型の所有者になる
キャスト設定したいデータ型の所有者になります。コマンド構文は以下です。
alter type <データ型の内部名※> owner to <所有者にするユーザ>;
※補足を参照
コマンド例
以下は、chatacter を dbmaster というユーザを所有者にする場合のコマンドです。
alter type bpchar owner to dbmaster;
###キャストを設定する
データ型の所有者となったユーザでキャストを設定します。コマンド構文は以下です。
CREATE CAST (<ソースの型> AS <ターゲットの型>) WITH INOUT AS IMPLICIT;
コマンド例
CREATE CAST (character AS numeric) WITH INOUT AS IMPLICIT;
#補足
ちなみに、データ型の所有者を変更するところで、なぜ、character ではなく bpchar かというと。。。
characterで、「alter type」を実行すると以下のエラーになります。
alter type character owner to dbmaster;
ERROR: type "character" does not exist
これは、データ型は"名前"ではなく"内部名"で実行する必要があるためです。
内部名の確認方法は、以下になります。
\dT+ <データ型の名前>
これを実行し、内部名を確認します。ついでに所有者も確認できます。
\dT+ character
データ型一覧
スキーマ | 名前 | 内部名 | サイズ | 要素 | 所有者 | アクセス権 | 説明
------------+-----------+--------+--------+------+------------+------------+---------------------------------------------------------
pg_catalog | character | bpchar | var | | dbmaster | | char(length), blank-padded string, fixed storage length
(1 行)