將 Oracle® 使用者遷移至 PostgreSQL 適用的 Cloud SQL:資料類型、使用者和資料表

本文件是一系列文件的一部分,提供有關規劃及執行 Oracle® 11g/12c 資料庫遷移至 PostgreSQL 適用的 Cloud SQL 12 版的相關重要資訊和指引。除了初步設定部分外,本系列還包含以下部分:

資料類型

PostgreSQL 適用的 Cloud SQL 提供多種資料類型,這些類型與 Oracle 提供的資料類型完全相同或相似。下表列出最常見的 PostgreSQL 資料類型,接著比較 Oracle 原始資料類型與 PostgreSQL 適用的 Cloud SQL 對應資料類型;如果不支援某個資料類型,則會列出替代資料類型。

PostgreSQL 適用的 Cloud SQL 12 種原始資料類型

PostgreSQL 適用的 Cloud SQL 資料類型系列 PostgreSQL 適用的 Cloud SQL 資料類型名稱 資料類型規格
字串/字元 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 小數位數,以秒為單位 (如果未指定,則為 1 微秒)。
TIMESTAMP (p) with time zone - 包含日期、時間和時區的值。
- 支援的範圍為西元前 4713 年至 294276 年。
- 解析度為 p 小數位數,以秒為單位 (如果未指定,則為 1 微秒)。
TIME (p) - 值含有時間部分,但沒有日期部分。
- 支援的範圍為 00:00:00 到 24:00:00。
- 解析度為 p 小數位數,以秒為單位 (如果未指定,則為 1 微秒)。
TIME (p) with time zone - 含有時間和時區,但沒有日期部分的值。
- 支援的範圍為 00:00:00 到 24:00:00。
- 解析度為 p 小數位數,以秒為單位 (如果未指定,則為 1 微秒)。
INTERVAL (p) - 時間間隔
- 支援的範圍為 -178000000 到 178000000 年。
- 解析度為 p 小數位數,以秒為單位 (如果未指定,則為 1 微秒)。
JSON JSON 文字 JSON 資料。
JSONB 二進位 JSON 資料。
XML XML XML 資料。

幾何
GEOMETRY 您要使用下列資料模型時,應指定的資料欄類型。
POINT (x,y) 值。
LINE (A, B, C) 元組,其中 Ax + By + C = 0AB 不全為 0。

OR

第 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) (中心點和半徑)
Logical BOOLEAN - 可保留 true、false 或空值。
- 接受 yestrueton1 等值,視為 true。
位元 / 二進位資料 BIT (n) 固定長度位元字串。
BYTEA 二進位資料 / 位元組陣列。
網路位址類型 CIDER IPv4 和 IPv6 網路。
INET IPv4 和 IPv6 主機和網路。
MACADDR MAC 位址。
MACADDR8 MAC 位址 (EUI-64 格式)。
其他 PG_LSN PostgreSQL 適用的 Cloud SQL 記錄檔序號。
TSQUERY 文字搜尋查詢。
TSVECTOR 文字搜尋文件。
TXID_SNAPSHOT 使用者層級的交易 ID 快照。
UUID 通用唯一 ID。

將 Oracle 資料轉換為 PostgreSQL 適用的 Cloud SQL 資料類型

Oracle 資料類型群組 Oracle 資料類型名稱 Oracle 資料類型規格 將 PostgreSQL 適用的 Cloud SQL 轉換為 Oracle 等效項目 PostgreSQL 適用的 Cloud SQL 對應/替代方案
字串/字元 CHAR(n) 大小上限為 2000 位元組。 CHAR(n)
CHARACTER(n) 大小上限為 2000 位元組。 CHARACTER(n)
NCHAR(n) 大小上限為 2000 位元組。 CHAR(n)
VARCHAR(n) 大小上限為 2000 位元組。 VARCHAR(n)
NCHAR VARYING(n) 長度可變的 UTF-8 字串,大小上限為 4000 位元組。
CHARACTER VARYING(n)
VARCHAR2(n) 11g 大小上限為 4000 位元組,在 PL/SQL 中為 32 KB。 是* VARCHAR(n)
VARCHAR2(n)
12g
大小上限為 32767 位元組 MAX_STRING_SIZE= EXTENDED 是* VARCHAR(n)
NVARCHAR2(n) 大小上限為 4000 位元組。 VARCHAR(n)
LONG 大小上限為 2 GB。 是* TEXT
RAW(n) 大小上限為 2000 位元組。 是* BYTEA
LONG RAW 大小上限為 2 GB。 是* 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)
Logical BOOLEAN 值為 TRUEFALSENULL。無法指派至資料庫資料表欄。 BOOLEAN
XML XMLTYPE XML 資料。 XML
LOB BFILE 指向二進位檔的指標,大小上限為 4 GB。 VARCHAR(255)
CLOB 字元大型物件,檔案大小上限為 4 GB。 TEXT
BLOB 二進位大型物件,大小上限為 4 GB。 BYTEA
NCLOB 變長度 Unicode 字串,檔案大小上限為 4 GB。 TEXT
ROWID ROWID 實際資料列位址。 CTID
UROWID(n) 邏輯資料列位址的通用資料列 ID。 CTID
Spatial SDO_ GEOMETRY 空間物件的幾何描述。 Postgres 提供各種幾何圖形類型,包括 pointlinepathpolygoncircle 等等。
SDO_TOPO_ GEOMETRY 說明拓樸結構幾何圖形。 PostGIS 是廣泛使用的 Postgres 擴充功能,提供多種拓撲類型。
SDO_GEORASTER 您可以將光柵格線或圖片物件儲存在單一資料列中。 PostGIS 是廣泛使用的 Postgres 擴充功能,提供工具可將光柵檔案載入資料庫。
媒體類型 ORDDicom 支援儲存及管理數位醫學影像和通訊 (DICOM) 檔案。 是,有解決方法 Postgres 提供 bytea 二進位元類型,用於儲存大型物件。
ORDDoc 支援任何類型的媒體資料儲存和管理。 是,有解決方法 Postgres 提供 bytea 二進位元類型,用於儲存大型物件。
ORDImage 支援圖片資料的儲存和管理。 是,有解決方法 Postgres 提供 bytea 二進位元類型,用於儲存大型物件。
ORDVideo 支援儲存及管理影片資料。 解決方法 Postgres 提供 bytea 二進位元類型,用於儲存大型物件。

