【Databricks】UNDROP TABLEについて試してみた

# 背景・目的
[Unity Catalog support for UNDROP TABLE is GA](https://docs.databricks.com/en/release-notes/product/2023/october.html#unity-catalog-support-for-undrop-table-is-ga)にあるように、GAが発表されましたが、そもそも、このような機能を知りませんでした。このタイミングで簡単に試してみます。

# まとめ
- Unity Catalog内のマネージドテーブルと外部テーブルを対象にリカバリが可能
- 対象期間は7日間
- メタ情報も戻せるが、権限は戻せない。

# 概要
## UNDROP TABLE
Databricksのドキュメントにある [UNDROP TABLE](https://docs.databricks.com/en/sql/language-manual/sql-ref-syntax-ddl-undrop-table.html#undrop-table) を元に整理します。

>UNDROP コマンドは、 Unity Catalog にあるマネージ テーブルまたは外部テーブルが誤って削除または削除されるという問題に対処します。 デフォルトでは、このコマンドは、指定されたテーブル名のユーザーが所有する最後にドロップされたテーブルをアンドロップ (リカバリ) します。 親スキーマとカタログが存在する必要があります。 この機能は、7 日間の保持期間内に削除されたテーブルを回復することをサポートします。

- 対象は、Unity Catalog内のマネージドテーブルと外部テーブル
- 対象期間は、7日間
- 親のスキーマとカタログがあること

> 同じ名前のドロップされたテーブルが複数ある場合は、 SHOW TABLES DROP を使用してテーブル ID を識別し、 UNDROP TABLE WITH ID を使用して特定のテーブルを復旧できます。

- SHOW TABLES DROPで、テーブルIDが確認できる

> リカバリするテーブルと同じ名前のテーブルがある場合は、 ALTER TABLE RENAME TO コマンドを使用して既存のテーブルの名前を変更します。

> テーブル権限、列仕様、プロパティなどのテーブルメタデータがリカバリされます。 主キー制約と外部キー制約は、 UNDROP コマンドでは回復されません。 表がリカバリーされた後、 ALTER TABLE ADD CONSTRAINT を使用して手動で再作成します。

- テーブルのメタデータもリカバリされる
- **権限（主キー制約と外部キー制約）はリカバリされないので注意が必要**

## 構文
下記のクエリを実行します。
```
UNDROP TABLE { table_name | WITH ID table_id }
```

# 実践
[こちら](https://docs.databricks.com/en/sql/language-manual/sql-ref-syntax-ddl-undrop-table.html#examples)のドキュメントを元に試してみます。

## 前提
### カタログとスキーマの作成
事前に、カタログとスキーマを作成します。

1. カタログを作成します。
    ```
    CREATE CATALOG my_catalog
    
    SHOW CATALOGS
    ```

    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/df5ff8cd-ddfe-3647-d366-df44d83299d9.png" width=200>


1. スキーマを作成します。
    ```
    CREATE SCHEMA my_catalog.my_schema
    
    SHOW SCHEMAS IN my_catalog
    ```

    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/51e6c46b-f210-ddc9-540c-ff5dd77b6332.png" width=200>

## UNDROP using the table name
1. テーブルを作成します。作成されました。
    ```
    CREATE TABLE my_catalog.my_schema.my_table (id INT, name STRING);
    SHOW TABLES IN my_catalog.my_schema
    ```

    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e553c3ac-f36c-5f9a-b77e-6168493e718a.png" width=500>

1. テーブルを削除します。削除されました。
    ```
    DROP TABLE my_catalog.my_schema.my_table
    SHOW TABLES IN my_catalog.my_schema
    ```

    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c75c2d85-c018-8001-0e21-6e020a2e1d67.png" width=400>


1. リカバリします。(UNDROPします。)戻りました。
    ```
    UNDROP TABLE my_catalog.my_schema.my_table;
    SHOW TABLES IN my_catalog.my_schema
    ```
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e553c3ac-f36c-5f9a-b77e-6168493e718a.png" width=500>


## UNDROP WITH ID
1. テーブルを削除します。消えました。
    ```
    DROP TABLE my_catalog.my_schema.my_table
    SHOW TABLES IN my_catalog.my_schema
    ```
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c75c2d85-c018-8001-0e21-6e020a2e1d67.png" width=400>

1. 削除済みのテーブルを確認します。tableidをメモします。
    ```
    SHOW TABLES DROPPED IN my_catalog.my_schema;
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/284c72c0-ff62-d60f-382d-a560e1a76ec6.png)

1. 下記のクエリを実行し、リカバリします。戻りました。
    ```
    UNDROP TABLE WITH ID '{tableid}'
    SHOW TABLES IN my_catalog.my_schema
    ```
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e553c3ac-f36c-5f9a-b77e-6168493e718a.png" width=500>


# 考察
UNDROPテーブルにより、誤って削除したテーブルが戻せることを試しました。

# 参考
https://docs.databricks.com/ja/sql/language-manual/sql-ref-syntax-ddl-undrop-table.html

https://docs.databricks.com/en/release-notes/product/2023/october.html#unity-catalog-support-for-undrop-table-is-ga

https://docs.databricks.com/ja/sql/language-manual/sql-ref-syntax-aux-show-tables-dropped.html