# 論理ビュー

論理ビューは、SQLクエリによって定義される仮想テーブルです。物理テーブルとは異なり、論理ビューはデータを保存しません。代わりに、ビューがクエリされるたびに、基盤となるテーブルから動的に結果を計算します。

論理ビューは現在、Trinoのみで利用可能です。Hiveのサポートは将来のリリースで予定されています。

## メリットとユースケース

論理ビューは、以下のような主要なメリットを提供します。

- **クエリの再利用性**: 複雑なクエリを一度定義し、複数の分析で再利用できます
- **変更の増幅の削減**: 複数のクエリを修正する代わりに、データ変換を1か所で更新できます
- **仮想データマート**: データを複製せずに論理的なデータ構造を作成できます
- **BIツールの互換性**: Treasure Dataのネイティブ型をBIツール互換の型（例：timestamp）に変換できます


### 一般的なユースケース

**BIツールのタイムスタンプ互換性**: PlazmaDBテーブルは、タイムスタンプをUnix時間（整数）または文字列として保存します。タイムスタンプ列を持つ論理ビューを作成することで、BIツールがカスタム計算なしで直接タイムスタンプフィールドを使用できるようになります。

**イベントログの変換**: イベントログ（Engage StudioからのEmail Open/Bounce/Clickイベントなど）を、顧客またはメールアドレスごとの集計メトリクスに変換し、分析を容易にします。

**複雑なクエリの簡素化**: 共通のフィルタリング、集計、または結合ロジックをビューにカプセル化し、データアナリストが直接クエリできるようにします。

**データマスキングとセキュリティ**: DEFINERモードを使用して、ユーザーに直接のテーブルアクセスを許可せずに、特定の列またはフィルタリングされた行への制御されたアクセスを提供します。

## 論理ビューの作成

論理ビューは、Data WorkbenchクエリエディタでSQL CREATE VIEWステートメントを使用して作成します。

### Trino SQLを使用する


```sql
CREATE VIEW view_name AS
SELECT column1, column2
FROM table_name
WHERE condition;

-- セキュリティモードを指定する場合
CREATE VIEW view_name
SECURITY DEFINER  -- または INVOKER
AS
SELECT * FROM table_name;
```

