Oracle® から Cloud SQL for PostgreSQL への移行: データ型、ユーザー、テーブル

このドキュメントは、Oracle® 11g/12c データベースから Cloud SQL for PostgreSQL バージョン 12 への移行を計画し、実施する際に必要な情報とガイダンスを提供するシリーズの一つです。このシリーズには、最初の設定のパートに加えて、次のパートが含まれています。

データ型

Cloud SQL for PostgreSQL には、Oracle が提供するデータ型と完全に同等または類似したデータ型がいくつか用意されています。次の表は、最も一般的な PostgreSQL のデータ型の一覧です。その下には、Oracle のプリミティブ データ型と対応する Cloud SQL for PostgreSQL のデータ型の比較を示しています(データ型がサポートされていない場合は、代替のデータ型を示しています)。

Cloud SQL for PostgreSQL 12 のプリミティブ データ型

Cloud SQL for PostgreSQL のデータ型ファミリー Cloud SQL for PostgreSQL のデータ型名 データ型の仕様
文字列 / 文字 CHAR(n) 正確に n 文字を格納します。CHARACTER(n) の別名。
CHARACTER(n) 正確に n 文字を格納します。
VARCHAR(n) n 文字までの可変数の文字を格納します。CHARACTER VARYING(n) の別名。
CHARACTER VARYING(n) n 文字までの可変数の文字を格納します。
TEXT VARCHAR 特定のバリアント。文字数の上限を指定する必要はありません。保存できる最長の文字数は 1 GB です(すべての文字列文字データ型で同じ)。
数値 SMALLINT 最小値: -32768 | 最大値: 32767
INTEGER 最小値: -2147483648 | 最大値: 2147483647
BIGINT 最小値: -2^63 | 最大値: 2^63-1
REAL 単精度浮動小数点数(4 バイト)。
DOUBLE PRECISION 倍精度浮動小数点数(8 バイト)。
DECIMAL (p,s) p 桁と小数点以下 s 桁の任意の値を格納できます。
NUMERIC(p,s) p 桁と小数点以下 s 桁の任意の値を格納できます。
SMALLSERIAL 自動増分式の整数。最小値: 1 | 最大値: 32767。
SERIAL 自動増分式の整数。最小値: 1 | 最大値: 2147483647。
BIGSERIAL 自動増分式の整数。最小値: 1 | 最大値: 2^63-1。
金額 MONEY 固定小数点精度の金額。最小値 -92233720368547758.08 | 最大値 +92233720368547758.07。
日付と時刻 DATE - 日付部分のみ(時刻部分はない)を含む値。
- サポートされる値の範囲: 紀元前 4713 年~西暦 5874897 年(精度は 1 日)。
TIMESTAMP (p) - 日付と時刻の両方の部分を含む値。
- サポートされる値の範囲: 紀元前 4713 年~西暦 294276 年。
- 精度は小数第 p 位まで(秒単位、指定されていない場合はマイクロ秒単位)。
TIMESTAMP (p) with time zone - 日付、時刻、タイムゾーンを含む値。
- サポートされる値の範囲: 紀元前 4713 年~西暦 294276 年。
- 精度は小数第 p 位まで(秒単位、指定されていない場合はマイクロ秒単位)。
TIME (p) - 時刻部分のみ(日付部分はない)を含む値。
- サポートされる値の範囲: 00:00:00~24:00:00。
- 精度は小数第 p 位まで(秒単位、指定されていない場合はマイクロ秒単位)。
TIME (p) with time zone - 時刻とタイムゾーン(日付部分はない)を含む値。
- サポートされる値の範囲: 00:00:00~24:00:00。
- 精度は小数第 p 位まで(秒単位、指定されていない場合はマイクロ秒単位)。
INTERVAL (p) - 期間
- サポートされる値の範囲: -178,000,000~178,000,000 年。
- 精度は小数第 p 位まで(秒単位、指定されていない場合はマイクロ秒単位)。
JSON JSON テキスト JSON データ。
JSONB バイナリ JSON データ。
XML XML XML データ。

ジオメトリ
GEOMETRY 次のデータモデルをいつ使用するかを指定する列型。
POINT (x,y) 値。
LINE (A, B, C) のタプル。Ax + By + C = 0 で、AB の少なくとも片方は 0 ではない。

