[Autonomous Database]Flashback Tableを試す

# はじめに
Autonomous Database（ADB）でもOracle Databaseの機能である**Flashback**機能が利用できるため、試してみました。

* ADBで制限されているFlashback機能は以下です。

|Oracle Flashbackの機能|機能の概要|ADBでのサポート|
|:--|:--|:--|
|DBMS_FLASHBACK|フラッシュバック・モードの有効/無効を設定するパッケージ|可(ただし、次のプロシージャは除きます)：DBMS_FLASHBACK.TRANSACTION_BACKOUT|
|フラッシュバック・データ・アーカイブ（Flashback Data Archive）|表に対する全てのトランザクションによる変更を追跡および格納|不可|
|フラッシュバック・ドロップ（Flashback Drop）|削除した表を元に戻す|可|
|フラッシュバック問合せ（Flashback Query）|指定時点のデータを表示|可|
|フラッシュバック表（Flashback Table）|表のデータを過去の時点に戻す|可|
|フラッシュバック・トランザクション（Flashback Transaction）|トランザクション単位で変更を戻す|不可|
|フラッシュバック・トランザクション問合せ（Flashback Transaction Query）|トランザクションの変更を戻すためのSQL文を表示|可|
|フラッシュバック・バージョン問合せ（Flashback Version Query）|指定された2点間での全ての変更データを表示|可|

※参考：[データベース機能の制限事項](https://docs.oracle.com/cd/E83857_01/paas/autonomous-database/adbsa/appendix-restrictions-database-features.html#GUID-CEE36DC8-E878-481C-8366-9507D0911C25)、19c：[DBMS_FLASHBACK](https://docs.oracle.com/cd/F19136_01/arpls/DBMS_FLASHBACK.html#GUID-49A5AA6B-428D-45D3-955F-F30DB8DF19A3)、[Oracle Flashback](https://docs.oracle.com/cd/E83857_01/paas/autonomous-database/adbsa/autonomous-oracle-flashback.html#GUID-CEE36DC8-E878-481C-8366-9507D0911C25)

* Flashback databaseはユーザーが明示的に利用できませんが、リストアに内部的に利用されるようです
>Autonomous Database でFlashback機能は利用できますか？
Flashback databaseはリストアの際に内部的に利用されていますが、ユーザーが明示的に利用することはできません。 その他のFlashback query, table, drop機能は通常のOracle Databaseと同様に利用可能です。

出典：[Autonomous Database 技術FAQ](https://oracle-japan.github.io/ocidocs/faq/services/autonomous/autonomous-database-faq/)

* 初期化パラメータ```UNDO_RETENTION```（UNDO保存の下限値）は、ADBではデフォルト```900秒（15分）```のようです（ADBでは値の**変更不可**）。

|ADB|UNDO_RETENTIONのデフォルト値|
|:--|:--|
|ADW|900（15分）|
|ATP|900（15分）|

※参考：[UNDO_RETENTION](https://docs.oracle.com/cd/F19136_01/refrn/UNDO_RETENTION.html)、[変更可能な初期化パラメータのリスト](https://docs.oracle.com/cd/E83857_01/paas/autonomous-database/adbsa/autonomous-initialization-parameters.html#GUID-7CF648C1-0822-4602-8ED1-6F5719D6779E)

* それでは、今回は、**Flashback Table**文を使用し、表を過去の時点にもどします

# 前提
テスト用ユーザ（今回はSCOTT）を作成済み

# 検証手順
## 1. テストデータの作成
テスト表とテストデータを作成
```sql
create table emp(empno number(10) UNIQUE, empname varchar2(10));
insert into emp(empno,empname) values(100,'TANAKA');
insert into emp(empno,empname) values(200,'SAITO');
insert into emp(empno,empname) values(300,'YOSHIDA');
commit;
```
テストデータを確認
```sql
select * from emp;
```
```sql
   EMPNO    EMPNAME 
________ __________ 
     100 TANAKA     
     200 SAITO      
     300 YOSHIDA    
```

## 2. 行の移動を有効化
テスト表の確認（行の移動が無効）
```sql
select TABLE_NAME,ROW_MOVEMENT from user_tables where TABLE_NAME='EMP';
```
```sql
  TABLE_NAME    ROW_MOVEMENT 
_____________ _______________ 
EMP           DISABLED        
```

今回は、```TO BEFORE DROP```を使用せずに表をフラッシュバックするので、行の移動を有効にする。

|TO BEFORE DROP|備考|
|:--|:--|
|削除された表およびすべての依存するオブジェクトをゴミ箱から取り出すことが可能|TO BEFORE DROPを使用せずに表をフラッシュバックする場合は、フラッシュバック・リスト内の全ての表で、"行の移動" を有効化にする必要がある|

```sql
ALTER TABLE emp ENABLE ROW MOVEMENT;
```

テスト表の確認（行の移動が有効）
```sql
select TABLE_NAME,ROW_MOVEMENT from user_tables where TABLE_NAME='EMP';
```
```sql
  TABLE_NAME    ROW_MOVEMENT 
_____________ _______________ 
EMP           ENABLED        
```

## 3. テストを変更
変更前
```sql
select * from emp;
```
```sql
   EMPNO    EMPNAME 
________ __________ 
     100 TANAKA     
     200 SAITO      
     300 YOSHIDA  
```
変更（社員番号300の社員名を「**YOSHIDA**」→「**ASAKURA**」に変更）
```sql
update emp set empname='ASAKURA' where empno=300;
commit;
```
編集後（「**ASAKURA**」に変更されている）
```sql
select * from emp;
```
```sql
   EMPNO    EMPNAME 
________ __________ 
     100 TANAKA     
     200 SAITO      
     300 ASAKURA ★
```

## 4. Flasback Tableで過去のデータに戻す
5分前のデータに戻す
```sql
FLASHBACK TABLE emp TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '5' minute);
```

テストデータを確認（社員番号300の社員名が「**ASAKURA**」→「**YOSHIDA**」に戻っている）
```sql
select * from emp;
```
```sql
   EMPNO    EMPNAME 
________ __________ 
     100 TANAKA     
     200 SAITO      
     300 YOSHIDA    
```

# 参考
* 19cのSQL言語リファレンス
    * [FLASHBACK TABLE](https://docs.oracle.com/cd/F19136_01/sqlrf/FLASHBACK-TABLE.html#GUID-FA9AF2FD-2DAD-4387-9E62-14AFC26EA85C)
* 19c：バックアップおよびリカバリ・ユーザーズ・ガイド
    * [1.4 Oracleフラッシュバック技術について](https://docs.oracle.com/cd/F19136_01/bradv/introduction-backup-recovery.html#GUID-993ACA58-F6BA-4FBF-85D0-ED63D522551E)