* PostgreSQL 適用的 Cloud SQL 中的對應資料類型大多與 Oracle 相容,但名稱不同。

使用者定義的類型

Oracle 將使用者定義類型 (UDT) 稱為 OBJECT TYPES,並使用 PL/SQL 進行管理。使用者定義的類型可讓使用者建立應用程式專用的複雜資料類型,這些類型是根據內建 Oracle 資料類型清單建立,並從中延伸。

Oracle 使用者定義類型 Oracle 總覽或實作 PostgreSQL 適用的 Cloud SQL 支援 PostgreSQL 適用的 Cloud SQL 對應或替代解決方案
抽象資料類型 (ADT) CREATE TYPE ADT_DEMO AS OBJECT (
ID NUMBER(6),
NAME VARCHAR2(20)
);
部分使用不同語法 PostgreSQL 適用的 Cloud SQL 複合型別是由一組屬性名稱和資料類型所指定:

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 資料表轉換為 PostgreSQL 適用的 Cloud SQL 資料表。

建立使用者和權限

Oracle 資料庫使用者帳戶 (Oracle「使用者」和「結構定義」相同) 可用於驗證及連線至資料庫工作階段,而授權存取權則會針對特定資料庫物件/權限,在使用者的個別層級設定。

一般來說,資料庫使用者分為兩種:

  • 管理員:管理資料庫執行個體、使用者和資源。
  • 使用者帳戶:提供邏輯作業,例如應用程式。

管理員會將權限授予使用者和應用程式使用者帳戶,以便存取資料庫物件。您可以為使用者授予 Oracle 資料庫權限,以便執行特定作業 (例如建立工作階段/連線) 或特定資料庫物件 (例如特定資料表上的 SELECT,或特定儲存程序上的 EXECUTE)。

在 Oracle 中,有使用者和角色的概念。使用者用於透過資料庫進行驗證,而角色則提供可整體授予的權限群組。

在 PostgreSQL 適用的 Cloud SQL 中,使用者和角色是同義詞。PostgreSQL 適用的 Cloud SQL 中的使用者是具有 connect 權限的角色。您可以使用 CREATE USERCREATE ROLE 陳述式建立資料庫使用者。與 Oracle 不同,在 PostgreSQL 適用的 Cloud SQL 中,結構定義和使用者是分開建立的。結構定義是物件 (例如資料表、資料類型、函式等) 的集合,並由使用者擁有。

Oracle 建立使用者
CREATE USER user_name IDENTIFIED BY password;
PostgreSQL 適用的 Cloud SQL 建立使用者
CREATE USER user WITH PASSWORD 'password';



CREATE ROLE user WITH LOGIN PASSWORD 'password';

轉換考量事項

  • 使用者是在根層級定義,適用於同一個 PostgreSQL 適用的 Cloud SQL 叢集中的所有資料庫。這與 Oracle 12c 中的「一般使用者」類似。
  • PostgreSQL 適用的 Cloud SQL CREATE USER 語法與 Oracle 語法不同,因此無法直接遷移。Cloud SQL for PostgreSQL 中的 CREATE USERCREATE ROLE 的別名,但預設會啟用 LOGIN 選項。

資料表

Oracle 資料表是由許多元素建構而成,例如資料欄資料類型、資料表限制、索引、區隔、Oracle 資料表專屬功能等等。如要成功遷移至 PostgreSQL 適用的 Cloud SQL 資料庫表格,所有 Oracle 表格元素都必須轉換為 PostgreSQL 適用的 Cloud SQL 表格。部分元素可透過不修改或微幅修改的方式支援,但有些元素則必須完全修改。

從遷移的角度來看,將 PL/SQL 轉換為 PostgreSQL 適用的 Cloud SQL 可能需要付出更多努力,因為將 Oracle 資料表轉換為 PostgreSQL 適用的 Cloud SQL 資料表是至關重要的階段,對效能和資料大小有重大影響,並進一步產生影響。

以下是 Oracle 和 PostgreSQL 適用的 Cloud SQL 表格與相關功能的主要差異。本系列的後續部分將討論這些差異。

  • 建立資料表語法
  • 資料表和索引中繼資料
  • 限制支援
  • 支援的資料類型和限制
  • 索引
  • 分區與分區管理
  • 資料表和索引維護
  • 臨時資料表
  • 瀏覽次數
  • 可見和不可見資料欄 (Oracle 12c)
  • 資料表和欄位字元集

後續步驟