詳細については、以下を参照してください: [Trino create view構文](https://trino.io/docs/423/sql/create-view.html)

### 例

列をフィルタリングするビューを作成:


```sql
CREATE VIEW region_without_comment AS
SELECT r_regionkey, r_name, r_dummy, time
FROM tpch_sf1.region;
```

タイムスタンプ変換を含むビューを作成:


```sql
CREATE VIEW orders_with_timestamp AS
SELECT
  order_id,
  customer_id,
  FROM_UNIXTIME(order_time) AS order_timestamp,
  amount
FROM orders;
```

論理ビューのクエリは、SQLステートメントを使用してのみ作成および更新できます。ただし、ビューの詳細（名前、説明、セキュリティモード）はData Workbench UIで編集できます。

## 論理ビューの表示とクエリ

### 論理ビューのリスト表示

UIでは、**Data Workbench** > **Databases**に移動し、データベースを選択します。論理ビューは、**view**タイプインジケーターとともにテーブルリストに表示されます。

![テーブルリストの論理ビュー](/assets/logical-view-table-list.785cdfb96192c886ccf89a6ed90780e00d722da802c5fc0d82d4ceabe87acdb0.4c190181.png)

SQLを使用する場合:


```sql
SELECT * FROM INFORMATION_SCHEMA.VIEWS;
```

### 論理ビューのクエリ

Trinoを使用して、通常のテーブルと同じように論理ビューをクエリできます:


```sql
SELECT * FROM region_without_comment WHERE r_name = 'ASIA';

SELECT * FROM customer_summary WHERE total_orders > 10;
```

### ビューの詳細

ビュー詳細ページには、以下が表示されます:

- **Details**: 名前、説明、最終更新日、セキュリティモード、オーナー、作成日、データベース
- **Records**: プレビューデータ（**Update Preview**を選択すると最大40件のサンプルレコードを取得）
- **Schema**: 列定義とクエリテキスト。ビューのスキーマで使用されるデータ型はテーブルとは異なることに注意してください。テーブルでは[TDネイティブデータ型](/ja/products/customer-data-platform/data-workbench/databases/td-native-data-types)が使用されます。ビューでは、クエリエンジンのデータ型が使用されます（例: Trinoの場合は[Trinoデータ型](https://trino.io/docs/423/language/types.html)）。
- **Dependencies**: このビューによって参照されるテーブルとビュー


![論理ビュー詳細ページ](/assets/logical-view-details.c4dadffa2a5456e8a28bb8f1661b99f4b1036f34e6ccfb8273229f65ac6a42f6.4c190181.png)

**Records**タブでは、ビューのデータをプレビューできます。**Update Preview**を選択すると、最大40件のサンプルレコードを取得できます:

![論理ビューのプレビュー](/assets/logical-view-preview.feb7fee1a60d573f253800cd9156232a781548cf894c373aa3699c2bfb6cc39f.4c190181.png)

## 論理ビューの管理

### ビュー定義の更新

ビュー定義を更新するには、CREATE OR REPLACE VIEWステートメントを使用します:


```sql
CREATE OR REPLACE VIEW view_name AS
SELECT new_column1, new_column2
FROM table_name
WHERE new_condition;
```

CREATE OR REPLACE VIEWを使用すると、ビュー定義は新しいクエリで完全に置き換えられます。以前のすべての列とロジックは削除されます。

### セキュリティモードの更新

セキュリティモードは、UIまたはSQLを使用して変更できます。

**UIを使用する場合:**

1. ビュー詳細ページに移動します
2. メニュー（⋯）を選択し、**詳細を編集**を選択します
3. **論理ビューの詳細を編集**ダイアログで:
  - **セキュリティモード**で**Definer**または**Invoker**を選択します
  - オプションで**名前**または**説明**を更新します
4. **確認**を選択します


![論理ビューの詳細を編集ダイアログ](/assets/logical-view-edit-details-dialog.e55c3c71ef4577f32e40badcd4c2eb9904ce516dcade6a1ff89fe06a9b57e635.4c190181.png)

**SQLを使用する場合:**

セキュリティモードをSQLで変更するには、新しいセキュリティモード指定でCREATE OR REPLACE VIEWを使用します:


```sql
-- INVOKERモードに変更
CREATE OR REPLACE VIEW view_name
SECURITY INVOKER
AS
SELECT * FROM table_name;

-- DEFINERモードに変更
CREATE OR REPLACE VIEW view_name
SECURITY DEFINER
AS
SELECT * FROM table_name;
```

CREATE OR REPLACE VIEWを使用する場合、完全なクエリ定義を再指定する必要があります。

### 論理ビューの削除

論理ビューを削除するには、DROP VIEWステートメントを使用します:


```sql
DROP VIEW view_name;
```

ビューを削除しても、基盤となるテーブルは削除されません。他のビューがこのビューを参照している場合、それらのビューはクエリ時に失敗します。

### ビューのオーナーシップの委譲

ビューのオーナーは、DEFINERセキュリティモードを使用する場合に重要です。クエリはオーナーの権限で実行されるためです。

現在、オーナーシップはAPIを介してのみ変更できます。対象ユーザーは、データベースに対するFull Accessパーミッションを持っている必要があります。

ビューのオーナーが削除され、ビューがDEFINERモードを使用している場合、ビューは機能しなくなります。

## パーミッション

論理ビューは、データベースからパーミッションを継承します。データベースのパーミッションレベルに基づいて、以下の操作が許可されます。

| データベースパーミッション | リスト/表示 | 作成 | 更新 | 削除 | クエリ |
|  --- | --- | --- | --- | --- | --- |
| Full Access | ✓ | ✓ | ✓ | ✓ | ✓ |
| Manage Own | ✓ | ✓ | ✓ | ✓ | ✓ |
| General Access | ✓ | ✓ | ✓ | ✓ | ✓ |
| Query-only | ✓ | ✗ | ✗ | ✗ | ✓ |
| Import-only | ✓ | ✗ | ✗ | ✗ | ✗ |
| None | ✗ | ✗ | ✗ | ✗ | ✗ |


### セキュリティモードとパーミッション

[セキュリティモード](/ja/products/customer-data-platform/data-workbench/databases/logical-view-security-modes)は、参照されるテーブルへのアクセスに使用される権限を決定します。

- **DEFINERモード**（デフォルト）: ビューオーナーの権限を使用します
  - クエリ実行者は基盤となるテーブルへの権限が不要です
  - 機密データへの制御されたアクセスを提供するのに便利です
- **INVOKERモード**: クエリ実行者の権限を使用します
  - クエリ実行者はすべての基盤となるテーブルへの権限が必要です
  - ユーザーレベルの権限を強制します


詳細については、[論理ビューのセキュリティモード](/ja/products/customer-data-platform/data-workbench/databases/logical-view-security-modes)を参照してください。

## 制限事項

### 容量制限

- データベースあたり最大50の論理ビュー
- 論理ビューあたり最大1,024列
- ビュー定義クエリステートメントの最大サイズは256 KB
- ネストされた論理ビューの最大レベルは10


### 機能制限

- **読み取り専用**: DML操作（INSERT、UPDATE、DELETE）はサポートされていません
- **Trinoのみ**: 現在Trinoのみがサポートされています。Hiveのサポートは将来のリリースで予定されています
- **クロスアカウントクエリなし**: Data Clean Roomで他のアカウントのテーブルを参照するためにビューを使用することはできません
- **Parent Segment統合なし**: 論理ビューはParent Segmentのマスターテーブルまたは属性テーブルとして使用できません（将来のリリースでサポート予定）
- **列レベルタグなし**: ビュー列にデータ分類のタグを付けることはできません
- **作成時にスキーマを保存**: ビュー作成後に基盤となるテーブルの列が変更されても、ビューのスキーマは自動的に更新されません


### 列パーミッションの制限

ユーザーが`except: false`の列パーミッション（タグ付けされていない列を表示できない）を持っている場合、セキュリティモードに関係なく、クエリで論理ビューを使用できません。

### ライフサイクルの独立性

ビューとその参照テーブルのライフサイクルは独立しています:

- 参照テーブルはいつでも削除できます
- 参照テーブルが削除された場合、ビューに対するクエリは失敗します
- ビュークエリは、作成時にクエリエンジンによって検証されます


## クエリエンジンの互換性

- 現在、論理ビューはTrinoのみでサポートされています
- Hiveのサポートは将来のリリースで予定されています
- ビュー名はデータベース内で一意である必要があります
- クエリエンジンのバージョンがアップグレードされると、SQL構文が変更される場合があります。互換性のないSQL構文が使用されている場合、古いクエリエンジンバージョンで定義されたビューは新しいクエリエンジンバージョンで動作しない可能性があります。その場合、ビュー定義を最新のSQL構文で更新する必要があります。


## ベストプラクティス

- **わかりやすい名前を使用**: ビューの目的を明確に説明する名前を選択します
- **デプロイ前にテスト**: ビューをクエリして、期待される結果が返されることを検証します
- **パフォーマンスを考慮**: 複数の結合を含む複雑なビューは、クエリのパフォーマンスに影響を与える可能性があります
- **ネストの深さに注意**: ビューのネストを妥当なレベルに保ちます（制限は10レベル）
- **制御されたアクセスにはDEFINERモードを使用**: テーブルアクセスを付与せずに、Query-onlyユーザーが変換されたデータにアクセスできるようにします
- **依存関係を監視**: テーブルを削除する前に、どのビューがそれらを参照しているかを確認します