または

次の形式の点 1 と点 2:

[ ( x1 , y1 ) , ( x2 , y2 ) ]
( ( x1 , y1 ) , ( x2 , y2 ) )
( x1 , y1 ) , ( x2 , y2 )
x1 , y1 , x2 , y2

LSEG 線分: ((x1,y1),(x2,y2))
BOX 四角形のボックス: ((x1,y1),(x2,y2))
PATH 一連の点: ((x1,y1),...)
POLYGON 実質的に閉路を形成する一連の点。
CIRCLE (x,y),r)(中心点と半径)
論理 BOOLEAN - 値として true、false、null を取ります。
- yestrueton1 などの値は true として使用できます。
ビット / バイナリデータ BIT (n) 固定長のビット列。
BYTEA バイナリデータ / バイト配列。
ネットワーク アドレスの種類 CIDER IPv4 ネットワークと IPv6 ネットワーク。
INET IPv4 ネットワーク、IPv6 ネットワーク、IPv4 ホスト、IPv6 ホスト。
MACADDR MAC アドレス
MACADDR8 MAC アドレス(EUI-64 形式)。
その他 PG_LSN Cloud SQL for PostgreSQL のログシーケンス番号。
TSQUERY テキスト検索クエリ。
TSVECTOR テキスト検索文書。
TXID_SNAPSHOT ユーザーレベルの取引 ID のスナップショット。
UUID ユニバーサルな固有識別子。

Oracle から Cloud SQL for PostgreSQL へのデータ型変換

Oracle のデータ型ファミリー Oracle のデータ型名 Oracle のデータ型の仕様 Cloud SQL for PostgreSQL と Oracle で同等か Cloud SQL for PostgreSQL での対応 / 代替
文字列 / 文字 CHAR(n) 最大サイズ: 2,000 バイト CHAR(n)
CHARACTER(n) 最大サイズ: 2,000 バイト CHARACTER(n)
NCHAR(n) 最大サイズ: 2,000 バイト × CHAR(n)
VARCHAR(n) 最大サイズ: 2,000 バイト VARCHAR(n)
NCHAR VARYING(n) 可変長の UTF-8 文字列。最大サイズ:
4,000 バイト
× CHARACTER VARYING(n)
VARCHAR2(n) 11g 最大サイズ: 4,000 バイト、PL/SQL での最大サイズ: 32KB ○* VARCHAR(n)
VARCHAR2(n)
12g
最大サイズ: 32,767 バイト MAX_STRING_SIZE= EXTENDED ○* VARCHAR(n)
NVARCHAR2(n) 最大サイズ: 4,000 バイト × VARCHAR(n)
LONG 最大サイズ: 2GB ○* TEXT
RAW(n) 最大サイズ: 2,000 バイト ○* BYTEA
LONG RAW 最大サイズ: 2GB ○* BYTEA
数値 NUMBER 浮動小数点数 ○* NUMERIC(p,s)
NUMBER(*) 浮動小数点数 ○* DOUBLE PRECISION
NUMERIC(p,s) 精度の許容範囲: 1~38 NUMERIC(p,s)
FLOAT(p,s) 浮動小数点数 ○* DOUBLE PRECISION
DEC(p,s) 固定小数点数 DEC(p,s)
DECIMAL(p,s) 固定小数点数 DECIMAL(p,s)
INT 38 桁の整数。 INT
INTEGER 38 桁の整数。 INTEGER
SMALLINT 38 桁の整数。 SMALLINT
REAL 浮動小数点数 ○* DOUBLE PRECISION
DOUBLE PRECISION 浮動小数点数 DOUBLE PRECISION
日付と時刻 DATE 日付と時刻のデータ(年、月、日、時、分、秒)を格納します。 ○* TIMESTAMP(0)
TIMESTAMP(p) 小数を含む日付と時刻 TIMESTAMP(p)
TIMESTAMP(p) WITH TIME ZONE 小数とタイムゾーンを含む日付と時刻 TIMESTAMP (p) WITH TIME ZONE
INTERVAL YEAR(p) TO MONTH 日付範囲 ○* INTERVAL YEAR TO MONTH
INTERVAL DAY(p) TO SECOND(s) 日付と時刻の間隔 ○* INTERVAL DAY TO SECOND(s)
論理 BOOLEAN TRUEFALSENULL の値。データベース テーブル列に割り当てることはできません。 BOOLEAN
XML XMLTYPE XML データ。 × XML
LOB BFILE バイナリ ファイルへのポインタ。最大サイズは 4 GB です。 × VARCHAR(255)
CLOB ファイルサイズが最大 4 GB バイトまでの文字ラージ オブジェクト × TEXT
BLOB 最大 4 GB までのバイナリラージ オブジェクト。 × BYTEA
NCLOB 最大ファイルサイズが 4 GB の可変長の Unicode 文字列。 × TEXT
ROWID ROWID 物理行アドレス × CTID
UROWID(n) 論理行アドレスのユニバーサル行 ID。 × CTID
空間 SDO_ GEOMETRY 空間オブジェクトのジオメトリに関する説明 Postgres には、pointlinepathpolygoncircle など、さまざまなジオメトリ タイプがあります。
SDO_TOPO_ GEOMETRY トポロジのジオメトリの説明 広く使用されている Postgres 拡張機能である PostGIS には、いくつかのトポロジタイプが用意されています。
SDO_GEORASTER ラスター グリッドまたは画像オブジェクトは単一行に格納されます。 広く使用されている Postgres 拡張機能である PostGIS には、ラスター ファイルをデータベースに読み込むツールが用意されています。
メディアの種類 ORDDicom Digital Imaging and Communications in Medicine(DICOM)ファイル形式のデータの保管と管理をサポートします。 ○(回避策あり) Postgres には、大きなオブジェクトを格納するためのバイナリ型 bytea があります。
ORDDoc メディアデータの保管と管理をサポートします。 ○(回避策あり) Postgres には、大きなオブジェクトを格納するためのバイナリ型 bytea があります。
ORDImage 画像データの保管と管理をサポートします。 ○(回避策あり) Postgres には、大きなオブジェクトを格納するためのバイナリ型 bytea があります。
ORDVideo 動画データの保管と管理をサポートします。 回避策 Postgres には、大きなオブジェクトを格納するためのバイナリ型 bytea があります。

