Databricks Unity Catalog のテーブルを再度 Delta Clone した際の権限等のメタデータの保持に関する検証結果

## 概要

Databricks にはテーブルを複製する方法として Delta Clone という機能があり、同一テーブルに対して再度 Delta Clone することで増分連携ができるとも可能なのですが、テーブルへの権限付与等の情報が保持されるかが気になったため検証してみました。下記表に示す項目を検証してみましたが、Unity Catalog に保持される項目については Delta Clone を再度実行しても保持されるようです。〇 が保持されたこと、× が喪失したたことを示しています。本記事では、検証コードと結果を共有します。


| ＃   | 項目               | Shallow CLONE の場合 | Deep CLONE の場合 |
| ---- | ------------------ | -------------------- | ----------------- |
| 1    | テーブルオーナー   | 〇                   | 〇                |
| 2    | 権限               | 〇                   | 〇                |
| 3    | テーブルコメント   | 〇                   | 〇                |
| 4    | カラムコメント | ×                    | ×                 |
| 5    | テーブルタグ     | 〇                   | 〇                |
| 6    | カラムタグ         | 〇                   | 〇                |

Shallow CLONE のユースケースとして複製元のテーブルと独立したアクセス制御管理があり、スキーマレベルで権限管理を行いたい場合にデータ提供がとても楽になります。本記事での検証結果から権限が再 Clone したとしても存続することが確認できたため、安心してそのユースケースを実施できることがわかりました。

> 親テーブルから独立したアクセス制御特権を持つテーブルを作成できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/bb4317e3-9a1d-3ac1-942e-f741fde9465e.png)

引用元：[Unity Catalog テーブルのシャロー クローン - Azure Databricks | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/databricks/delta/clone-unity-catalog)

## 検証コードと結果

### テーブルの準備

```python
%sql
CREATE CATALOG IF NOT EXISTS clone_test_001;
CREATE SCHEMA IF NOT EXISTS clone_test_001.schema_01;

-- Delta Clone 元テーブルの作成
CREATE OR REPLACE TABLE clone_test_001.schema_01.base_table
AS
SELECT
  *
FROM
  samples.tpch.nation
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e6914766-37b5-8942-c5b2-64fb5c6cd9f0.png)

### Shallow Clone の検証

#### 最初の Shallow Clone の実施

```python
%sql
-- テーブルを削除（初期化）してから、Delta Clone
DROP TABLE IF EXISTS clone_test_001.schema_01.shallow_clon_table
;
CREATE OR REPLACE TABLE clone_test_001.schema_01.shallow_clon_table
 SHALLOW CLONE clone_test_001.schema_01.base_table
;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/05db9e6b-6aae-f4aa-189d-ee55c8af6dc9.png)

#### 存続確認したい項目の設定

```python
%sql
-- テーブルコメント
COMMENT ON TABLE clone_test_001.schema_01.shallow_clon_table
   IS 'テーブルコメントですよ';

-- カラムコメント
ALTER TABLE clone_test_001.schema_01.shallow_clon_table
  CHANGE n_nationkey n_nationkey bigint
  COMMENT 'カラムコメントですよ';

-- テーブルオーナー
ALTER TABLE clone_test_001.schema_01.shallow_clon_table
  OWNER TO `account users`;

-- 権限
GRANT SELECT
  ON TABLE clone_test_001.schema_01.shallow_clon_table
  TO `account users`;

-- テーブルタグ
ALTER TABLE clone_test_001.schema_01.shallow_clon_table
SET
  TAGS ('test' = 'テスト');

-- カラムタグ
-- 手動で設定
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0449c0c7-d668-3cd1-3b08-e4e97cd68be0.png)

カラムタグについては、カタログエクスプローラーにて手動でタグを設定。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8441339a-3ce2-d4d0-ade5-021f786c9139.png)

#### 設定値の確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/89f286a1-4167-0b9e-27c4-cf959fc96955.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ed7060c0-5ead-aed4-57ea-9ca853282406.png)

#### Shallow Clone の再実行

```python
%sql
CREATE OR REPLACE TABLE clone_test_001.schema_01.shallow_clon_table
  SHALLOW CLONE clone_test_001.schema_01.base_table
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d17cd665-a9ef-0c90-b51a-986c07707de1.png)

#### 設定値の再確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ad307c0b-3b70-32f8-6795-8d093cf68ac1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0ea360f2-d1e4-a7be-b43e-3cd04889b6fa.png)

### DEEP Clone の検証

#### 最初の Deep Clone の実施

```python
%sql
DROP TABLE IF EXISTS clone_test_001.schema_01.deep_clone_table
;
CREATE OR REPLACE TABLE clone_test_001.schema_01.deep_clone_table
 DEEP CLONE clone_test_001.schema_01.base_table
;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5de8efbf-6f8e-b48a-c9b7-965b6661ef1a.png)

### 存続確認したい項目の設定

```python
%sql
-- テーブルコメント
COMMENT ON TABLE clone_test_001.schema_01.deep_clone_table
   IS 'テーブルコメントですよ';

-- カラムコメント
ALTER TABLE clone_test_001.schema_01.deep_clone_table
  CHANGE n_nationkey n_nationkey bigint
  COMMENT 'カラムコメントですよ';

-- テーブルオーナー
ALTER TABLE clone_test_001.schema_01.deep_clone_table
  OWNER TO `account users`;

-- 権限
GRANT SELECT
  ON TABLE clone_test_001.schema_01.deep_clone_table
  TO `account users`;

-- テーブルタグ
ALTER TABLE clone_test_001.schema_01.deep_clone_table
SET
  TAGS ('test' = 'テスト');

-- カラムタグ
-- 手動で設定
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/76ba4f66-2485-64b4-0f7c-62c4c3df2f47.png)


カラムタグについては、カタログエクスプローラーにて手動でタグを設定。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a586cb92-3ece-587b-3738-755c61d5f067.png)

#### 設定値の確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/2e5d30f9-dda4-3f7f-3ba7-b2c82e425cda.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/fba13add-ea5c-0faa-a497-f2c0cf8e2284.png)

#### Deep Clone の再実行

```python
%sql
CREATE OR REPLACE TABLE clone_test_001.schema_01.deep_clone_table
  DEEP CLONE clone_test_001.schema_01.base_table
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8fe70177-3703-8bc3-b8eb-b459d600ac88.png)

#### 設定値の再確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/dec082bf-713c-cf7d-668c-db96d1324f06.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5a75ce8a-11f3-77c8-44eb-8e35a7370ceb.png)

### リソースの削除

```python
%sql
DROP CATALOG IF EXISTS clone_test_001 CASCADE;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/28c38d59-2838-6ece-f1fd-56b3bccf6595.png)