LoginSignup
0
1

More than 5 years have passed since last update.

AWS RDS PostgreSQL で[CREATE CAST]を実行する方法

Posted at

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 行)
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1