* Cloud SQL for PostgreSQL の対応するデータ型は Oracle とほぼ互換性がありますが、名前が異なります。

ユーザー定義型

Oracle ではユーザー定義型(UDT)を OBJECT TYPES と呼んでいます。オブジェクト型の管理には PL/SQL が使用されます。ユーザー定義型では、組み込みの Oracle データ型リストに含まれるデータ型を拡張してアプリケーション専用の複雑なデータ型を作成できます。

Oracle のユーザー定義型 Oracle の概要または実装 Cloud SQL for PostgreSQL のサポート Cloud SQL for PostgreSQL の対応ソリューションまたは代替ソリューション
抽象データ型(ADT) CREATE TYPE ADT_DEMO AS OBJECT (
ID NUMBER(6),
NAME VARCHAR2(20)
);
構文の一部が異なる Cloud SQL for PostgreSQL の複合タイプは、属性名とデータ型のリストによって指定されます。

CREATE TYPE ADT_DEMO AS
(
ID NUMERIC(6),
NAME VARCHAR(20)
);

VARRAY 型 CREATE TYPE VARRAY_DEMO AS VARRAY (5) OF VARCHAR2(25); × 回避策として、Cloud SQL for PostgreSQL では列を配列として定義できます。

CREATE TABLE VARRAY_TABLE (
NAME VARCHAR(25)[]
);

ネストされたテーブル型 CREATE TYPE NTT_DEMO AS OBJECT (
ID NUMBER(6),
NAME VARCHAR2(20)
) ;
CREATE TYPE NTT_TABLE AS TABLE OF NTT_DEMO;
× 回避策として、Cloud SQL for PostgreSQL の複合タイプと配列の列定義を組み合わせて使用することで、Oracle のネストされたテーブル型と同様の機能を実現できます。

CREATE TYPE NTT_DEMO AS
(
ID NUMERIC(6),
NAME VARCHAR(20)
);
CREATE TABLE NTT_TABLE (
RECORD NTT_DEMO[]
);

