第7章 ガバナンスとセキュリティ / 想定学習時間:30〜40分 / 最終確認:2026年8月

7-1. マネージドテーブルと外部テーブル(作成・変更・削除・相互変換)

🎯 この節の学習目標

1. 2種類のテーブル:誰がデータを管理するか

Unity Catalog(UC)配下のテーブルは、データファイルの管理を誰が担うかによって2種類に分かれます。どちらも「メタデータ(テーブル定義・スキーマ・権限)」は UC が管理しますが、データファイルの置き場所とライフサイクルの扱いが異なります。

両者の最大の違いは DROP TABLE を実行したときの挙動です。マネージドテーブルを DROP するとメタデータとデータの両方が削除されます(一定期間内は UNDROP TABLE で復元できます)。一方、外部テーブルを DROP しても削除されるのはメタデータ(テーブル定義)だけで、ストレージ上のデータファイルはそのまま残ります。

観点マネージドテーブル外部テーブル
データの管理主体Unity Catalog(データ+メタデータ)顧客(データ)/ UC はメタデータのみ
保存場所UC のマネージドストレージロケーション(自動配置)LOCATION で指定した顧客管理のパス
DROP TABLE 時メタデータとデータの両方を削除メタデータのみ削除。データは残る
最適化機能Predictive Optimization の対象(OPTIMIZE / VACUUM を自動実行)対象外。OPTIMIZE / VACUUM は手動運用
推奨度既定の推奨。特別な理由がなければこちら外部ツールからの直接アクセス等、明確な理由がある場合のみ

2. 作成・変更・削除のSQL

作成時に LOCATION 句を付けるかどうかが、2種類のテーブルの分かれ目です。

💡 具体例:マネージドテーブルと外部テーブルの作成

-- マネージドテーブル:LOCATION を指定しない(UC が配置先を決める)
CREATE TABLE main.sales.orders (
  order_id   BIGINT,
  customer_id BIGINT,
  amount     DECIMAL(10,2),
  order_date DATE
);

-- 外部テーブル:LOCATION で顧客管理ストレージのパスを指定する
-- (事前にそのパスをカバーする外部ロケーションと
--  ストレージ資格情報が UC に登録されている必要がある)
CREATE TABLE main.sales.orders_ext (
  order_id   BIGINT,
  customer_id BIGINT,
  amount     DECIMAL(10,2),
  order_date DATE
)
LOCATION 's3://my-company-bucket/sales/orders_ext';

テーブルがどちらの種類かは DESCRIBE EXTENDED main.sales.ordersType 欄(MANAGED / EXTERNAL)で確認できます。

変更(ALTER)と削除(DROP)の構文自体は両者で共通です。挙動が変わるのは DROP のときだけです。

-- 列の追加・コメント・プロパティ変更(両タイプ共通)
ALTER TABLE main.sales.orders ADD COLUMN region STRING;
ALTER TABLE main.sales.orders SET TBLPROPERTIES ('delta.enableChangeDataFeed' = 'true');
ALTER TABLE main.sales.orders RENAME TO main.sales.orders_v2;

-- 削除
DROP TABLE main.sales.orders_v2;   -- マネージド:データも削除(UNDROP で一定期間復元可)
DROP TABLE main.sales.orders_ext;  -- 外部:定義のみ削除。s3://... のファイルは残る

📝 試験のポイント

「外部テーブルを DROP した。ストレージ上のデータはどうなるか?」→ 残る、「マネージドテーブルを DROP したら?」→ データも削除される、という対比は確実に押さえてください。また、外部テーブルの DROP 後にストレージへ残ったファイルは UC の管理外になるため、不要であればクラウドストレージ側で別途削除する必要があります。逆に「テーブル定義を消してもデータを残したい」という要件では外部テーブルの性質が利点になります。

3. 相互変換:ALTER TABLE ... SET MANAGED

