SQL Server Migration Assistant for Oracle  による Oracle Database から Azure SQL Database への移行検証～Oracle テーブル編～

## 概要

### 本記事の位置付けについて

Oracle Database から Azure SQL Database へ SQL Server Migration Assistant for Oracle （SSMA）によるプログラム移行検証結果の一部である。次の記事にて個別機能別記事へのリンクを整理している。

- [SQL Server Migration Assistant for Oracle による Oracle Database から Azure SQL Database への移行検証記事のまとめ - Qiita](https://qiita.com/manabian/items/0ec96b66033a7bd03a25)

### Oracle テーブルについて

Oracle Database ではテーブル（表）について、Oracle Database ドキュメントにて、次のように記載されている。

> Oracle Databaseのデータ記憶域の基本単位です。データは、行および列に格納されます。

引用元：[20 表の管理 (oracle.com)](https://docs.oracle.com/cd/F19136_01/admin/managing-tables.html#GUID-707B02F5-E589-4C20-8E2E-5ED4F7888702)

テーブルには、次のオプションを設定できる。

- 制約
- インデックス（索引）
- パーティション

テーブルのレコードを特定するために、 ROWID 疑似列が利用されることがある。

> データベース内の各行について、行のアドレスを戻します。

引用元：[ROWID疑似列](https://docs.oracle.com/cd/F19136_01/sqlrf/ROWID-Pseudocolumn.html#GUID-F6E0FBD2-983C-495D-9856-5E113A17FAF1)

### 参考リンク

- ホワイトペーパー
    - 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 は発生しない。

1. Azure SQL Database 連携前に`ROWID`列を追加する方法
2. SSMA のプロジェクト設定値である`Generate ROWID column`を`Yes`の値に設定することで、テーブルに`ROWID`列を保持させる方法
3. 手動で`ROWID`列をテーブルに追加する方法

### 変換例

#### 変換例 1 インデックスと制約を設定しているテーブル

##### Oracle Database のコード

```sql
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 により次のように変換される。

```sql
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 のコード

```sql
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 により次のように変換される。

```sql
CREATE TABLE 
[HR].[TABLE_SAMPLE_003]
(
   [COLUMN1] numeric(10, 0)  NULL
)
ON [SSMA$PS$HR$TABLE_SAMPLE_003] ([COLUMN1])
WITH (DATA_COMPRESSION = NONE)
GO
```