不完全な型 不完全な型は、属性とメソッドのない型です。これは、他の型で参照できます。ただし、使用する前に型の定義を指定する必要があります。

CREATE TYPE INCOMPLETE_DEMO;

× N/A

ユーザー

このセクションでは、ユーザーを作成して権限を割り当てる方法と、Oracle テーブルを Cloud SQL for PostgreSQL テーブルに変換する必要性について説明します。

ユーザーの作成と権限

Oracle データベース ユーザー アカウント(Oracle の「ユーザー」と「スキーマ」は同一)は、データベース セッションの認証と接続に使用できますが、承認アクセスは、特定のデータベースのオブジェクト / 権限に対してユーザーの個人レベルで設定されます。

通常、データベース ユーザーには次の 2 種類があります。

  • 管理者: データベース インスタンス、ユーザー、リソースを管理します。
  • ユーザー アカウント: アプリケーションなどの論理オペレーションを提供します。

管理者は、ユーザー アカウントとアプリケーション ユーザー アカウントにデータベース オブジェクトへのアクセス権限を付与します。Oracle データベース権限は、特定のオペレーション(セッションの作成や接続など)または特定のデータベース オブジェクト(特定のテーブルに対する SELECT や特定のストアド プロシージャの EXECUTE など)に対してユーザーに付与されます。

Oracle には、ユーザーとロールという考え方があります。ユーザーはデータベースでの認証に使用されるもので、ロールは権限をグループ化してまとめて付与するためのものです。

Cloud SQL for PostgreSQL では、ユーザーとロールは同義です。Cloud SQL for PostgreSQL のユーザーは、connect 権限を持つロールのことです。CREATE USER または CREATE ROLE ステートメントを使用して、データベース ユーザーを作成できます。Cloud SQL for PostgreSQL では、Oracle とは異なりスキーマとユーザーは別個に作成されます。スキーマは、オブジェクト(テーブル、データ型、関数など)の集合であり、ユーザーにより所有されます。

Oracle の Create User
CREATE USER user_name IDENTIFIED BY password;
Cloud SQL for PostgreSQL の Create User
CREATE USER user WITH PASSWORD 'password';

または

CREATE ROLE user WITH LOGIN PASSWORD 'password';

変換に関する考慮事項

  • ユーザーはルートレベルで定義され、同じ Cloud SQL for PostgreSQL クラスタに含まれるすべてのデータベースで有効になります。これは Oracle 12c の「共通ユーザー」に似ています。
  • Cloud SQL for PostgreSQL の CREATE USER 構文は Oracle のものとは異なるため、そのままにして移行することはできません。Cloud SQL for PostgreSQL の CREATE USER は、LOGIN オプションがデフォルトで有効になっていることを除き、CREATE ROLE のエイリアスです。

テーブル

Oracle のテーブルは多数の要素からなります。たとえば、列のデータ型、テーブル制約、インデックス、パーティション、Oracle 独自のテーブル機能などの要素です。Cloud SQL for PostgreSQL データベース テーブルに正常に移行するには、すべての Oracle テーブル要素を Cloud SQL for PostgreSQL テーブルに変換する必要があります。要素の中にはそのまま移行できるものや、わずかな変更ですむものがありますが、完全に変更しなければならない要素もあります。

移行の観点では、PL/SQL を Cloud SQL for PostgreSQL に変換するにはより多くの作業が必要になりますが、Oracle テーブルから Cloud SQL for PostgreSQL テーブルへの変換は、将来的にパフォーマンスとデータサイズに影響を及ぼす非常に重要な段階です。

以下は、Oracle と Cloud SQL for PostgreSQL のテーブルおよび関連機能の主な違いです。これらの違いについては、このシリーズの残りのパートで説明します。

  • テーブル作成の構文
  • テーブルとインデックスのメタデータ
  • 制約のサポート
  • データ型のサポートと制限事項
  • インデックス
  • パーティションとパーティション管理
  • テーブルとインデックスのメンテナンス
  • 一時テーブル
  • ビュー
  • 表示列と非表示列(Oracle 12c)
  • テーブルと列の文字セット

次のステップ