既存のテーブルを「外部→マネージド」に切り替えたい場合、現在の Databricks では ALTER TABLE <table> SET MANAGED が正式にサポートされており、これが推奨の方法です。テーブル名・設定・権限・ビュー・テーブル履歴をそのまま保持したまま種類だけを変換でき、変換中の同時読み書きにも対応しています。逆方向(マネージド→外部)には ALTER TABLE <table> SET EXTERNAL があります。なお ALTER TABLE ... SET LOCATION は外部テーブルが参照するパスを付け替えるための操作であり、テーブルの種類を変換するものではない点に注意してください。

💡 具体例:SET MANAGED による変換

-- 外部テーブルをマネージドテーブルに変換する(推奨)
-- テーブル名・権限・ビュー・履歴はそのまま保持される
ALTER TABLE main.sales.orders_ext SET MANAGED;

-- 逆方向:マネージドテーブルを外部テーブルに変換する
ALTER TABLE main.sales.orders SET EXTERNAL;

変換後もテーブル名は変わらないため、参照しているクエリやビュー、付与済みの権限を修正する必要はありません。

コピーを伴う代替手段として、CTAS(CREATE TABLE AS SELECT)DEEP CLONE で新しいマネージドテーブルを作る方法もあります。ただしこちらは別テーブルへのコピーであるため、テーブル名が変わる(参照の切り替えや RENAME が必要)、テーブル履歴が引き継がれない、といった扱いの違いがあります。列の絞り込み・変換を同時に行いたい場合は CTAS、プロパティなどのメタデータごと複製したい場合は DEEP CLONE、というように「新しいテーブルとして作り直したい」ケースで選びます。

💡 具体例:コピーを伴う代替手段(CTAS / DEEP CLONE)

-- 代替1:CTAS(列の絞り込み・変換を同時に行える。プロパティは引き継がれない)
CREATE TABLE main.sales.orders_managed AS
SELECT * FROM main.sales.orders_ext;

-- 代替2:DEEP CLONE(データに加えプロパティ等のメタデータも複製)
CREATE TABLE main.sales.orders_managed
DEEP CLONE main.sales.orders_ext;

-- 切り替え後、旧テーブルの定義を削除(外部なのでデータは残る)
DROP TABLE main.sales.orders_ext;

いずれもデータのコピーであるため、変換後は参照するテーブル名の切り替え(または RENAME による差し替え)と、旧テーブルの後始末までがワンセットです。テーブル履歴も新テーブルには引き継がれません。単純に種類だけを切り替えたいのであれば、SET MANAGED / SET EXTERNAL を使うのが第一の選択肢です。

4. 使い分けの基準:迷ったらマネージド

使い分けの原則はシンプルです。

マネージドテーブルを推奨する大きな理由が Predictive Optimization(予測最適化)です。これは Unity Catalog のマネージドテーブルに対して、OPTIMIZE(ファイルコンパクション)や VACUUM(不要ファイル削除)などのメンテナンス操作を、利用パターンに基づき Databricks が自動で実行してくれる機能です。外部テーブルはこの対象外のため、最適化ジョブを自前でスケジュールし続ける運用負荷が残ります。ほかにも、マネージドテーブルは UC がファイル配置を完全に把握しているため、ストレージレイアウトの改善やガバナンス機能の恩恵を受けやすいという利点があります。

📝 試験のポイント

シナリオ問題では「外部の可視化ツールが Parquet/Delta ファイルを直接読む必要がある」「既存バケットのデータをそのまま登録したい」といったキーワードが出たら外部テーブル、「メンテナンスを自動化したい」「特に外部アクセス要件はない」なら Predictive Optimization が効くマネージドテーブル、と判断します。

✅ この節のまとめ

練習問題

問1. Unity Catalog の外部テーブルに対して DROP TABLE を実行した。このときの挙動として正しいものはどれか。

  1. テーブル定義とストレージ上のデータファイルの両方が削除される
  2. テーブル定義(メタデータ)のみが削除され、ストレージ上のデータファイルは残る
  3. データファイルのみが削除され、テーブル定義は残る
  4. 外部テーブルは DROP TABLE を実行できず、エラーになる
