概要
本記事の位置付けについて
Oracle Database から Azure SQL Database へ SQL Server Migration Assistant for Oracle (SSMA)によるプログラム移行検証結果の一部である。次の記事にて個別機能別記事へのリンクを整理している。
Oracle テーブルについて
Oracle Database ではテーブル(表)について、Oracle Database ドキュメントにて、次のように記載されている。
Oracle Databaseのデータ記憶域の基本単位です。データは、行および列に格納されます。
テーブルには、次のオプションを設定できる。
- 制約
- インデックス(索引)
- パーティション
テーブルのレコードを特定するために、 ROWID 疑似列が利用されることがある。
データベース内の各行について、行のアドレスを戻します。
引用元:ROWID疑似列
参考リンク
- ホワイトペーパー
- Guide to Migrating from Oracle to SQL Server 2014 and Azure SQL Database
- Oracle to SQL Server Migration Handbook v 2.0
Azure SQL Database への移行
SSMA による変換
テーブルの変換をサポートしている。
移行方針
テーブル、および、テーブルに付随する次のオプションを変換する。
- 制約
次のオプションについては、変換されず、手動対応 が必要となる。
- インデックス(索引)
- パーティション
メモリ最適化テーブルについては、次のドキュメントにて詳細が記載されている。
- Guide to Migrating from Oracle to SQL Server 2014 and Azure SQL Database
ROWID
列をエミュレートする方法として、次の方法がある。2 の方法を実施する場合には、関連する issues は発生しない。
- Azure SQL Database 連携前に
ROWID
列を追加する方法 - SSMA のプロジェクト設定値である
Generate ROWID column
をYes
の値に設定することで、テーブルにROWID
列を保持させる方法 - 手動で
ROWID
列をテーブルに追加する方法
変換例
変換例 1 インデックスと制約を設定しているテーブル
Oracle Database のコード
CREATE TABLE HR.table_sample_001 (
ID NUMBER(10,0)
,VALUE NUMBER(10,0)
)
/
CREATE TABLE HR.table_sample_002 (
ID NUMBER(10,0)
,NAME NVARCHAR2(10)
)
/
ALTER TABLE HR.table_sample_001
ADD CONSTRAINT table_sample_001_pk
PRIMARY KEY (ID);
/
ALTER TABLE HR.table_sample_002
ADD CONSTRAINT table_sample_002_pk
PRIMARY KEY (ID);
/
ALTER TABLE HR.table_sample_001
ADD CONSTRAINT table_sample_001_fk
FOREIGN KEY ( ID )
REFERENCES HR.table_sample_002 ( ID );
/
CREATE INDEX table_sample_001_idx_01
ON HR.table_sample_001(VALUE);
Azure SQL Database への変換
SSMA により次のように変換される。
CREATE TABLE
[HR].[TABLE_SAMPLE_001]
(
[ID] numeric(10, 0) NOT NULL,
[VALUE] numeric(10, 0) NULL
)
WITH (DATA_COMPRESSION = NONE)
GO
ALTER TABLE [HR].[TABLE_SAMPLE_001]
ADD CONSTRAINT [TABLE_SAMPLE_001_PK]
PRIMARY KEY
CLUSTERED ([ID] ASC)
GO
ALTER TABLE [HR].[TABLE_SAMPLE_001]
ADD CONSTRAINT [TABLE_SAMPLE_001_FK]
FOREIGN KEY
([ID])
REFERENCES
[HR].[TABLE_SAMPLE_002] ([ID])
ON DELETE NO ACTION
ON UPDATE NO ACTION
GO
変換例 2 パーティションを設定しているテーブル
Oracle Database のコード
CREATE TABLE HR.TABLE_SAMPLE_003
(
COLUMN1 NUMBER(10, 0)
)
PARTITION BY RANGE (COLUMN1)
(
PARTITION P1 VALUES LESS THAN (10) TABLESPACE USERS,
PARTITION P2 VALUES LESS THAN (20) TABLESPACE USERS
)
;
Azure SQL Database への変換
SSMA により次のように変換される。
CREATE TABLE
[HR].[TABLE_SAMPLE_003]
(
[COLUMN1] numeric(10, 0) NULL
)
ON [SSMA$PS$HR$TABLE_SAMPLE_003] ([COLUMN1])
WITH (DATA_COMPRESSION = NONE)
GO