はじめに
RDS for PostgreSQLでOrafceを使えるようにするには公式の記事の方法だけではできなかったので私なりの導入手順を載せようと思います。
原因
Orafceを導入した際に作成されるOracleスキーマにsearch_pathがsetされていなかった。
手順1
まず、上記のAWS公式の記事を参考に以下の手順を行ってください。
- Orafce拡張機能オン
- Oracleスキーマの所有者へrds_superuserロールを付与
ロールが付与できたか確認するには以下のコマンドを実行してください。
コード
```SELECT roleid::regrole, member::regrole
db-> FROM pg_auth_members
db-> WHERE member = 'Orafce_user'::regrole
db-> AND roleid = 'rds_superuser'::regrole;
roleid | member
---------------+-------------
rds_superuser | orafce_user
(1 行)
手順2
ここからは公式の記事には載っていなかった内容です。
まずは現在の環境変数を確認します。
db=> SHOW search_path;
search_path
-----------------
"$user", public
(1 行)
RDSではデフォルトで環境変数がpublicになっているようです。
また、$userがありますが、これはログインしたユーザーと同じ名前のスキーマをまずは検索するように設定されたものです。
ここにOracleスキーマを加えたいのです。
以下の様にセットしていきます。
db=> set search_path to "$user", oracle;
SET
db=> SHOW search_path;
search_path
-----------------------------------
"$user", oracle
(1 行)
これで環境変数にOracleスキーマのパスを設定できました。
稼働確認
稼働確認にはDUALテーブルが使えることを確認できればいいので、以下の様にクエリを打ってください。
db=> SELECT * FROM dual;
dummy
-------
X
(1 行)
実行結果がこのようになれば成功です。
OrafceはOracleのシステムテーブルDUALを模倣して提供されたものらしく、Oracleではよく使われる仮想テーブルなので上記の方法でDUALテーブルを使えることが確認できれば、無事Orafceの導入が完了ということになります。
また念には念を、、、
以下の様にoracle特有のデータ型を持ったテーブルが作成できるか試してみます。
db=> CREATE TABLE emp(emp_id NUMERIC, first_name VARCHAR2(30), last_name NVARCHAR2(30), birth_date DATE);
CREATE TABLE
db=> \d emp
(省略)
------------+-----------------+---------------------------+-------------------+------------------------------
emp_id | numeric | | |
first_name | varchar2(30) | | |
last_name | nvarchar2(30) | | |
birth_date | date | | |
結果がこのように、Postgresqlがサポートされていないデータ型を持ったテーブル作成できていたらorafceが使えているという事になります!