解答と解説を見る

正解:B

外部テーブルではデータファイルのライフサイクルは顧客側の管理であり、DROP TABLE が削除するのは UC 上のメタデータだけです。Aはマネージドテーブルの挙動です。Cのような「定義だけ残ってデータが消える」挙動はありません。Dも誤りで、外部テーブルも通常どおり DROP できます。

問2. 次の SQL で作成されるテーブルの説明として正しいものはどれか。
CREATE TABLE main.iot.sensor_raw (id BIGINT, v DOUBLE) LOCATION 's3://corp-lake/iot/sensor_raw';

  1. マネージドテーブルが作成され、データは UC のマネージドストレージに置かれる
  2. 外部テーブルが作成され、DROP 時にはデータも自動削除される
  3. 外部テーブルが作成され、データは指定した顧客管理のパスに置かれ、DROP してもデータは残る
  4. LOCATION 句は Unity Catalog では使用できないため、エラーになる
解答と解説を見る

正解:C

LOCATION 句を指定して作成したテーブルは外部テーブルです。データは指定パスに置かれ、DROP TABLE で削除されるのはメタデータのみです。Aは LOCATION なしで作成した場合の説明、Bは DROP 時の挙動が誤り(データは残る)です。Dも誤りで、UC でも外部ロケーションを事前設定したうえで LOCATION 句を使えます。

問3. 既存の外部テーブルを、テーブル名・権限・テーブル履歴を保持したままマネージドテーブルへ移行したい。最も適切な方法はどれか。

  1. ALTER TABLE <table> SET MANAGED を実行して種類を変換する
  2. CREATE TABLE ... AS SELECT(CTAS)で LOCATION を指定しない新テーブルを作成し、参照を切り替えたうえで旧テーブルを DROP する
  3. 外部テーブルを DROP すればデータが自動的にマネージドストレージへ移動する
  4. ALTER TABLE ... SET LOCATION でマネージドストレージのパスを指定する
解答と解説を見る

正解:A

現在の Databricks では ALTER TABLE ... SET MANAGED が正式サポートされており、テーブル名・設定・権限・ビュー・履歴を保持したまま外部テーブルをマネージドテーブルへ変換できます(逆方向は SET EXTERNAL)。Bの CTAS はコピーを伴う代替手段として有効ですが、別テーブルへのコピーになるため名前が変わり、履歴も引き継がれず、「名前・権限・履歴を保持したまま」という要件を満たしません。Cは誤りで、DROP は定義を消すだけでデータ移動は起きません。Dの SET LOCATION は外部テーブルの参照パスを付け替える操作であり、マネージドテーブルへの変換にはなりません。

問4. あるデータエンジニアリングチームが新しいテーブル群の設計をしている。「Databricks 以外のシステムからファイルを直接読む要件はなく、OPTIMIZE や VACUUM の運用負荷はできるだけ減らしたい」。最も適切な選択はどれか。

  1. 外部テーブルにする。外部テーブルのみが Predictive Optimization の対象だから
  2. マネージドテーブルにする。Predictive Optimization によりメンテナンスが自動化されるから
  3. 外部テーブルにする。マネージドテーブルは OPTIMIZE を実行できないから
  4. どちらでも違いはない。最適化機能は両者に同じように適用されるから
解答と解説を見る

正解:B

外部からの直接アクセス要件がない以上、既定の推奨であるマネージドテーブルを選びます。Predictive Optimization は UC のマネージドテーブルを対象に OPTIMIZE / VACUUM 等を自動実行するため、運用負荷の削減という要件にも合致します。AとDは Predictive Optimization の対象の理解が誤りです。Cも誤りで、マネージドテーブルでも OPTIMIZE は実行できます(むしろ自動化までされます)。